Як перезавантажити поточний файл?


145

Досить часто я працюю з файлами, які контролюються версією, тому можливо внести зміни до них поза Vim.

Який швидкий спосіб перезавантажити файл без закриття та повторного відкриття Vim? І чи є спосіб зробити це автоматично?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Том Хейл

Якщо ви встановили vim-faq , ви можете отримати офлайн-відповідь там: :h vim-faqта шукайте /reload. Важко запам'ятовується тег :h faq-5.8.
Hotschke

Відповіді:


172

Команда, яку ви хочете, є :e(скорочена для :edit). Якщо ви користуєтесь :edit!цим, відкинете локальні зміни та перезавантажте.

Ви також можете мати vim робити це автоматично з set autoreadвашим vimrc.


5
Дивіться цю відповідь на застереження та рішення щодо autoread.
Том Хейл

4
Для цього для всіх буферів використовуйте :bufdo :eабо:bufdo :e!
Аарон Х.

1
@AaronH. Дякую тобі за це! Зазвичай у мене відкриваються сотні буферів одночасно, і при перемиканні гілок я зазвичай просто закриваю vim і перезапускаю, щоб оновити всі буфери новим вмістом. Це буде головна економія часу!
g19fanatic

1
@AaronH. Другий :- необов’язковий: :bufdo eбуде працювати так само.
JoL

19

У багатьох випадках set autoreadне вийде, оскільки ця відповідь пояснює:

AutoRead НЕ перезавантажувати файл , якщо ви робите що - щось на зразок запуску зовнішньої команди (як !lsі !shт.д.)

Фокусні події запускаються autoread, але вони не фіксуються, якщо не використовуються gvim. Отже, якщо запускається звичайне vimвікно терміналу або tmux, встановіть плагін vim-tmux-focus-події .

У версіях tmux> 1.9 вам потрібно буде додати .tmux.conf:

set -g focus-events on

Для додаткової користі додавання наступного до вашого vimrcзапустить autoreadпри зміні буферів всередині vim:

au FocusGained,BufEnter * :checktime

Це мене дратує роками. Дякуємо за ретельне рішення! 💯😄
Натан Лонг

9

Якщо ви коли-небудь запускали зовнішню команду від Vim, яка модифікує поточний буфер, можливо, ви помітили, що вона пропонує вам перезавантажити файл з моменту внесення змін на диск. Ви можете фактично викликати цей рядок за допомогою :checktimeкоманди.


3

Хороший плагін для покращення autoread https://github.com/djoshea/vim-autoread

Автоматично викликає vim для перезавантаження файлів, записаних на диск, але не змінених у буфері з моменту останнього запису з vim. Це дозволяє редагувати відкритий файл in vim за допомогою іншої програми та зберігати його. Після повернення до vim, якщо ви не змінили файл з моменту останньої зміни, файл буде автоматично оновлений, щоб відобразити зміни, внесені на диск, як би ви натиснули: e вручну.


Ласкаво просимо на біржу Vi Stack. Це майже відповідь лише на посилання. Ви можете покращити його, описуючи плагін (наприклад, що він робить? Як можна використовувати його для досягнення цілей ОП?)
Джон О'М.

0

У мене виникла проблема з переглядом вмісту файлу, оновленням файлу зовні, відображенням зміненого файлу та можливістю редагувати його за потреби. Я вирішив це за допомогою параметрів сервера / віддаленого командного рядка Vim, натхненних цією відповіддю .


За допомогою наступних команд файл можна перезавантажити за допомогою зовнішньої команди. Спочатку відкрийте спірний файл із Vim, запускаючи примірник сервера.

vim --servername JABBERWOCKY /tmp/alice.log

Припустимо, що файл змінено зовні, наприклад, a echo "Curiouser and curiouser" >> /tmp/alice.log. У разі необхідності надішліть команду серверу, щоб перезавантажити файл. Ця команда швидко закінчиться і не породить нового редактора.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

Якщо відкритий файл було змінено у Vim та зовні, під час перезавантаження виник конфлікт (з’явиться попереджувальне повідомлення). У такому випадку потрібно прийняти рішення: залиште це за допомогою і збережіть зміни у Vim, або відмовтесь від локальних змін та змусити перезавантажити .


Команда, описана --remote-sendвище, вимагає перезавантажити вручну. Однак, ця команда може бути прив'язана до простого циклу, використовуючи Bash's for/ whileабо використовуючи хакі-однолінійку в Linux / Unix:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

Хоча не перевірено, я впевнений, що щось подібне може бути реалізовано і в PowerShell.

У Linux / Unix підхід, керований подіями, може бути реалізований, прослуховуючи події файлової системи, використовуючи, наприклад, бібліотеку inotify , якщо ви не використовуєте занадто божевільні файлові системи. Особисто мені подобається багато використовувати інструмент entr , який, здається, входить до основних дистрибутивів Linux. Тоді я отримую:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.