Обнаружить изменение файла, предложить перезагрузить файл

Я обычно использую 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 запущен, что означает, что у нас есть цикл)

Другие вопросы по тегам