Обновление 2015-06-25 :
- Я отказался от метода «shell», так как он был слишком нефункциональным. Он остановил режим вставки и оставил процессы зомби. Посмотрите на историю изменений в этих постах, вы действительно хотите увидеть это в любом случае.
- Я сделал плагин из этого: auto_autoread.vim . На данный момент он фактически совпадает с приведенным ниже кодом, но я бы порекомендовал вам использовать плагин, поскольку он может получать обновления.
Что делает 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).
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
Вы можете начать это с помощью :call AutoreadPython()
; Вы, конечно, можете сделать это в autocmd; например:
autocmd *.c call AutoreadPython()
Послесловие
На самом деле существует больше методов, например, вы можете использовать инструмент, такой как
entr
Python inotify
или gamin
модуль, для отслеживания изменений в файле, а :checktime
также проверять все буферы, если ему не дано никаких аргументов, это можно улучшить, проверяя только один буфер или определенный файл.
Однако этот ответ уже довольно длинный :-) Этот метод должен (надеюсь!) Работать нормально для большинства сценариев или должен легко адаптироваться к вашему сценарию.
PS. Я также пытался использовать Ruby, но, к сожалению, потоки (использующие Thread
) Ruby не работают в фоновом режиме, как это делает Python, поэтому я не смог заставить это работать (хотя, возможно, есть другой способ?)
CursorHold
мероприятия? Если Vim не имеет фокуса, он должен запускаться каждые n секунд.