检测文件更改,提供重新加载文件

Art*_*Art 55 vim

我通常使用gVim进行编辑,但有时在远程连接到我的机器时使用vim.

当我在gVim中打开一个文件并且它已从外部更改时(例如来自存储库的新更新),gVim提供重新加载它.

但是当Vim发生这样的事情时,在你尝试保存文件之前它什么都不做.它只是警告您文件已更改,但不提供重新加载它.

有一个设置让Vim的行为与gVim相匹配吗?

小智 62

如果要打开更新的文件使用

:e
Run Code Online (Sandbox Code Playgroud)

它应该重新加载打开的文件.

  • 是的。但问题是如何自动检测文件更改,而不是如何重新加载它。 (3认同)

Bri*_*per 52

正如ashcatch所说,该:checktime命令将检查磁盘上的更改并提示您重新加载.因此将Vim设置为checktime在某个事件后自动运行.使用哪个事件取决于您.一种可能性是使用CursorHold,在您移动光标然后让它静止updatetime几毫秒后触发.(默认4秒.)

:au CursorHold * checktime
Run Code Online (Sandbox Code Playgroud)

您也可以将其设置为WinEnterBufWinEnter每次在缓冲区/窗口之间切换时都会更改.如果你真的是偏执狂,你可以设置它,CursorMoved所以它每次移动光标时检查磁盘上的文件,但这可能是过度的,可能会滞后一点.

:h checktime,:h updatetime,:h autocmd-events-abc.

  • 我很难读取vim帮助...我不确定为什么它只是因为某种原因麻木了. (7认同)

Mat*_*ons 25

这是使用名为FileChangedShell的auto命令完成的.我太新了,不能发布链接,但你最好的选择是阅读vim文档的autocmd部分(谷歌为此)

但要点是在你的vimrc中设置类似下面一行的内容

:au FileChangedShell * echo "Warning: File changed on disk"
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,虽然没有. (13认同)
  • 对不起,马特,它确实在看错误的文件。它确实显示警告,但没有实际提示重新加载 (2认同)

DBe*_*nko 10

改进Carper的答案:

" Run checktime in buffers, but avoiding the "Command Line" (q:) window
au CursorHold * if getcmdwintype() == '' | checktime | endif
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用"命令行"(q :)缓冲区,如果没有此检查,Vim将会出现错误,因为此缓冲区不支持该:checktime命令.感谢#vim上的kdlv.


ash*_*tch 9

您可以手动触发检查:checktime.gvim每次重新获得焦点时都会这样做,因此通常不需要进行手动检查.

我不知道是否有不同的方法(比如在某个时间间隔内自动检查).

  • 没错,gvim做到了,但不是vim (4认同)
  • 为什么vim在获得焦点时也不能触发`:checktime`?这是curses 程序限制吗? (2认同)