Vim';什么是自动阅读工作?

Vim';什么是自动阅读工作?,vim,Vim,:h autoread表示: 当检测到文件已在Vim外部更改,但在Vim内部未更改时,自动再次读取该文件 将set autoread放入我的vimrc后,我用Vim打开一个文件,切换到另一个编辑器,更改文件,然后等待查看Vim中的更改。什么也没发生。我必须使用:e重新加载包含新内容的文件 我错过了什么?我在Mac 10.5.8上使用Vim 7.2,除非您做些什么,否则Autoread不会重新加载文件 像运行外部命令(像!ls或!sh等) vim不定期进行检查 您可以使用:e 此线程中的更多详细信

:h autoread
表示:

当检测到文件已在Vim外部更改,但在Vim内部未更改时,自动再次读取该文件

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


我错过了什么?我在Mac 10.5.8上使用Vim 7.2,除非您做些什么,否则Autoread不会重新加载文件 像运行外部命令(像!ls或!sh等) vim不定期进行检查 您可以使用
:e

此线程中的更多详细信息:

对我来说,当我使用命令时,它会工作

:set autoread
当然,在发生任何事情之前,您必须将文件保存在其他编辑器中。

根据

自动阅读根本不起作用。使用以下命令

我通过直接调用setup函数得到了最好的结果,如下所示

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

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

在gvim之外,自动读取对我不起作用

为了避开这个问题,我使用了这个相当丑陋的黑客

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

这似乎是irishjava链接到的脚本所做的,但它允许您为缓冲区切换这一点。我只想让它适用于所有情况。

我使用以下代码片段,每当我切换缓冲区或再次聚焦vim时,它都会触发自动读取:

au FocusGained,BufEnter * :silent! !
此外,将其与以下代码段结合使用是有意义的,这样在离开缓冲区或vim时,文件总是被保存,从而避免冲突情况:

au FocusLost,WinLeave * :silent! w

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

au FocusLost,WinLeave * :silent! noautocmd w
当光标停止移动时触发 添加到您的
vimrc

au CursorHold,CursorHoldI * checktime
au FocusGained,BufEnter * checktime
默认情况下,在光标静止4秒后触发,可通过进行配置

缓冲区更改触发器 要在更改缓冲区时触发
autoread
,请将以下内容添加到
vimrc

au CursorHold,CursorHoldI * checktime
au FocusGained,BufEnter * checktime
终端窗口焦点触发器 要使
focusgound
(见上文)在普通vim中工作,请在终端仿真器(Xterm、tmux等)内安装插件:

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

set -g focus-events on

派对有点晚了,但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

我知道这篇文章有点老,但希望这能帮助像我这样遇到类似问题的人

我不知道自动加载是如何工作的,但我知道vimscript是如何工作的,这通常是如何获取内容的 完成。如果你觉得这很有用,请向上投票。要回答您的问题,请不要在其他文件夹中编辑同一文件 编辑。如果要重新加载文件,通常会在vim中收到通知。我正在吃 这是个问题,但我的问题不同。我想在用编译css文件后重新加载它 scss的雨果。这就是我所做的,你可以接受我的代码想法,让它们满足你的需要

用法

  • 将style.scss更改为您正在处理的文件,并向其添加图案 自动加载_文件,这些是您要自动加载的文件。在我的情况下,我想重新加载一个 以扩展名“content”结尾

  • 在autocmd中包括您将要编写的文件,在我的例子中是'style.scss'

  • 将延迟从500毫秒更改为您想要的任何延迟


  • 嗨,谢谢。你的评论提醒我,我发布了这个。我想我会更新代码,因为它在使用命令行窗口(
    q:
    )时工作不好。这很好!我可以问一下,当
    checktime
    起作用时,您是否知道一种让它写入文件读取时间戳(以及缓冲区重新加载时间戳)的方法?那太好了。终于!我已经尝试了很多让类似的东西工作的建议,但是没有一个在终端工作。这就完成了任务!谢谢。是的,我认为问题在于:set autoread仅在gui vim中有效,而不是从终端。我知道这是一个老问题,但我很难在这方面找到任何好的帮助。下面关于WatchForChanges函数的答案是金色的。
    autoread
    可以在普通vim中工作,在终端仿真器内。我非常喜欢这个解决方案的简单性,所以也将它添加到vim wiki中。为什么不使用
    :checktime
    来显式触发检查而不进行炮击?另外,Vim应该已经在FocusGain上执行此操作了,您不应该需要autocmd!如何将其添加到我的.vimrc中以使此行为成为默认行为?@StevieP在my.vimrc.Right上的相关行。谢谢@fphilipe!修女回答,看得长一点。这对我来说效果最好,似乎涵盖了所有情况。谢谢这是唯一的解决方案:我执行了
    prettier--write*
    ,我在vim中打开的所有文件都会立即得到更新-无需将模式从正常更改为插入,也无需执行其他操作来查看其他答案中的更改。虽然排名较高的其他解决方案让我头疼,但仍然无法正常工作,这一个只需复制代码就可以直接工作,而且工作起来很有魅力。这应该是最好的答案。