如何在缓冲区中重新加载文件?


110

我通常会处理通过版本控制在文件系统中更新的文件。有什么快速的方法可以重新加载文件,而不必C-x C-f再次访问该文件并询问我是否要重新加载它?

Answers:


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。并不是说它很复杂,但是当您精确复制某些内容时,通常要指出其来源。
提请2014年

3
道歉!我(我自己)不确定从何处获得该摘要。我应该至少在Google上搜索一下函数名称,然后尝试找到其源代码,以便在这里使用它。更新我记下了我复制的所有内容的来源;只是不确定这一点:github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…–
Kaushal Modi

4
我不推荐此功能。意外使用修改后的文件太危险了。
吉尔斯2014年

2
@吉尔斯我同意,强大的力量伴随着巨大的责任。我不会将其绑定到易于访问的绑定。
Kaushal Modi 2014年

6
我的此变体仅在使用修改缓冲区后才提示确认(revert-buffer t (not (buffer-modified-p)) t)
glucas 2015年

55

也有auto-revert-mode自动执行并提供反馈的工具。

从文档字符串:

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等),并diredrevert-buffer绑定到该模式g以加快访问速度。


3
这是我的新选择。感谢您提及。
ramsey_tm 2016年

我的.emacs文件中有一个(ffap-bindings),似乎改变了的绑定C-x C-v
ychaouche

太好了,谢谢!简单有效。顺便说一句,如何使Emacs注意到当前文件已更改?例如,GUI模式下的VIM在应用程序获得焦点时自动检测到文件更改(从后台切换到该文件)。
mato

这应该是公认的答案。
Toon Claes

10

Emacs称之为reverting

您可以使用还原当前文件M-x revert-buffer。这会提示您确认文件是否已被修改,但与变量中列出的模式匹配的文件除外revert-without-query(有关详细信息,请参见手册)。的另一个不便之处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所有已更新,或将文件(这是比较容易的,只有稍微慢)所有由更新有关的文件。我调用以下shell脚本,将文件作为参数传递给它:

#! /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

(global-auto-revert-mode 1)

当您对启用了自动修复模式的js文件进行大量检查时(如jssc中),这很有用。


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模式(进行中的工作),以免丢失工作。

因此,您可以使用Magit在Emacs中执行版本控制操作,并完全避免原始问题。


1
请告诉我这是否有帮助。
webappzero

这个答案应该有更多的支持!以防万一:WIP模式可能不错(我目前不使用它们),但是并不是绝对必需的,这样它才能为您解决还原问题。
Croad Langshan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.