バッファ内のファイルをリロードするにはどうすればよいですか?


110

私は通常、バージョン管理を介してファイルシステムで更新されるファイルで作業します。C-x C-fファイルを再度読み込まずに再読み込みするかどうかを尋ねられることなく、ファイルを再読み込みする簡単な方法は何ですか?

回答:


117

M-x revert-bufferあなたが望むことを正確に行います。確認を求められます。

別のオプション(私のお気に入り)は以下の機能です:

;; Source: http://www.emacswiki.org/emacs-en/download/misc-cmds.el
(defun revert-buffer-no-confirm ()
    "Revert buffer without confirmation."
    (interactive)
    (revert-buffer :ignore-auto :noconfirm))

8
そのコードが次のものであるライブラリを引用しているかもしれませんmisc-cmds.el。複雑なわけではありませんが、何かを正確にコピーする場合は、ソースを指すのが一般的です。
ドリュー

3
謝罪!私自身は、どこからスニペットを取得したのかわかりませんでした。ここで信用できるように、少なくとも関数名をグーグル検索し、そのソースを見つけようとする必要があります。アップデートコピーしたすべてのソースを書き留めました。これについては確信が持てませんでした:github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…–
Kaushal Modi

4
この機能はお勧めしません。変更されたファイルを誤って使用するのは危険すぎます。
ジル14

2
@Gilles同意しますが、大きな力には大きな責任が伴います。アクセスしやすいバインディングにバインドしません。
カウシャルモディ14

6
これの私のバリアントは、を使用してバッファが変更された場合にのみ確認を求めます(revert-buffer t (not (buffer-modified-p)) t)
グルーカス

55

auto-revert-mode自動的にそれを行い、フィードバックを提供するものもあります。

doc文字列から:

auto-revert-mode is an interactive autoloaded compiled Lisp function
in `autorevert.el'.

(auto-revert-mode &optional ARG)

Toggle reverting buffer when the file changes (Auto Revert mode).
With a prefix argument ARG, enable Auto Revert mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
the mode if ARG is omitted or nil.

Auto Revert mode is a minor mode that affects only the current
buffer.  When enabled, it reverts the buffer when the file on
disk changes.

Use `global-auto-revert-mode' to automatically revert all buffers.
Use `auto-revert-tail-mode' if you know that the file will only grow
without being changed in the part that is already in the buffer.

50

私が使用する別のオプションはにfind-alternate-fileバインドされていC-x C-vます。これにより、現在のバッファを再利用してファイルが開きます。

デフォルトでは、現在使用しているファイルを指しているため、入力C-x C-v RETするだけでファイルをリロードできます。バッファに保存されていないデータがない限り、プロンプトは表示されません。

以下のようないくつかの非テキストモードimage-mode(画像をレンダリングするために使用され、PDFファイル、svgs ...等)とdiredしているrevert-bufferにバインドされたg高速アクセスのため。


3
これは私の新しい行き先です。言及してくれてありがとう。
ramsey_tm

.emacsに(ffap-bindings)があり、これがのバインディングを変更しているようですC-x C-v
ychaouche

これは素晴らしい、ありがとう!シンプルで効果的。ところで、Emacsに現在のファイルが変更されたことを知らせる方法は?たとえば、GUIモードのVIMは、アプリがフォーカスを取得したときに自動的にファイルの変更を検出します(バックグラウンドから切り替えられます)。
mato

これは受け入れられた答えでなければなりません。
Toon Claes

10

Emacsはこれを呼び出しますreverting

で現在のファイルを元に戻すことができますM-x revert-buffer。これにより、変数にリストされているパターンに一致するファイルを除き、ファイルが変更されたかどうかの確認を求められますrevert-without-query(詳細については、マニュアルを参照してください)。もう1つの不愉快な点revert-bufferは、ファイルモードをデフォルトにリセットすることです。

次の関数を使用して、名前で指定された一連のファイルを元に戻します。ファイルがバッファで開かれていない場合、無視されます。

(defun revert-files (&rest files)
  "Reload all specified files from disk.
Only files that are currently visited in some buffer are reverted.
Do not ask confirmation unless the buffer is modified."
  (save-excursion
    (let ((revert-without-query '("")))
      (dolist (file-name files)
        (message "Considering whether to revert file %s" file-name)
        (let ((buf (find-buffer-visiting file-name)))
          (when buf
            (message "Reverting file in buffer %s" (buffer-name buf))
            (set-buffer buf)
        (revert-buffer t nil t)))))))

この関数の典型的な使用例は、バージョン管理からファイルを更新した後です。更新されたすべてのファイルemacsclientを呼び出すためrevert-filesに使用します。または、更新に関係するすべてのファイルを呼び出します(これはより簡単で、少し遅いだけです)。次のシェルスクリプトを呼び出して、引数としてファイルを渡します。

#! /bin/sh
# Similar to gnuclient, but call `revert-files' on the files.
files=

## Find a way to convert a path to absolute. Bizarre OSes such as Windows
## require special cases. We also try to detect non-filenames such as URIs.
case `uname -s` in
  CYGWIN*)
    absolute_path () {
      cygpath -a -w -- "$1"
    };;
  *)
    wd="`pwd -P 2>/dev/null || pwd`"
    absolute_path () {
      case "$1" in
        /*) printf '%s' "$1";; # ordinary absolute path
        *:/*)
          if expr "z$1" : 'z[0-9A-Z_a-z][-.0-9@A-Z_a-z]*:/.*'; then
            printf '%s' "$1" # URI or machine:/some/path
          else
            printf '%s' "$wd/$1" # default to a relative path
          fi;;
        *) printf '%s' "$wd/$1";; # default to a relative path
      esac
    };;
esac

for x; do
  files="$files \"`absolute_path "$x" | sed 's/[\\\\\\\"]/\\\\&/g'`\""
done
exec emacsclient -e "(revert-files$files)"

使用例:

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +

@webappzeroが彼の答えで述べているように、これらの日、magitは痛みを伴わずにファイル戻すこの問題の一部を解決
Croad Langshan

8

以下に示すように、グローバル自動復帰モードを有効にすることもできます

(global-auto-revert-mode 1)

これは、jsscのように、自動修正モードを有効にしてjsファイルの多くのチェックを行うときに役立ちます。


7

revert-bufferある。しかし、私はいくつかのフィードバックが欲しいです。

私は私の次のものを持っています.emacs

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))

3

あなたは使用することができますfind-alternate-fileにバインドされ、C-x C-vデフォルトで、そして単に入力RETファイルをリロードするプロンプトで。


3

spacemacsユーザーの場合:SPC b Rspacemacs/safe-revert-buffer)。

確認をスキップするために、他の回答がすでにそれをカバーしていますが、私は他の人にそれをキーにバインドすることはおそらく良い考えではないことに同意します。


2

Magitはファイルのリバージョンを自動的に管理し、コアの問題を解決します。他の機能も利用できます。

ここにあるドキュメント微調整のためにあなたが興味を持っている設定は:

Magitを使用する場合は、3つのグローバルWIPモード(Work In Progress)をすべて有効にして作業が失われないようにしてください。

したがって、Emacs内でMagitを使用してバージョン管理アクションを実行し、元の問題を完全に回避できます。


1
これが役立つかどうか教えてください。
webappzero

この回答にはさらに賛成票が必要です!明確でない場合:WIPモードは良いかもしれません(現在は使用していません)が、元に戻す問題を解決するために厳密に必要なわけではありません。
クロードランシャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.