如何重新加载当前文件?


145

我经常使用受版本控制的文件,因此可以在Vim之外对它们进行更改。

用什么快速方法可以重新加载文件而不必关闭并重新打开Vim?有没有办法自动执行此操作?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
汤姆·黑尔

如果您已安装vim-faq,则可以在那里找到离线答案::h vim-faq并搜索/reload。难记的标签是:h faq-5.8
Hotschke

Answers:


172

您想要的命令是:e(的缩写:edit)。如果使用:edit!它,将丢弃本地更改并重新加载。

您也可以让vim set autoread在vimrc中自动执行此操作。


5
有关的警告和解决方案,请参见此答案autoread
汤姆·黑尔

4
要对所有缓冲区执行此操作,使用:bufdo :e:bufdo :e!
阿伦H.

1
@AaronH。谢谢你!我通常一次打开数百个缓冲区,当切换分支时,我通常只是关闭vim并重新启动以刷新带有新内容的所有缓冲区。这将是一个重要的节省时间!
g19fanatic

1
@AaronH。第二个:是可选的::bufdo e将起作用。
JoL

19

在许多情况下,set autoread将无法正常工作,因为此答案说明:

除非您执行诸如运行外部命令(如!ls!sh等)之类的操作,否则自动读取不会重新加载文件

焦点事件将触发autoread,但是除非使用,否则不会捕获这些事件gvim。因此,如果vim在终端窗口或tmux中正常运行,请安装插件vim-tmux-focus-events

在tmux版本> 1.9上,您需要添加.tmux.conf

set -g focus-events on

为了更好的效果, vim 内部更改缓冲区时,将在您的vimrcwill中添加以下内容:autoread

au FocusGained,BufEnter * :checktime

多年来一直困扰着我。感谢您提供彻底的解决方案!💯😄
内森龙

9

如果您曾经运行过Vim修改当前缓冲区的外部命令,则可能已经注意到,由于对磁盘进行了更改,它会提示您重新加载文件。您实际上可以使用:checktime命令来调用此提示。


3

改善https://github.com/djoshea/vim-autoread的好插件autoread

自动导致vim重新加载自vim上次写入以来已写入磁盘但未在缓冲区中修改的文件。这使得在vim中打开的文件可以使用其他应用程序进行编辑并保存。返回vim后,只要您自上次更改以来就没有修改过该文件,该文件将自动更新以反映磁盘上所做的更改,就像您手动按:e一样。


欢迎使用Vi Stack Exchange。这几乎是仅链接的答案。您可以通过描述插件来改进它(例如,它的作用是什么?人们将如何使用它来实现OP的目标?)
John O'M。

0

我遇到的问题是查看文件的内容,从外部更新文件,显示更改的文件以及可以在需要时进行编辑的选项。我受此答案启发,使用Vim服务器/远程命令行选项解决该问题


使用以下命令,可以通过外部命令重新加载文件。首先,在启动服务器实例时,用Vim打开有问题的文件。

vim --servername JABBERWOCKY /tmp/alice.log

假设文件已在外部进行了更改,例如通过echo "Curiouser and curiouser" >> /tmp/alice.log。必要时,向服务器实例发送命令以重新加载文件。该命令将快速完成,并且不会产生新的编辑器。

vim --servername JABBERWOCKY --remote-send ":e<CR>"

如果打开的文件在Vim中和外部进行了更改,则在重新加载期间会发生冲突(将出现警告消息)。对于这种情况,必须做出决定:将其保留并保留在Vim中进行更改,或者放弃本地更改并强制重新加载


--remote-send上面的命令需要手动重新加载。但是,该命令可以使用Bash的for/ while或在Linux / Unix中使用简单的单线方式绑定到一个简单的循环:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

尽管未经测试,但我确信在PowerShell中也可以实现类似的功能。

在Linux / Unix上,如果您不使用过于疯狂的文件系统,则可以通过使用inotify库监听文件系统事件来实现事件驱动方法。我个人非常喜欢使用entr工具,该工具似乎已包含在主要的Linux发行版中。然后我得到:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
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.