磁盘上的文件更改后自动在VIM中重新加载文件


32

假设文件在VIM缓冲区中没有未保存的更改,如果文件在磁盘上发生更改,我希望它自动重新加载。最常见的用例是当我更新文件所在的工作副本时。

我该如何实现?


我认为这是您的意思,但是我的特定用例是当我签出另一个git分支或commit时,我希望vim重新加载文件。
内森·朗

Answers:



11

这对我有用

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

第一行本身还不够。你可以放进去.vimrc

归功于潘海光


不需要autocmd -检查时间应该在内部触发CursorHold事件的同时运行。换句话说,您只是让Vim进行第二次检查。
Heptite '16

对我来说这是必要的。经过大量研究,我找到了最佳解决方案。@Heptite,您有主张的章节吗?
汤姆·黑尔

1
@TomHale我已经审查了Vim文档,据我所知,它没有明确说明,但是“ :help timestamp”似乎表明我是错误的,并且Vim仅对特定事件进行检查,因此可能需要使autocmd进行更频繁的检查。
赫珀特(Heeptite)'17

5

自动读取无法正常工作。以下对我有用:

您需要首先从此处安装脚本。

像这样直接调用setup函数可以获得最佳结果。

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

原因是我要运行ipython / screen / vim安装程序。

您可以轻松地将其转换为视图的增强版本。

编写过程脚本。

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt

1
如果您使用的是Vim GUI之一,例如gVim或MacVim,则autoread命令可以与其余环境完美集成。例如,在其他程序,另一个编辑器中或从源代码管理中编辑文件,然后切换回vim将自动读取更新的文件。问题似乎在于vim的终端版本如何集成。终端版本无法告诉您何时在GUI中或使用终端多路复用器(例如tmux)在程序之间进行切换,因此它无法在相关时间自动读取。如果vim只订阅相关的文件系统事件,那就太好了。
bames53

3

到目前为止,vim-autoread插件对我有用

自动读取

自动导致vim重新加载自上次从vim写入以来已写入磁盘但未在缓冲区中修改的文件。这使得在vim中打开的文件可以使用其他应用程序进行编辑并保存。返回vim后,只要您自上次更改以来就没有修改过文件,该文件将自动更新以反映磁盘上所做的更改,就像您手动按:e一样。


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 评论
布尔吉

@Burgi我添加了插件说明,以说明它如何解决问题。
Wojtek Kruszewski

我尝试过,但必须输入导航命令(例如j)才能看到有效的更新。我在这里创建了一个与此相关的问题:github.com/djoshea/vim-autoread/issues/3
Martin Delille

3

从这个答案(指的是PhanHaiQuang的答案和@flukus的评论)

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

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

说明:
- 自动读:读取来自外部的变化时,该文件(但它自身不工作,不存在内部定时器或类似的东西,它只会读取时VIM中前做一个动作,像这样的命令文件。:!
- CursorHold * checktime:当用户未在'updatetime'中指定的时间(默认为4000毫秒)中移动光标时,将执行checktime,它检查文件外部的更改
- 调用feedkeys(“ lh”):光标向右和向左移动一次,然后什么也没有发生(...这意味着CursorHold被触发,这意味着我们有一个循环


lh不执行任何操作,如果光标位于行的最后位置,lh则会更改其位置。
Mahmoud Al-Qudsi '18

的确如此。以最小的交互或对文件的更改重新加载文件。如果愿意,可以跳到最后一行或第一行(只需用gg或G替换lh),但是这里的目标只是要将文件重新加载到vim中,这就是单行代码的功能,仅此而已。您喜欢在这里做什么?
eli

@ MahmoudAl-Qudsi ...的意思是,“ lh”仅触发CursorHold-动作(我在解释中提到),然后再次触发自动读取
eli 18'Apr

1

根据您的Vim版本,此处列出一些可能有效的插件。

另一种方法是定期将checktime命令从外部进程发送到vim。这是一个执行此操作的ShellJS脚本(shelljs-plugin-sleeprequire,NeoVim和nvr

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.