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

时间:2009-05-28 23:38:20

标签: vim

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

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

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

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

6 个答案:

答案 0 :(得分:62)

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

:e

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

答案 1 :(得分:52)

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

:au CursorHold * checktime

您也可以在WinEnterBufWinEnter上进行设置,以便每次在缓冲区/窗口之间切换时都会更改。如果你真的是偏执狂,你可以在CursorMoved上设置它,这样每次移动光标时都会检查磁盘上的文件,但这可能有些过分,可能会有点滞后。

请参阅:h checktime:h updatetime:h autocmd-events-abc

答案 2 :(得分:25)

这是使用名为FileChangedShell的自动命令完成的。我太新了,不能发布链接,但你最好的选择是阅读vim文档的autocmd部分(Google for the)

但要点是在vimrc

中设置类似下面一行的内容
:au FileChangedShell * echo "Warning: File changed on disk"

答案 3 :(得分:9)

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

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

答案 4 :(得分:9)

改进Carper的答案:

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

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

答案 5 :(得分:3)

来自此answer(参考PhanHaiQuang的答案和flukus的评论)

可以在需要时从ex(whithin vim)运行此oneliner(或者将每个命令放在vimrc中,用于打开日志文件时。)

:set autoread | au CursorHold * checktime | call feedkeys("lh")

说明:
- autoread :从外部更改时读取文件(但它本身不起作用,没有内部计时器或类似的东西。它只会在vim执行操作时读取文件,如ex :!中的命令 - CursorHold * checktime :当用户未按照“更新时间”中指定的时间移动光标时(默认为4000毫秒)执行checktime,检查文件外部的变化 - 调用feedkeys(" lh"):光标向左,向右和向后移动。没有任何反应(...这意味着CursorHold被触发,这意味着我们有一个循环

相关问题