У меня есть config-файл, который я сохраняю открытым в vim, но иногда он изменяется на диске, и эти изменения не отражаются на терминале. Могу ли я обновить содержимое на экране без закрытия и повторного открытия файла? Если так, то как?
У меня есть config-файл, который я сохраняю открытым в vim, но иногда он изменяется на диске, и эти изменения не отражаются на терминале. Могу ли я обновить содержимое на экране без закрытия и повторного открытия файла? Если так, то как?
Ответы:
Вы можете использовать :edit
команду без указания имени файла, чтобы перезагрузить текущий файл. Если вы внесли изменения в файл, вы можете использовать
:edit!
для принудительной перезагрузки текущего файла (вы потеряете ваши изменения).
Команда :edit
может быть сокращена до :e
. Таким образом, принудительное редактирование может быть выполнено:e!
:e!
.
:edit
и :edit!
вы можете использовать :e
и :e!
соответственно.
u
отменить :e!
.
:bufdo e
В дополнение к обновлению файла вручную :edit
, вы можете поместить в свой~/.vimrc
:set autoread
чтобы Vim автоматически обновлял любые файлы, которые не были отредактированы Vim. Также см :checktime
.
git pull
помните, что несохраненные изменения могут быть потеряны на экране довольно непреднамеренно.
gvim
, либо запустить внешние команды.
:checktime
autoread
может быть автоматически запущен через X секунд после того, как курсор перестанет двигаться, см. этот ответ .
Перейдите к Wrap-up
заголовку, vimrc
чтобы добавить строки, чтобы сделать вашу жизнь лучше.
Бегать :checktime
Проверьте, были ли какие-либо буферы изменены за пределами Vim. Это проверяет и предупреждает вас, если вы получите две версии файла.
Чтобы автоматически загружать изменения, добавьте в vimrc
:
Если обнаружено, что файл был изменен вне Vim и не был изменен внутри Vim, автоматически прочитайте его снова. Когда файл был удален, это не делается.
Этот ответ добавляет предостережение:
Авточитание не перезагружает файл, если вы не выполните что-то вроде запуска внешней команды (например,
!ls
или!sh
т. Д.)
Продолжайте читать для решений.
Добавьте к вашему vimrc
:
au CursorHold,CursorHoldI * checktime
По умолчанию CursorHold срабатывает после того, как курсор остается неподвижным в течение 4 секунд, и настраивается через время обновления .
Добавьте следующее к вашему, vimrc
чтобы срабатывать autoread
при изменении буферов внутри vim:
au FocusGained,BufEnter * :checktime
Чтобы 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
.