У меня есть 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 .