Обнаружить изменение файла, предложить перезагрузить файл
Я обычно использую gVim для редактирования, но иногда я использую vim при удаленном подключении к моей машине.
Когда у меня есть файл, открытый в gVim, и он изменился извне (например, новые обновления из репозитория), gVim предлагает перезагрузить его.
Однако когда такое происходит с Vim, он ничего не делает, пока вы не попытаетесь сохранить файл. Он просто предупреждает вас, что файл изменился, но не предлагает перезагрузить его.
Есть ли настройка, чтобы поведение Vim соответствовало gVim?
6 ответов
Это делается с помощью автоматической команды FileChangedShell. Я слишком новичок, чтобы публиковать ссылки, но лучше всего было бы прочитать часть autocmd в документации vim (Google для этого)
но суть в том, чтобы установить что-то вроде следующей строки в вашем vimrc
:au FileChangedShell * echo "Warning: File changed on disk"
Если вы хотите открыть обновленный файл, используйте
:e
Следует перезагрузить открытый файл.
Как сказал ashcatch, :checktime
Команда проверит изменения на диске и предложит перезагрузить. Так что установите Vim для запуска checktime
автоматически после некоторого события. Какое событие использовать, зависит от вас. Одна из возможностей заключается в использовании CursorHold
, который срабатывает после того, как вы переместите курсор, а затем оставьте его на месте updatetime
миллисекунды. (По умолчанию 4 секунды.)
:au CursorHold * checktime
Вы также можете установить его WinEnter
или же BufWinEnter
поэтому он меняется каждый раз, когда вы переключаетесь между буферами / окнами. Если вы действительно параноик, вы можете включить его CursorMoved
поэтому он проверяет файл на диске каждый раз, когда вы перемещаете курсор, но это, вероятно, излишне и может немного задержаться.
Увидеть :h checktime
, :h updatetime
, :h autocmd-events-abc
,
Чтобы улучшить ответ Карпера:
" Run checktime in buffers, but avoiding the "Command Line" (q:) window
au CursorHold * if getcmdwintype() == '' | checktime | endif
Без этой проверки Vim будет выдавать ошибки, если вы попытаетесь использовать буфер "Командная строка" (q:), потому что этот буфер не поддерживает :checktime
команда. Об этом узнал благодаря kdlv на #vim.
Вы можете вручную запустить проверку с помощью :checktime
, gvim делает это каждый раз, когда восстанавливает фокус, поэтому нет необходимости часто выполнять ручную проверку.
Я не знаю, есть ли другой подход (например, автоматическая проверка через определенный промежуток времени).
Из этого ответа (ссылаясь на ответ от Phan Hai Quang и комментарий от flukus)
При необходимости можно запустить этот oneliner из ex (в vim) (или поместить каждую команду в vimrc, когда открываются log-файлы).
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Объяснение:
- autoread: читает файл при изменении извне (но он не работает сам по себе, нет внутреннего таймера или чего-то в этом роде. Он будет читать файл только тогда, когда vim выполняет действие, например команду в ex :!
- CursorHold * checktime: когда курсор не перемещается пользователем в течение времени, указанного в 'updatetime' (которое по умолчанию составляет 4000 миллисекунд), выполняется контрольное время, которое проверяет изменения вне файла
- call feedkeys ("lh"): курсор перемещается один раз, вправо и назад влево. и тогда ничего не происходит (... что означает, что CursorHold запущен, что означает, что у нас есть цикл)