Как перезагрузить текущий файл?

145

Довольно часто я работаю с файлами, которые контролируются версиями, поэтому возможно внесение изменений в них вне Vim.

Какой быстрый способ перезагрузить файл, не закрывая и не открывая Vim? И есть ли способ сделать это автоматически?

Кевин Браун
источник
" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Том Хейл,
Если вы установили vim-faq , вы можете получить оффлайн ответ: :h vim-faqи искать /reload. Трудно запомнить тег :h faq-5.8.
Хотчке

Ответы:

171

Команда, которую вы хотите, это :e(сокращение от :edit). Если вы используете :edit!его, он отменит локальные изменения и перезагрузится.

Вы также можете сделать так, чтобы vim делал это автоматически set autoreadв вашем vimrc.

xthrd
источник
5
Смотрите этот ответ для предостережений и решений, касающихся autoread.
Том Хейл,
4
Чтобы сделать это для всех буферов, используйте :bufdo :eили:bufdo :e!
Аарон Х.
1
@AaronH. Спасибо тебе за это! Обычно я открываю сотни буферов одновременно, и при переключении веток я обычно просто закрываю vim и перезагружаюсь, чтобы обновить все буферы новым содержимым. Это будет серьезная экономия времени!
g19fanatic
1
@AaronH. Второе не :является обязательным: :bufdo eбудет работать так же.
JoL
19

Во многих случаях set autoreadне сработает, так как этот ответ объясняет:

Авточитание не перезагружает файл, если вы не выполните что-то вроде запуска внешней команды (например, !lsили !shт. Д.)

События фокуса сработают autoread, но они не фиксируются, если не используются gvim. Так что, если обычный запуск выполняется vimв окне терминала или tmux, установите плагин vim-tmux-focus-events .

В версиях tmux> 1.9 вам нужно добавить .tmux.conf:

set -g focus-events on

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

au FocusGained,BufEnter * :checktime
Том Хейл
источник
Это раздражало меня годами. Спасибо за тщательное решение! 💯😄
Натан Лонг
8

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

tommcdo
источник
3

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

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

und3rdg
источник
Добро пожаловать на биржу стеков Vi. Это почти ссылка только для ответа. Вы можете улучшить его, описав плагин (например, что он делает? Как использовать его для достижения целей ОП?)
Джон ОМ.
0

У меня была проблема с просмотром содержимого файла, внешним обновлением файла, отображением измененного файла и возможностью его редактирования при необходимости. Я решил это с помощью параметров командной строки Vim server / remote, вдохновленных этим ответом .


С помощью следующих команд файл может быть перезагружен с помощью внешней команды. Во-первых, откройте файл с помощью Vim при запуске экземпляра сервера.

vim --servername JABBERWOCKY /tmp/alice.log

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

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

Если открытый файл был изменен в Vim и внешне, при перезагрузке возникнет конфликт (появится предупреждающее сообщение). Для этого случая должно быть принято решение: оставьте это с этим и сохраните изменения в Vim, или отмените локальные изменения и выполните перезагрузку .


Команда, указанная --remote-sendвыше, требует ручной перезагрузки. Тем не менее, эта команда может быть привязана к простому циклу, используя Bash 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>"
Piscoris
источник