Как я могу автоматически проверить 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, поэтому этот ответ может быть полностью отключен.
вы можете узнать, изменен ли буфер в активном окне, выполнив команду:
: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