обновить измененное содержимое файла, открытого в vi (m)

У меня есть конфигурационный файл, который я сохраняю в vim, но иногда меняет его на диск, без изменения этих изменений на терминале. Можно ли обновить содержимое на экране без закрытия и повторного открытия файла? Если да, то как?

vim
305 голосов | спросил twan163 8 PM00000030000000531 2014, 15:28:05

3 ответа


397

Вы можете использовать команду :edit, не указав имя файла, чтобы перезагрузить текущий файл. Если вы внесли изменения в файл, вы можете использовать :edit!, чтобы принудительно перезагрузить текущий файл (вы потеряете свой модификаций).

ответил Thushi 8 PM00000030000004131 2014, 15:31:41
179

В дополнение к ручному обновлению файла с помощью :edit вы можете поместить в свой ~/.vimrc

:set autoread

, чтобы Vim автоматически обновлял любые файлы, которые не редактировались Vim. Также см. :checktime.

ответил Ingo Karkat 8 PM00000030000005831 2014, 15:51:58
26

TL; DR

Перейдите к заголовку Wrap-up для строк vimrc, которые нужно добавить, чтобы сделать вашу жизнь лучше.

Вручную

Выполнить :checktime

  

Проверьте, не были ли изменены какие-либо буферы вне Vim.               Это проверяет и предупреждает вас, если вы закончите с двумя               версии файла.

Автоматически

Чтобы автоматически загружать изменения, добавьте в свой vimrc:

set autoread

  

Когда обнаружен файл, который был изменен вне 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 .

ответил Tom Hale 1 AM00000060000001031 2017, 06:42:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132