一旦文件在磁盘上发生变化,就在 VIM 中自动重新加载文件

GJ.*_*GJ. 48 vim

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

我怎样才能做到这一点?

Ben*_*ier 40

在您的~/.vimrc

set autoread
Run Code Online (Sandbox Code Playgroud)

  • 通常`autoread`只会在执行外部命令后触发。[这个答案](https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044)详细介绍了解决方案。 (12认同)

小智 18

这对我有用

set autoread                                                                                                                                                                                    
au CursorHold * checktime  
Run Code Online (Sandbox Code Playgroud)

第一行本身是不够的。你可以放进你.vimrc

归功于潘海光


eli*_*eli 7

来自这个答案参考 PhanHaiQuang的回答和@flukus的评论)

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

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

说明:
- autoread:从外部更改时读取文件(但它不能自行工作,没有内部计时器或类似的东西。它只会在 vim 执行操作时读取文件,例如 ex 中的命令:!
- CursorHold * checktime:当用户在 'updatetime' 中指定的时间(默认为 4000 毫秒)内没有移动光标时,将执行 checktime,它会检查文件外部的更改
-调用 feedkeys("lh"):光标移动一次,向右和向左移动。然后什么也没有发生(...这意味着,CursorHold 被触发,这意味着我们有一个循环


小智 5

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

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

我通过直接调用 setup 函数得到了最好的结果,就像这样。

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 
Run Code Online (Sandbox Code Playgroud)

这样做的原因是我想运行 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
Run Code Online (Sandbox Code Playgroud)