更新2015-06-25:
- 我已经放弃了“ shell”方法,因为它太不起作用了。它停止了插入模式并离开了僵尸进程。看看这篇文章的修订历史,您是否真的想看到它。
- 我已经用它制作了一个插件:auto_autoread.vim。目前,它实际上与下面的代码相同,但是我建议您使用该插件,因为它很可能会收到更新。
怎么autoread
办?
要回答这个问题,我们必须首先了解该autoread
选项的作用,更重要的是,它不起作用。
不幸的是:help 'autoread'
,关于此的信息并不多,它只是说“检测到文件已在Vim之外更改”。Vim如何检测文件已更改?在某些操作上,Vim检查文件的修改时间。
什么时候:
:checktime
用来;
- 输入一个缓冲区;
:diffupdate
用来;
:e
为已经具有缓冲区的文件发出;
- 执行外部命令
!
;
- 返回到前台(
^Z
,,fg
仅当shell具有作业控制权时);
对于gVim,在以下情况下也可以这样做:
- 关闭“右键单击”菜单(通过选择某些内容或仅通过将其关闭);
- 焦点改变了(这是您已经注意到的);
- 如果您使用菜单中的“文件->打开”,“文件->另存为”,则关闭弹出的文件浏览器对话框。
我通过查找到所有通话聚集从Vim的源信息
buf_check_timestamp()
,check_timestamps()
其中,功能和位置
need_check_timestamps
设置为TRUE
。
我可能错过了一些事件,但是要记住的关键是Vim仅检查是否在非常有限的情况下修改了文件。它肯定不会“轮询”文件以进行n秒钟的更改,这基本上就是您要执行的操作。
因此,仅出于您的目的,set autoread
还不够。
使用Python
这计划将Python线程在后台运行,它将:checktime
每n秒运行
一次。如果autoread
被启用,这将刷新缓冲区从磁盘,否则它只会发出警告。
这要求Vim具有+python
或+python3
in :version
。它应可在所有平台(包括Windows)上运行。
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
您可以使用:call AutoreadPython()
;您当然可以在autocmd中执行此操作;例如:
autocmd *.c call AutoreadPython()
后记
实际上还有更多的方法,例如,您可以使用诸如entr
或Python inotify
或gamin
模块之类的工具
来监视文件的更改,:checktime
还可以检查所有缓冲区(如果未提供任何参数),可以通过仅检查单个缓冲区或某个文件。
但是,此答案已经相当长了:-)这些方法应该(希望如此!)在大多数情况下都可以正常工作,或者应该易于适应您的情况。
PS。我也尝试使用Ruby,但是不幸的是,Ruby线程(使用Thread
)没有像Python那样在后台运行,所以我无法使其工作(也许还有另一种方法?)
CursorHold
?如果Vim没有焦点,它应该每n秒触发一次。