обновить измененное содержимое файла, открытого в vi (m)
У меня есть конфигурационный файл, который я сохраняю в vim, но иногда меняет его на диск, без изменения этих изменений на терминале. Можно ли обновить содержимое на экране без закрытия и повторного открытия файла? Если да, то как?
3 ответа
Вы можете использовать команду :edit
, не указав имя файла, чтобы перезагрузить
текущий файл. Если вы внесли изменения в файл, вы можете использовать
:edit!
, чтобы принудительно перезагрузить текущий файл (вы потеряете свой
модификаций).
В дополнение к ручному обновлению файла с помощью :edit
вы можете поместить в свой ~/.vimrc
:set autoread
, чтобы Vim автоматически обновлял любые файлы, которые не редактировались Vim. Также см. :checktime
.
TL; DR
Перейдите к заголовку Wrap-up
для строк vimrc
, которые нужно добавить, чтобы сделать вашу жизнь лучше.
Вручную
Выполнить :checktime
Проверьте, не были ли изменены какие-либо буферы вне Vim. Это проверяет и предупреждает вас, если вы закончите с двумя версии файла.
Автоматически
Чтобы автоматически загружать изменения, добавьте в свой vimrc
:
Когда обнаружен файл, который был изменен вне Vim и он не был изменен внутри Vim, автоматически прочитал его снова. Когда файл был удален, это не будет выполнено.
Этот ответ добавляет оговорку:
Autoread не перезагружает файл, если вы не выполняете что-то вроде запуска внешней команды (например,
!ls
или!sh
и т. д.)
Читайте дальше для решений.
Триггер при перемещении курсора
Добавьте в свой vimrc
:
au CursorHold,CursorHoldI * checktime
По умолчанию CursorHold запускается после того, как курсор остается неподвижным в течение 4 секунд , и настраивается через обновленное время .
Триггер по изменению буфера или фокусу терминала
Добавьте к вашему vimrc
следующее, чтобы вызвать autoread
при смене буферов, а внутри vim:
au FocusGained,BufEnter * :checktime
Улавливание фонового изображения оконечного окна внутри обычного vim
Чтобы FocusGained
(см. выше) работать в обычном vim, внутри эмулятора терминала (Xterm, tmux и т. д.) установите плагин:
vim-tmux-focus-events
В версиях tmux> 1.9, вам нужно добавить в .tmux.conf
:
set -g focus-events on
Итоговое
Уведомления, когда триггеры autoread
также доступны .
Вот мои строки vimrc
, чтобы реализовать все вышеперечисленное:
" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
\ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None
Благодаря ErichBSchulz для указания меня в правильном направлении с помощью au CursorHold
.