Как я могу автоматически проверить vim, если файл изменился извне?

обычно я открываю много файлов на вкладках с помощью vim -p. Можно ли проверить, был ли какой-либо из файлов изменен за пределами Vim с момента начала редактирования?

6 ответов


добавить эти строки в свой .vimrc:

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

в основном, проверьте и перезагрузите (или отбросьте) внешние изменения, когда Vim или текущий буфер получают фокус, и, возможно, автоматическое сохранение при выходе из фокуса.

источник: Vim Wiki.


я наткнулся на интересную находку, связанную с этим вопросом сегодня...

скрытые в /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 - подобное окно с текущим буфером и базовым файлом, выделяющим все изменения между ними.


vim обычно предупреждает меня автоматически, если он обнаруживает внешнее изменение файла; однако, из просмотра документации похоже, что вы можете вызвать эту проверку вручную с помощью :checktime

к сожалению, я не знаю, как отключить эту вышеупомянутую автоматическую проверку, чтобы проверить и посмотреть, правильно ли работает checktime, поэтому этот ответ может быть полностью отключен.


использовать :edit

:help :edit для получения дополнительной информации.


вы можете узнать, изменен ли буфер в активном окне, выполнив команду:

:set mod?

если он возвращает nomodified, затем содержимое буфера соответствует содержимому соответствующего файла. Если он вернется modified, то буфер имеет несохраненные изменения.

по умолчанию строка состояния показывает [+] символ если текущий буфер был изменен. Строка состояния обычно отображается только в том случае, если окна разделены. Если вы хотите показать строку состояния , даже если у вас есть только одно окно, запустите:

:set laststatus=2

есть хорошая статья про настройки строке состояния по рецептам Vim.


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