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

问题描述 投票:0回答:7

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

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

但是,当 Vim 发生这种情况时,它不会执行任何操作,直到您尝试保存文件。它只是警告您文件已更改,但不提供重新加载它。

是否有一个设置可以使 Vim 的行为与 gVim 匹配?

vim
7个回答
61
投票

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

:e

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


56
投票

正如 ashcatch 所说,

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

:au CursorHold * checktime

您还可以将其设置为

WinEnter
BufWinEnter
,以便每次在缓冲区/窗口之间切换时它都会发生变化。如果你真的很偏执,你可以将其设置为
CursorMoved
,这样每次移动光标时它都会检查磁盘上的文件,但这可能有点过头了,可能会有点滞后。

参见

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


25
投票

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

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

:au FileChangedShell * echo "Warning: File changed on disk"

10
投票

改进卡珀的答案:

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

如果没有此检查,如果您尝试使用“命令行”(q:) 缓冲区,Vim 将会抛出错误,因为该缓冲区不支持

:checktime
命令。感谢 #vim 上的 kdlv 发现了这一点。


9
投票

您可以使用

:checktime
手动触发检查。 gvim 每次重新获得焦点时都会执行此操作,因此没有必要经常进行手动检查。

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


4
投票

来自这个answer(参考PhanHaiQuang的回答和flukus的评论)

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

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

说明:
- autoread:从外部更改时读取文件(但它本身不能工作,没有内部计时器或类似的东西。它只会在 vim 执行操作时读取文件,例如 ex 中的命令

 :!

- CursorHold * checktime:当用户在“updatetime”指定的时间内(默认为 4000 毫秒)没有移动光标时,将执行 checktime,检查来自文件外部的更改
- 调用 feedkeys("lh"):光标向右移动一次,然后向左移动。然后什么也没有发生(...这意味着 CursorHold 被触发,这意味着我们有一个 loop


0
投票

您可以使用 autoread:checktimeautocmds 事件

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内更改文件,则会自动读取文件
  • 如果您在 vim 中更改了文件并且
    :checktime
    检测到 vim 之外的更改,那么您将看到
    W12: Warning: File "xxxxx" has changed and the buffer has changed in Vim as well
    (请参阅
    :help W12
© www.soinside.com 2019 - 2024. All rights reserved.