【发布时间】:2009-05-28 23:38:19
【问题描述】:
我通常使用 gVim 进行编辑,但有时在远程连接到我的机器时使用 vim。
当我在 gVim 中打开一个文件并且它已从外部更改(例如来自存储库的新更新)时,gVim 提供重新加载它。
但是,当 Vim 发生这种情况时,在您尝试保存文件之前它什么也不做。它只是警告您文件已更改,但不提供重新加载它。
是否有让 Vim 的行为与 gVim 匹配的设置?
【问题讨论】:
标签: vim
我通常使用 gVim 进行编辑,但有时在远程连接到我的机器时使用 vim。
当我在 gVim 中打开一个文件并且它已从外部更改(例如来自存储库的新更新)时,gVim 提供重新加载它。
但是,当 Vim 发生这种情况时,在您尝试保存文件之前它什么也不做。它只是警告您文件已更改,但不提供重新加载它。
是否有让 Vim 的行为与 gVim 匹配的设置?
【问题讨论】:
标签: vim
如果您想打开更新后的文件,请使用
:e
它应该重新加载打开的文件。
【讨论】:
正如ashcatch 所说,:checktime 命令将检查磁盘上的更改并提示您重新加载。所以设置 Vim 在某些事件之后自动运行checktime。使用哪个事件取决于您。一种可能性是使用CursorHold,它在您移动光标后触发,然后让它静止不动updatetime 毫秒。 (默认 4 秒。)
:au CursorHold * checktime
您也可以在WinEnter 或BufWinEnter 上设置它,这样每次在缓冲区/窗口之间切换时它都会改变。如果你真的很偏执,你可以将它设置为CursorMoved,这样每次你移动光标时它都会检查磁盘上的文件,但这可能有点矫枉过正并且可能会有点滞后。
请参阅:h checktime、:h updatetime、:h autocmd-events-abc。
【讨论】:
set autoread to,如果其内容没有更改,它将重新读取文件。
这是使用名为 FileChangedShell 的自动命令完成的。我太新了,无法发布链接,但最好的办法是阅读 vim 文档的 autocmd 部分(谷歌)
但要点是在你的 vimrc 中设置类似于以下行的内容
:au FileChangedShell * echo "Warning: File changed on disk"
【讨论】:
改进 Carper 的回答:
" Run checktime in buffers, but avoiding the "Command Line" (q:) window
au CursorHold * if getcmdwintype() == '' | checktime | endif
如果没有这个检查,如果你尝试使用“命令行”(q:) 缓冲区,Vim 会输出错误,因为这个缓冲区不支持:checktime 命令。感谢 #vim 上的 kdlv。
【讨论】:
getcmdwintype() 可能需要vim 7.4?我似乎在 7.3 上使用 getcmdtype() 代替。
au CursorHold,CursorHoldI * silent! checktime 忽略错误。这也适用于早期的 Vim 版本。
FocusGained,CursorHold 而不是仅仅使用CursorHold 来确保缓冲区在重新聚焦后立即更新也很好。
您可以使用:checktime 手动触发检查。 gvim 每次重新获得焦点时都会这样做,因此不需要经常进行手动检查。
我不知道是否有不同的方法(比如在某个时间间隔内自动检查)。
【讨论】:
:checktime?这是一个诅咒程序限制吗?
来自answer(参考PhanHaiQuang 的回答和flukus 的评论)
可以在需要时从 ex (whithin vim) 运行这个 oneliner(或者在打开日志文件时将每个命令放在 vimrc 中。)
:set autoread | au CursorHold * checktime | call feedkeys("lh")
说明:
- autoread:从外部更改文件时读取文件(但它不能自行工作,没有内部计时器或类似的东西。它只会在 vim 执行操作时读取文件,例如前:!中的命令
- CursorHold * checktime:当光标在 'updatetime' 中指定的时间(默认为 4000 毫秒)内未被用户移动时,执行 checktime,检查文件外部的更改
- call feedkeys("lh"):光标移动一次,左右移动。然后什么也没有发生(...这意味着 CursorHold 被触发,这意味着我们有一个循环)
【讨论】: