如何让Emacs在磁盘上的文件发生更改时自动刷新所有缓冲区?

197

我有一个非emacs的全局搜索替换功能,会导致磁盘文件比我的emacs缓冲区更加更新。有没有一种方法可以让emacs一次性从磁盘刷新所有的缓冲区,而不必每个文件都重新加载呢?

谢谢! D


1
全局自动恢复模式发挥了魔力... - Jorge Aguilar
3个回答

254
在你的.emacs中加入以下代码:

(global-auto-revert-mode t)


1
这在我始终想保持同步的情况下看起来很不错,谢谢!我想我最终会使用revbuffs,这样我就可以自己管理冲突(否则有时我可能会丢失未保存的更改,因为我的工作流程目前是这样的。) - Dave
2
谢谢!我使用revbuffs和auto-revert-mode的组合。当我想覆盖更改时,auto-revert-mode非常好用。 - Natan Yellin
14
@Dave:(全局)自动反转模式不会还原已修改的缓冲区,因此您不必担心丢失未保存的更改。 - Lindydancer
我已经在.emacs中设置了变量,但是当我在xcode中编辑一些代码时,然后读取该文件(已经打开)的那一行,在xcode中进行的编辑不会出现,需要手动执行M-x revert-buffer。(mac + emacs 24.3.1) - ericfang
7
在使用 git 切换分支时表现良好。谢谢! - Justin Leitgeb
有没有可能让它更频繁地刷新?甚至可以使用一些特定于平台的通知机制,而不需要轮询来实现即时刷新吗? - Erik Kaplun

13

如果您正在使用 Emacs GUI (我的是Windows 7上的GNU Emacs 25.1.1),这里有一个替代方案:

  1. 在菜单栏中点击"选项"
  2. 选择"自定义 Emacs"
  3. 选择"已保存的选项"
  4. 然后您应该会看到一个搜索框,在其中输入"global-auto-revert-mode"并按下"搜索"按钮
  5. 点击"切换"按钮,确保按钮右侧读取"on"
  6. 在搜索框下方按下"应用并保存"按钮

如果您已经打开了几个文件,您应该会立即看到这种效果。祝你好运!


11
感谢 @Ashwin 指出 (global-auto-revert-mode t)。但是,我发现仅有这个更改时,Emacs 不会自动更新文件已经发生变化的缓冲区。根据 https://www.gnu.org/software/emacs/manual/html_node/emacs/Reverting.html 的说明:
默认情况下,Auto-Revert 模式使用文件通知进行工作,即操作系统将文件系统中的更改报告给 Emacs。您可以通过自定义变量 auto-revert-use-notify 的值为 nil 来禁用文件通知的使用,然后 Emacs 将每五秒轮询一次以检查文件更改。您可以通过变量 auto-revert-interval 更改轮询间隔。
在我设置了 (setq auto-revert-use-notify nil) 后,Emacs 确实每 5 秒刷新所有缓冲区。

1
你是不是想说 (setq auto-revert-use-notify nil),因为它是一个变量? - Khoa Vo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接