24

Предполагая, что файл не имеет несохраненных изменений в буфере VIM, я бы хотел, чтобы он автоматически перезагружался, если файл изменяется на диске. Наиболее частый вариант использования этого - когда я обновляю рабочую копию, в которой находится файл.

Как мне этого добиться?

6 ответов6

26

В вашем ~/.vimrc:

set autoread
9

Это то, что сработало для меня

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

Первая строка не была достаточно сама по себе. Вы можете положить в вас .vimrc

кредит Фан Хай Куанг

4

Авточитание не работает правильно. Следующие работы для меня:

Вы должны сначала установить скрипт здесь.

Я получил лучшие результаты, вызвав функцию настройки напрямую, вот так.

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

Причина этого в том, что я хочу запустить установку ipython/screen/vim.

Вы можете легко преобразовать это в расширенную версию представления.

Сценарий процесса ..

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt
2

плагин vim-autoread сработал для меня до сих пор:

ВИМ-AutoRead

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

1

из этого ответа (ссылаясь на ответ PhanHaiQuang и комментарий @flukus)

При необходимости можно запустить этот oneliner из ex (с vim) (или поместить каждую команду в vimrc, когда открываются файлы журнала).

:set autoread | au CursorHold * checktime | call feedkeys("lh")

Объяснение:
- autoread: читает файл при изменении извне (но он не работает сам по себе, нет внутреннего таймера или чего-то в этом роде). Он будет читать файл только тогда, когда vim выполняет действие, например, команду ex :!
- CursorHold * checktime: когда пользователь не перемещает курсор в течение времени, указанного в 'updatetime' (по умолчанию 4000 miliseconds), выполняется контрольное время, которое проверяет изменения вне файла
- call feedkeys ("lh"): курсор перемещается один раз, вправо и назад влево. и тогда ничего не происходит (... что означает, что CursorHold запущен, что означает, что у нас есть цикл)

0

Есть некоторые плагины , перечисленные здесь , которые могут работать в зависимости от версии Vim.

Другой подход заключается в периодической отправке команды checktime в vim из внешнего процесса. Вот скрипт ShellJS для этого (требуется shelljs-plugin-sleep , NeoVim и nvr)

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .