Оновлення 2015-06-25 :
- Я заблокував метод "оболонки", оскільки він був надто нефункціональним. Він припинив режим вставки та залишив зомбі-процеси. Подивіться на історію редагування цієї публікації, чи справді ви хочете її все одно побачити.
- Я зробив плагін із цього: 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 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, але, на жаль, потоки Ruby (використовуючи Thread
) не працюють у фоновому режимі, як це робить Python, тому мені не вдалося змусити це працювати (можливо, є інший спосіб, хоча?)
CursorHold
події? Якщо Vim не має фокусу, він повинен спрацьовувати кожні n секунд.