У мене є конфігураційний файл, який я тримаю відкритим у vim, але він іноді змінюється на диску, без цих змін відображатися на терміналі. Чи можна оновити вміст на екрані, не закриваючи і не відкриваючи файл? Якщо так, то як?
У мене є конфігураційний файл, який я тримаю відкритим у 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, автоматично прочитайте його ще раз. Коли файл буде видалено, цього не робиться.
Ця відповідь додає застереження:
AutoRead НЕ перезавантажувати файл , якщо ви робите що - щось на зразок запуску зовнішньої команди (як
!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
.