`diff` çıktısını arabelleğe düzgün bir şekilde nasıl aktarabilirim (ilk önce bir dosyayı açmadan)?

özet

Biri diff çıktısını bir dosya adına = * .diff yakalar ve bu dosyayı arabellekte açarsa, biri güzel biçimlendirilmiş mod alır: Diff . İlk önce bir dosyayı yakalamadan doğrudan bu nasıl elde edilir?

ayrıntılar

diff 'ı yalnızca ediff-buffers (çok sevdiğim) üzerinden değil, aynı zamanda daha karanlık amaçlar için de diff çıktıları gibi kullanırım. süreçler. Ayrıca yıllardır Emacs kullanıyorum, ancak yeni yönleri ve kullanımları öğrenmeye devam ediyorum. Bu yüzden, bunu yaparken merak etmekten çok şaşırmamıştım (yerel bir git repo dizininden/klasöründen)

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

ve dosyayı bir arabellekte açtı, güzel/kullanışlı bir şekilde renklendirildi (à la ediff ) modunda = Diff. Daha önce hiç aynı anda yapmadım

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

Ancak şimdi diff çıktısını doğrudan ve arabelleğine yazdırmaya çalışıyorum, mutlu modun çıktısı gibi olsun = Diff ve başarısız oluyorum.

jeneriklik aramak

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). jeneriklik aramak, I'll test 3 usecases: "normal" file-vs-file diff, git diff, and process-substitution diff.

platform

$ 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

seçenekleri

Kabuk-komut

Aşağıdakileri yaparsam (muhtemelen uygun bir çalışma dizinine sahip bir ara belleğe geçtikten sonra)

  1. M-!
  2. C-x b *Shell Command Output* (where the output of M-!==M-x Kabuk-komut goes by default)
  3. M-x diff-mode

... Güzel formatlı çıktılar alıyorum. ayrıca

  • bu, tüm 3 test aracı için işe yarar
  • eğer biri M-! 'i başka bir diff komutuyla çalıştırırsa, yeni çıktı sadece eskinin üzerine yazar ancak arabellek diff-mode değerini korur. kullanıcı müdahalesi olmadan
  • anahtar bağlama değişikliği yok (terim modunda olduğu gibi)

Seçilen cevap

Kabuk mod

Bende

  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

Korkarım ki UYARI: terminal tam olarak çalışmıyor .

terim-modu

Emacs Kullanıcısı'nın işaret ettiği gibi , Mx terimi bu kullanım için 'dan daha iyi performans gösterir. Mx kabuğu : eğer Mx terimi ise, doğru dizine/klasörüne gidersem ve git diff ana kaynak/ana komutunu çalıştırırsam, güzel renklendirilmiş çıktılar elde ederim. Tam olarak değil mod = Diff, ama işi yapıyor. ne yazık ki

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

2 cevap

Sizin için tekrarlanan tüm adımları yapmak için her zaman bir fonksiyon yazabilirsiniz. Bu senin başlamanı sağlamalı:

(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 farklı işlevsellik sağlar, ancak magit-diff-mode adlı kendi modunu kullandığını ve bunun diff-mode genel emaclarından farklı olduğunu unutmayın.

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
katma
Cevabımı güncelledim, istediğin bu olmalı.
katma yazar John Fiala, kaynak
bkz. bölüm = 'jeneriklik aramak'. Bu, örneğin proses ikamesini nasıl ele alacak?
katma yazar kraymer, kaynak

Deneyin

  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
katma
Bu cevabı okuyanlar, UYARI: terminalin tamamen işlevsel olmadığının bu kabul edilmiş çözüm tarafından çözülmediğinin farkında olmalıdır. Bu sınırlı fark vakası için işe yarayabilir, ancak istenen OP olarak jenerikliği arayan ise, lütfen eksiksiz bir çözüm olarak M-x terim kullanın. Sebepler için Emacs belgelerine bakın.
katma yazar Emacs User, kaynak
soru bölümünde seçim nedenlerini görün = shell-command
katma yazar kraymer, kaynak