バッファに `diff`出力を正しくキャプチャするにはどうしたらいいですか?

概要

ファイル名= *。diffdiff の出力をキャプチャしてそのファイルをバッファに開くと、きれいにフォーマットされたmode = Diff 。最初にファイルに取り込むことなく、直接取得する方法は?

詳細

ediff-buffers (私が気に入っている)だけでなく、 diff のようなもっとわかりにくい目的のために、 diff プロセス。私は数十年前からEmacsを使ってきましたが、新しい側面や使い方を学び続けています。だから、私が(ローカルの git リポジトリのdir /フォルダから)それを見つけたのが面白いほど驚くことではありませんでした。

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

バッファにファイルをオープンしたとき、それはきれいに/有益に色分けされた( ediff )mode = Diffで表示されました。私は今までに一度もなかった

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

しかし、今私は diff の出力をバッファー出力を幸福モード= Diffのようにキャプチャしようとしていますが、失敗しています。

一般性を追求する

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). 一般性を追求する, 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

...うまくフォーマットされた出力が得られます。さらに

  • これは3つのテストケース全てに適用されます。
  • 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

私は恐ろしい WARNING:端末が完全に機能していないを得る。

用語モード

Emacs Userが指摘するように、 Mx termgit diff master origin/master を実行すると、出力がうまく色づけされます。それはちょうどmode = Diffではないが、それは仕事をする。残念ながら

2
追加された 編集された
ビュー: 1

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はdiff機能を提供しますが、一般的なemacsの diff-mode とは異なる magit-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,
section = 'seeking 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
追加された
この回答を読んでいる人は、 WARNING:端末が完全に機能していないがこの解決策で解決されていないことに注意してください。この限定されたdiffの場合にはうまくいくかもしれませんが、要求されたOPとして genericity がある場合は、完全な解決策として M-x term を使用してください。理由については、Emacsのドキュメントを参照してください。
追加された 著者 Emacs User,
問題のセクションを選択する理由を見る= shell-command
追加された 著者 kraymer,