【问题标题】:Detect file change, offer to reload file检测文件更改,提供重新加载文件
【发布时间】:2009-05-28 23:38:19
【问题描述】:

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

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

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

是否有让 Vim 的行为与 gVim 匹配的设置?

【问题讨论】:

标签: vim


【解决方案1】:

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

:e

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

【讨论】:

  • 是的。但问题是如何自动检测文件更改,而不是如何重新加载。
【解决方案2】:

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

:au CursorHold * checktime

您也可以在WinEnterBufWinEnter 上设置它,这样每次在缓冲区/窗口之间切换时它都会改变。如果你真的很偏执,你可以将它设置为CursorMoved,这样每次你移动光标时它都会检查磁盘上的文件,但这可能有点矫枉过正并且可能会有点滞后。

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

【讨论】:

  • 我很难阅读 vim 帮助...我不知道为什么它只是出于某种原因让我麻木了。
  • Brian,vim 说“没有这样的组或事件:CurshorHold * checktime”
  • 对不起,错字。 CurshorHold 应该是 Cursorhold。
  • 谢谢^^ 我一直想知道如何做到这一点已经有一段时间了。这适用于 set autoread to,如果其内容没有更改,它将重新读取文件。
  • 对我不起作用。我试过 CurshorHold 和 Cursorhold。我使用的是 Windows 7 64 位。
【解决方案3】:

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

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

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

【讨论】:

  • 我认为没有必要,vim 应该会自动警告您更改。
  • 虽然没有,但很遗憾。
  • 抱歉,Matt 确实是在查看错误的文件。它确实显示警告,但不是实际提示重新加载
  • 啊,好的。不用担心。希望你能找到你要找的东西!
  • 我将它输入到我的 Konsolse vim 会话中,但它没有检测到我在 vim 背后用 kate 更改了文件。如果我重新调整终端的焦点,它什么也不做。我猜这个事件没有被触发。有什么想法吗?
【解决方案4】:

改进 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 来确保缓冲区在重新聚焦后立即更新也很好。
【解决方案5】:

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

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

【讨论】:

  • 为什么vim在获得焦点时也不能触发:checktime?这是一个诅咒程序限制吗?
【解决方案6】:

来自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 被触发,这意味着我们有一个循环

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2018-09-04
    • 2012-11-28
    • 2013-05-13
    • 1970-01-01
    • 2010-09-08
    • 2017-04-16
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多