Answers:
您想要的命令是:e
(的缩写:edit
)。如果使用:edit!
它,将丢弃本地更改并重新加载。
您也可以让vim set autoread
在vimrc中自动执行此操作。
:bufdo :e
或:bufdo :e!
:
是可选的::bufdo e
将起作用。
在许多情况下,set autoread
将无法正常工作,因为此答案说明:
除非您执行诸如运行外部命令(如
!ls
或!sh
等)之类的操作,否则自动读取不会重新加载文件
焦点事件将触发autoread
,但是除非使用,否则不会捕获这些事件gvim
。因此,如果vim
在终端窗口或tmux中正常运行,请安装插件vim-tmux-focus-events。
在tmux版本> 1.9上,您需要添加.tmux.conf
:
set -g focus-events on
为了更好的效果,在 vim 内部更改缓冲区时,将在您的vimrc
will中添加以下内容:autoread
au FocusGained,BufEnter * :checktime
改善https://github.com/djoshea/vim-autoread的好插件autoread
自动导致vim重新加载自vim上次写入以来已写入磁盘但未在缓冲区中修改的文件。这使得在vim中打开的文件可以使用其他应用程序进行编辑并保存。返回vim后,只要您自上次更改以来就没有修改过该文件,该文件将自动更新以反映磁盘上所做的更改,就像您手动按:e一样。
我遇到的问题是查看文件的内容,从外部更新文件,显示更改的文件以及可以在需要时进行编辑的选项。我受此答案启发,使用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>"
" Compare buffer with saved version
nnoremap gd :DiffSaved<CR>