Vim的autoread是如何工作的?

Vik*_*tor 48 vim

:h autoread 说:

如果检测到文件已在Vim外部更改且Vim内部未更改,则会再次自动读取.

放入set autoread我之后vimrc,我用Vim打开一个文件,切换到另一个编辑器,更改文件,然后等待查看Vim中的更改.什么都没发生.我必须使用:e新内容重新加载文件.

我错过了什么?                                                                我在Mac 10.5.8上使用Vim 7.2

小智 37

Autoread不会重新加载文件,除非您执行类似于运行外部命令的操作(如!ls或!sh等)vim不会定期执行检查您可以使用手动重新加载文件 :e

此主题中的更多详细信息: 单击此处


fph*_*ipe 30

我使用以下代码片段,每当我切换缓冲区或再次聚焦vim时触发autoread:

au FocusGained,BufEnter * :silent! !
Run Code Online (Sandbox Code Playgroud)

此外,将它与下面的代码段结合使用是有意义的,这样在离开缓冲区或vim时总是保存文件,避免冲突情况:

au FocusLost,WinLeave * :silent! w
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想通过禁用在save上运行的任何钩子来加速写入(例如linters),你可以在w命令前加上noautocmd:

au FocusLost,WinLeave * :silent! noautocmd w
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`:checktime`来明确触发检查而不会出现问题?Vim应该已经在FocusGained上做了这个,你不应该需要autocmd! (2认同)

iri*_*ava 17

根据我在superuser.com上的帖子

Autoread只是不起作用.使用以下内容.

http://vim.wikia.com/wiki/Have_Vim_check_automatically_if_the_file_has_changed_externally

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

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

原因是我想运行ipython/screen/vim设置.


Ban*_*ach 13

聚会有点晚了,但现在 vim 有计时器,你可以这样做:

if ! exists("g:CheckUpdateStarted")
    let g:CheckUpdateStarted=1
    call timer_start(1,'CheckUpdate')
endif
function! CheckUpdate(timer)
    silent! checktime
    call timer_start(1000,'CheckUpdate')
endfunction
Run Code Online (Sandbox Code Playgroud)


Gre*_*ton 10

在gvim之外,autoread对我不起作用.

为了解决这个问题,我使用了这个相当丑陋的黑客.

set autoread
augroup checktime
    au!
    if !has("gui_running")
        "silent! necessary otherwise throws errors when using command
        "line window.
        autocmd BufEnter        * silent! checktime
        autocmd CursorHold      * silent! checktime
        autocmd CursorHoldI     * silent! checktime
        "these two _may_ slow things down. Remove if they do.
        autocmd CursorMoved     * silent! checktime
        autocmd CursorMovedI    * silent! checktime
    endif
augroup END
Run Code Online (Sandbox Code Playgroud)

这似乎是脚本irishjava链接到的,但是这可以让你为缓冲区切换它.我只是想让它适用于一切.


Tom*_*ale 6

光标停止移动时触发

添加到您的vimrc

au CursorHold,CursorHoldI * checktime
Run Code Online (Sandbox Code Playgroud)

默认情况下,CursorHold在光标保持静止4秒钟后触发,并且可以通过updatetime进行配置。

缓冲区更改触发器

autoread在更改缓冲区时触发,请添加到您的vimrc

au FocusGained,BufEnter * checktime
Run Code Online (Sandbox Code Playgroud)

终端窗口焦点触发

FocusGained在普通vim中工作(请参见上文),请在终端仿真器(Xterm,tmux等)中安装插件: vim-tmux-focus-events

在tmux版本> 1.9上,您需要添加.tmux.conf

set -g focus-events on
Run Code Online (Sandbox Code Playgroud)