如果文件外部更改,如何自动检查vim?

时间:2010-02-20 19:33:37

标签: vim

我经常在vim -p的标签页中打开许多文件。自编辑开始以来,是否可以检查是否有任何文件在Vim之外被更改了?

6 个答案:

答案 0 :(得分:10)

将这些行添加到.vimrc

au FocusGained,BufEnter * :silent! checktime
au FocusLost,WinLeave * :silent! w

基本上,当Vim或当前缓冲区获得焦点时,检查并重新加载(或丢弃)外部更改,并且可选择在离开焦点时自动保存。

来源:Vim Wiki

答案 1 :(得分:6)

今天我发现了一个与此问题相关的有趣发现......

隐藏在/usr/share/vim/vim71/vimrc_example.vim中有以下命令:

" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
        \ | wincmd p | diffthis

它将打开一个类似vimdiff的窗口,其中包含当前缓冲区和底层文件,突出显示两者之间的所有更改。

答案 2 :(得分:3)

如果vim检测到对文件的外部更改,则通常会自动发出警告;但是,通过仔细阅读文档,您可以使用:checktime

手动调用该检查

不幸的是我不知道如何禁用上述自动检查来测试并查看checktime是否正确,所以这个答案可能完全偏离基础。

答案 3 :(得分:2)

使用:edit

:help :edit了解更多信息。

答案 4 :(得分:1)

您可以通过运行命令来查看活动窗口中的缓冲区是否被修改:

:set mod?

如果返回nomodified,则缓冲区的内容与相应文件的内容匹配。如果它返回modified,则缓冲区有未保存的更改。

默认情况下,如果当前缓冲区已被修改,状态行将显示[+]符号。状态行通常仅在您具有拆分窗口时才可见。如果要显示状态行,即使只有一个窗口,也请运行:

:set laststatus=2

关于Vim食谱的customizing your status line有一篇很好的文章。

答案 5 :(得分:0)

let s:pid=system("ps -p $$ -o ppid=")+0
if !exists('g:watches')
    let g:watches={}
else
    finish
endif
function! ModWatch(fname, match)
    let fname=fnamemodify(a:fname, ':p')
    if has_key(g:watches, fname)
        return
    endif
    let shellscript=
                \"while true ; do".
                \"    inotifywait ".shellescape(fname)." ; ".
                \"    kill -WINCH ".s:pid." ; ".
                \"done"
    echo shellscript
    echo shellescape(shellscript)
    let pid=system("sh -c ".shellescape(shellscript)." &>/dev/null & echo $!")+0
    call extend(g:watches, { fname : pid })
    augroup ModWatch
        execute "autocmd! BufWipeOut ".a:match
        execute "autocmd BufWipeOut ".a:match.' call DeleteWatch("'.
                    \escape(fname, '\"|').'")'
    augroup END
endfunction
function! DeleteWatch(fname)
    call system("kill ".g:watches[a:fname])
    unlet g:watches[a:fname]
endfunction
augroup ModWatch
    autocmd!
    autocmd VimResized * checktime
    autocmd BufNew * call ModWatch(expand("<afile>"), expand("<amatch>"))
augroup END