كيفية التقاط إخراج `diff` بشكل صحيح في المخزن المؤقت (دون فتح الملف الأول)؟

ملخص

إذا كان أحد يلتقط إخراج diff إلى اسم ملف = *. diff ويفتح هذا الملف في مخزن مؤقت ، فيحصل أحدهما على تنسيق جيد = Diff . كيفية الحصول على ذلك مباشرة ، دون التقاط لأول مرة إلى ملف؟

تفاصيل

أستخدم diff الكثير ، ليس فقط عبر ediff-buffers (التي أحبها) ولكن أيضًا لأغراض أكثر غموضًا ، مثل diff ing output of العمليات. كما أنني أستخدم Emacs لعدة عقود ، لكنني مستمر في تعلم الجوانب والاستخدامات الجديدة. لذلك لم أكن مندهشًا للغاية لأنني فضلت العثور على ذلك ، عندما فعلت ذلك (من المجلد/المجلد الخاص بـ git repo المحلي)

$ git diff master origin/master > /tmp/foo__local_vs_remote.diff

وفتح الملف في المخزن المؤقت ، عرض في وضع ملون بشكل لطيف/مفيد (وضع لا إرشاد ) = Diff. لم أقم بذلك من قبل في وقت واحد

  1. captured diff output to a file
  2. named the file *.diff
  3. opened the file in Emacs

ولكنني الآن أحاول التقاط إخراج diff مباشرة إلى المخزن و للحصول على إخراج مثل الوضع السعيد = Diff ، وفشله.

تسعى geneneity

Note also that, since I use diff in lots of contexts, I'm looking for a solution to the general problem, and not, e.g., just to the git diff problem (which I suspect Magit etc have solved). تسعى geneneity, I'll test 3 usecases: "normal" file-vs-file diff, git diff, and process-substitution diff.

برنامج

$ lsb_release -ds
LMDE 2 Betsy
$ cat /etc/debian_version
8.3
$ uname -rv
3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29)
$ emacs --version
GNU Emacs 24.4.1

خيارات

قذيفة الأوامر

إذا قمت بما يلي (ربما بعد الانتقال إلى مخزن مؤقت يحتوي على دليل عمل مناسب)

  1. M-!
  2. C-x b *Shell Command Output* (where the output of M-!==M-x قذيفة الأوامر goes by default)
  3. M-x diff-mode

... أحصل على الإخراج منسق بشكل جيد. علاوة على ذلك

  • يعمل هذا مع جميع علب الاختبار الثلاثة
  • إذا تم تشغيل أحد M -! بأمر diff آخر ، فإن الإخراج الجديد سيحل فوق القديم فقط ، لكن المخزن المؤقت يحافظ على diff-mode دون تدخل المستخدم
  • لا توجد تغييرات في رابط المفتاح (كما هو الحال مع وضع المصطلح)

إجابة مختارة.

قذيفة الوضع

إذا كنت أنا أيضا

  1. M-x shell, goto the correct dir/folder, and run git diff master origin/master
  2. am in a buffer on the correct dir/folder, and run M-& git diff master origin/master

أحصل على تحذير: لا يعمل الجهاز بشكل كامل .

الأجل الوضع

نظرًا لأن مستخدم Emacs يشير إلى ، فإن Mx term يؤدي أداءً أفضل في هذا usecase من Mx shell : إذا كنت Mx term ، انتقل إلى dir/المجلد الصحيح ، وقمت بتشغيل git diff main origin/master ، أحصل على إخراج ملون بشكل جيد. انها ليست بالضبط الوضع = فرق ، لكنها تقوم بهذه المهمة. للأسف

  • That only works for git diff: I get no colorization for either process-substitution or file diff.
  • I find the الأجل الوضع keybinding changes highly annoying.
  • I also found الأجل الوضع navigation odd: when editing history, my cursor would sometimes bounce around oddly. solved).
2

2 إجابة

يمكنك دائمًا كتابة وظيفة للقيام بكل الخطوات المتكررة نيابة عنك. هذا يجب عليك ان تبداء:

(defun diff-generic(command)
  (interactive "sDiff command:")
  (let ((buffer (generate-new-buffer "*diff-generic*")))
    (with-current-buffer buffer (diff-mode))
    (call-process-shell-command command nil buffer 0)
    (switch-to-buffer buffer)))

In general you can do M-x diff to get that diff output for two arbitrary files. More info on that here: (info "(emacs) Diff Mode")

يوفر Magit وظائف مختلفة ، ولكن لاحظ أنه يستخدم وضعه الخاص المسمى magit-diff-mode ، والذي يختلف عن emacs العام diff-mode .

Also emacs bundled package VC provides diff functionality for version control diffs. Unlike magit it works with backends other than git and uses diff-mode, also you can use ediff. Relevant manual: (info "(emacs) Old Revisions")

3
وأضاف
لقد قمت بتحديث إجابتي ، وهذا يجب أن يكون ما تريد.
وأضاف المؤلف John Fiala, مصدر
انظر القسم = "تسعى genericity". كيف سيتم التعامل مع هذا ، على سبيل المثال ، استبدال العملية؟
وأضاف المؤلف kraymer, مصدر

محاولة

  1. M-!
  2. C-x b *Shell Command Output* (where the output of M-!==M-x shell-command goes by default)
  3. M-x diff-mode
2
وأضاف
يجب أن يدرك أولئك الذين يقرأون هذه الإجابة أن تحذير: لا يعمل الجهاز بشكل كامل لا يحل بهذا الحل المقبول. قد تعمل هذه الحالة في حالة الاختلاف المحدودة ، ولكن إذا كان أحدها يسعى إلى genericity كما طلب OP ، يرجى استخدام M-x term كحل كامل. انظر وثائق Emacs لأسباب.
وأضاف المؤلف Emacs User, مصدر
راجع أسباب الاختيار في قسم السؤال = shell-command
وأضاف المؤلف kraymer, مصدر