我经常在vim -p
的标签页中打开许多文件。自编辑开始以来,是否可以检查是否有任何文件在Vim之外被更改了?
答案 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)
: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