我通常使用 gVim 进行编辑,但有时在远程连接到我的机器时使用 vim。
当我在 gVim 中打开一个文件并且它已从外部更改(例如来自存储库的新更新)时,gVim 会提供重新加载它。
但是,当 Vim 发生这种情况时,它不会执行任何操作,直到您尝试保存文件。它只是警告您文件已更改,但不提供重新加载它。
是否有一个设置可以使 Vim 的行为与 gVim 匹配?
如果您想打开更新的文件,请使用
:e
它应该重新加载打开的文件。
正如 ashcatch 所说,
:checktime
命令将检查磁盘上的更改并提示您重新加载。因此,设置 Vim 在某个事件发生后自动运行 checktime
。使用哪个事件由您决定。一种可能是使用 CursorHold
,它会在您移动光标并让它静止 updatetime
毫秒后触发。 (默认 4 秒。)
:au CursorHold * checktime
您还可以将其设置为
WinEnter
或 BufWinEnter
,以便每次在缓冲区/窗口之间切换时它都会发生变化。如果你真的很偏执,你可以将其设置为 CursorMoved
,这样每次移动光标时它都会检查磁盘上的文件,但这可能有点过头了,可能会有点滞后。
参见
:h checktime
、:h updatetime
、:h autocmd-events-abc
。
这是使用名为 FileChangedShell 的自动命令完成的。我太新了,无法发布链接,但你最好的选择是阅读 vim 文档的 autocmd 部分(谷歌)
但要点是在你的 vimrc 中设置类似以下行的内容
:au FileChangedShell * echo "Warning: File changed on disk"
改进卡珀的答案:
" Run checktime in buffers, but avoiding the "Command Line" (q:) window
au CursorHold * if getcmdwintype() == '' | checktime | endif
如果没有此检查,如果您尝试使用“命令行”(q:) 缓冲区,Vim 将会抛出错误,因为该缓冲区不支持
:checktime
命令。感谢 #vim 上的 kdlv 发现了这一点。
您可以使用
:checktime
手动触发检查。 gvim 每次重新获得焦点时都会执行此操作,因此没有必要经常进行手动检查。
我不知道是否有不同的方法(比如在一定的时间间隔自动检查)。
来自这个answer(参考PhanHaiQuang的回答和flukus的评论)
需要时可以从 ex(在 vim 中)运行此 oneliner(或将每个命令放入 vimrc 中,以便在打开日志文件时使用。)
:set autoread | au CursorHold * checktime | call feedkeys("lh")
说明:
- autoread:从外部更改时读取文件(但它本身不能工作,没有内部计时器或类似的东西。它只会在 vim 执行操作时读取文件,例如 ex 中的命令
:!
您可以使用 autoread、:checktime 和 autocmds 事件
VimResume
、FocusGained
、BufEnter
在使用 lua 的 neovim 中,你的
init.lua
中需要这样的东西:
vim.opt.autoread = true
vim.api.nvim_create_autocmd({"FocusGained","BufEnter","VimResume", "CursorHold"}, {
pattern = '*',
command = 'checktime'
})
:checktime
/
ctrl-z
(fg
) 或闲置时 (VimResume
) 时,autocmd 将运行 CursorHold
autoread
如果文件已更改,并且您没有在vim内更改文件,则会自动读取文件:checktime
检测到 vim 之外的更改,那么您将看到 W12: Warning: File "xxxxx" has changed and the buffer has changed in Vim as well
(请参阅 :help W12
)