Я использую VIm для всех видов вещей (или gVim в данном случае), включая мониторинг вывода, записанного в файл; Я использую autoread
Vim для перечитывания файла, что он делает всякий раз, когда я переключаю фокус клавиатуры на него.
Есть ли способ заставить Vim обновлять буфер, даже если я не переключаю фокус клавиатуры? Я попытался установить, checktime
но это не имеет никакого эффекта, в то время как клавиатура фокусируется в другом месте.
Вывод, который я отслеживаю, полностью заменяет выходной файл; и я не смотрю на tail -f
это. Существуют и другие варианты, например, каждый раз добавление нового экземпляра или добавление less
чего-либо, но было бы здорово, если бы это можно было сделать с помощью VIm.
filesystem
falstro
источник
источник
CursorHold
мероприятия? Если Vim не имеет фокуса, он должен запускаться каждые n секунд.CursorHold
выполняется только один раз, это явно задокументировано как: «не срабатывает каждые« время обновления »мс, если вы покидаете Vim, чтобы приготовить кофе. :)»Ответы:
Обновление 2015-06-25 :
Что делает
autoread
?Чтобы ответить на этот вопрос, мы должны сначала понять, что
autoread
делает опция, и что более важно, что она не делает.К сожалению
:help 'autoread'
, не имеет много информации по этому поводу, он просто говорит, что «был обнаружен файл, который был изменен за пределами Vim» . Как Vim обнаруживает, что файл изменен? При определенных действиях Vim проверяет время модификации файла.Когда:
:checktime
используется;:diffupdate
используется;:e
выдается для файла, который уже имеет буфер;!
;^Z
,fg
только если оболочка имеет управление заданиями);для gVim это также делается, когда:
Я собрал эту информацию из источника Vim, найдя все вызовы
buf_check_timestamp()
,check_timestamps()
функции и места, гдеneed_check_timestamps
установленоTRUE
.Возможно, я пропустил некоторые события, но главное, что нужно помнить, это то, что Vim проверяет только то, изменен ли файл в очень ограниченном наборе обстоятельств . Он, конечно, не «опрашивает» файл на наличие изменений ни разу за n секунд, а это то, что вам нужно.
Так что для ваших целей
set autoread
этого недостаточно.Использование Python
Это запланирует поток Python для запуска в фоновом режиме, он будет запускаться
:checktime
каждые n секунд. Еслиautoread
будет включена , это будет перезагрузить буфер с диска, иначе это будет просто предупредить.Это требует, чтобы Vim имел
+python
или+python3
в:version
. Он должен работать на всех платформах (включая Windows).Вы можете начать это с помощью
:call AutoreadPython()
; Вы, конечно, можете сделать это в autocmd; например:Послесловие
На самом деле существует больше методов, например, вы можете использовать инструмент, такой как
entr
Pythoninotify
илиgamin
модуль, для отслеживания изменений в файле, а:checktime
также проверять все буферы, если ему не дано никаких аргументов, это можно улучшить, проверяя только один буфер или определенный файл.Однако этот ответ уже довольно длинный :-) Этот метод должен (надеюсь!) Работать нормально для большинства сценариев или должен легко адаптироваться к вашему сценарию.
PS. Я также пытался использовать Ruby, но, к сожалению, потоки (использующие
Thread
) Ruby не работают в фоновом режиме, как это делает Python, поэтому я не смог заставить это работать (хотя, возможно, есть другой способ?)источник
Я сделал небольшой плагин vim-autoread, который используется
tail -f
для асинхронного обновления буфера в фоновом режиме. Это, очевидно, требует особой работы Vim версии 8.Используйте,
:AutoRead
чтобы включить и:AutoRead!
выключить его.источник
В Neovim вы можете использовать следующую команду, которая откроет буфер терминала, выполняющий команду tail.
Это продолжит работать, даже если файл будет удален и создан заново.
Или добавьте следующее к вашему
$MYVIMRC
источник
из этого ответа (ссылаясь на ответ от PhanHaiQuang и комментарий от flukus )
При необходимости можно запустить этот oneliner из ex (с vim) (или поместить каждую команду в vimrc, когда открываются лог-файлы).
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Объяснение:
- autoread : читает файл при изменении извне (но он не работает сам по себе, нет внутреннего таймера или чего-то в этом роде. Он будет читать файл только тогда, когда vim выполняет действие, как команда в ex
:!
- CursorHold * checktime : когда курсор не перемещается пользователем в течение времени, указанного в 'updatetime' (которое по умолчанию составляет 4000 миллисекунд), выполняется контрольное время, которое проверяет изменения вне файла
- call feedkeys ("lh") : курсор перемещается один раз, вправо и назад влево, а затем ничего не происходит (... это означает, что CursorHold запущен, что означает, что у нас есть цикл )
источник