Оновлення 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()
Післямова
Насправді існує більше методів, наприклад, ви можете використовувати такий інструмент, як
entrPython inotifyабо gaminмодуль для контролю за файлом змін, а :checktimeтакож перевіряє всі буфери, якщо йому не надано жодних аргументів, це можна покращити, перевіривши лише один буфер або певний файл.
Однак ця відповідь вже досить тривала :-) Цей метод повинен (сподіваємось!) Добре працювати у більшості сценаріїв, або повинен легко адаптуватися до вашого сценарію.
PS. Я також намагався використовувати Ruby, але, на жаль, потоки Ruby (використовуючи Thread) не працюють у фоновому режимі, як це робить Python, тому мені не вдалося змусити це працювати (можливо, є інший спосіб, хоча?)
CursorHoldподії? Якщо Vim не має фокусу, він повинен спрацьовувати кожні n секунд.