оновити змінений вміст файлу, відкритого в vi (m)


362

У мене є конфігураційний файл, який я тримаю відкритим у vim, але він іноді змінюється на диску, без цих змін відображатися на терміналі. Чи можна оновити вміст на екрані, не закриваючи і не відкриваючи файл? Якщо так, то як?



Підведення підсумків: усі відповіді поки що є "Опитування" замість "Push". Тобто, замість того, щоб отримувати зовнішню подію зміни файлу, як це було зроблено за допомогою подібних функцій іншого програмного забезпечення, ці відповіді покладаються на vim, що активно запитує зміну файлу, вручну або викликається дією користувача або таймером. Кінцевий результат - ви не побачите зміни, оновлені на екрані, миттєво.
Penghe Geng

Відповіді:


464

Ви можете використовувати :editкоманду, не вказуючи ім'я файлу, для перезавантаження поточного файлу. Якщо ви внесли зміни в файл, ви можете використовувати :edit!для примусового перезавантаження поточного файлу (ви втратите свої модифікації).

Команду :editможна скоротити на :e. Таким чином, виправити силу можна за допомогою:e!


2
Значок "!" відштовхувався від мене, але тепер зрозуміло.
twan163

107
Примітка: зазвичай це скорочення до :e!.
Стефан Шазелас

31
@StephaneChazelas: Так, це правильно :) @ twan163: Замість того , :editі :edit!ви можете використовувати :eі :e!відповідно.
Сухі

11
Втрачайте модифікації, так і ні. Що важливо, ви все ще можете зробити uце :e!.
Герріт

5
Крім того, якщо ви хочете перезавантажити всі свої буфери, запустіть::bufdo e
pkout

193

Окрім оновлення файлу вручну :edit, його можна помістити у свій~/.vimrc

:set autoread

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


2
Остерігайтеся покупця - якщо ви працюєте над свіжим кодом і git pullбудьте в курсі, ви можете ненавмисно втратити свої збережені зміни на екрані.
азатар

5
@toszter Ні, Vim оновить лише незмінені буфери. У разі змін, все ще залишатиметься запит: Зберегти чи завантажити?
Інго Каркат

10
Примітка: Автоматичне читання точно не працює автоматично. Вам або доведеться використовувати gvimабо виконувати зовнішні команди.
Sparhawk

3
Ті, хто використовує vim всередині tmux, можуть отримати фокусні події, використовуючи github.com/tmux-plugins/vim-tmux-focus-events . В іншому випадку автоначитання не допоможе в терміналі, якщо ви якось зателефонуєте:checktime
Карл Бартель

3
autoreadможна автоматично запускати X секунд після того, як курсор перестане рухатися, дивіться цю відповідь .
Том Хейл

57

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 .


2
відмінний пост! Відчуває себе однією з тих речей, де це має бути поведінка за замовчуванням
JonnyRaa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.