Обнаружить изменение файла, предложить перезагрузить файл - PullRequest
56 голосов
/ 29 мая 2009

Обычно я использую gVim для редактирования, но иногда я использую vim при удаленном подключении к моей машине.

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

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

Есть ли настройка, чтобы поведение Vim соответствовало gVim?

Ответы [ 6 ]

62 голосов
/ 29 апреля 2010

Если вы хотите открыть обновленный файл, используйте

:e

Необходимо перезагрузить открытый файл.

52 голосов
/ 29 мая 2009

Как сказал ashcatch , команда :checktime проверит изменения на диске и предложит перезагрузить. Поэтому установите Vim для автоматического запуска checktime после некоторого события. Какое событие использовать, зависит от вас. Одна из возможностей - использовать CursorHold, который срабатывает после перемещения курсора, а затем оставить его неподвижным на updatetime миллисекунд. (По умолчанию 4 секунды.)

:au CursorHold * checktime

Вы также можете установить его на WinEnter или BufWinEnter, чтобы он менялся каждый раз, когда вы переключаетесь между буферами / окнами. Если вы действительно параноик, вы можете установить его на CursorMoved, чтобы он проверял файл на диске каждый раз, когда вы перемещаете курсор, но это, вероятно, излишне и может немного задержаться.

См. :h checktime, :h updatetime, :h autocmd-events-abc.

25 голосов
/ 29 мая 2009

Это делается с помощью автоматической команды FileChangedShell. Я слишком новичок, чтобы публиковать ссылки, но лучше всего было бы прочитать часть autocmd документации vim (Google для этого)

но суть в том, чтобы установить что-то вроде следующей строки в вашем vimrc

:au FileChangedShell * echo "Warning: File changed on disk"
9 голосов
/ 25 сентября 2014

Чтобы улучшить ответ Карпера:

" Run checktime in buffers, but avoiding the "Command Line" (q:) window
au CursorHold * if getcmdwintype() == '' | checktime | endif

Без этой проверки Vim выдаст ошибки, если вы попытаетесь использовать буфер «Командная строка» (q :), потому что этот буфер не поддерживает команду :checktime. Об этом узнал благодаря kdlv на # vim.

9 голосов
/ 29 мая 2009

Вы можете вручную запустить проверку с помощью :checktime. gvim делает это каждый раз, когда восстанавливает фокусировку, поэтому нет необходимости часто выполнять ручную проверку.

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

3 голосов
/ 17 января 2018

из этого ответа (ссылка на ответ PhanHaiQuang и комментарий flukus )

Этот oneliner можно запускать из ex (в пределах vim), когда это необходимо (или помещать каждую команду в vimrc, когда открываются файлы журналов.)

:set autoread | au CursorHold * checktime | call feedkeys("lh")

Пояснение:
- autoread : читает файл при изменении извне (но он не работает сам по себе, нет внутреннего таймера или чего-то в этом роде. Он будет читать файл только тогда, когда vim выполняет действие, например, команда в ex :!
- CursorHold * checktime : когда пользователь не перемещает курсор в течение времени, указанного в 'updatetime' (которое по умолчанию составляет 4000 миллисекунд), выполняется контрольное время, которое проверяет изменения вне файла
- call feedkeys ("lh") : курсор перемещается один раз, вправо и назад влево. и тогда ничего не происходит (... что означает, что CursorHold запущен, что означает, что у нас есть loop )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...