Как я могу сделать vim проверить автоматически, если файл изменился внешне? - PullRequest
9 голосов
/ 20 февраля 2010

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

Ответы [ 6 ]

10 голосов
/ 24 февраля 2010

Добавьте эти строки в ваш .vimrc:

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

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

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

6 голосов
/ 25 февраля 2010

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

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

3 голосов
/ 20 февраля 2010

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

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

2 голосов
/ 20 февраля 2010

Использование :edit

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

1 голос
/ 22 февраля 2010

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

:set mod?

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

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

:set laststatus=2

Есть хорошая статья о настройке строки состояния в Vim Recipes.

0 голосов
/ 21 февраля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...