Автозавантаження файлу в VIM, як тільки він змінюється на диску


33

Якщо припустити, що у файлі немає збережених змін у буфері VIM, я хотів би, щоб він автоматично завантажувався, якщо файл змінюється на диску. Найчастішим випадком використання для цього є те, коли я оновлюю робочу копію, в якій знаходиться файл.

Як я можу цього досягти?


Я думаю, це саме те, що ти маєш на увазі, але мій конкретний випадок використання - коли я перевіряю іншу гілку git або здійснюю, я хочу, щоб vim перезавантажив файл.
Натан Лонг

Відповіді:



11

Це те, що працювало для мене

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

Перший рядок був недостатній сам по собі. Ви можете вкласти в себе.vimrc

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


Autocmd не повинен бути необхідним - час перевірки повинен запускатися всередину одночасно, коли запускається подія CursorHold. Іншими словами, ви просто змушуєте Vim робити другий контрольний час.
Гептит

Для мене це необхідно. Найкраще рішення, яке я знайшов після багатьох досліджень. @Heptite, чи є у вас розділ і вірш для вашого твердження?
Том Хейл

1
@TomHale Я переглянув документи Vim, і це прямо не говорить, наскільки я можу сказати, але :help timestamp, здавалося б , " " вказує на те, що я помиляюся, і що Vim виконує перевірку лише на конкретні події, тож autocmd може знадобитися, щоб він частіше перевіряв.
Гептит

5

Авторедакт працює неправильно. Наступні роботи для мене:

Спершу потрібно встановити скрипт звідси .

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

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

1
Якщо ви використовуєте один із графічних інтерфейсів vim, таких як gVim або MacVim, команда autoread добре інтегрується з рештою середовища. Наприклад, редагування файлу в іншій програмі, іншому редакторі або з керування джерелом, а потім перехід назад до vim автоматично прочитає оновлені файли. Здається, проблема полягає в тому, як інтегрується термінальна версія vim. Версія терміналу не може визначити, коли ви переходите між програмами або в графічному інтерфейсі, або використовуєте термінальні мультиплексори, такі як tmux, тому вона не може автоматично прочитати у відповідний час. Було б добре, якби vim просто підписався на відповідні події файлової системи.
bames53

3

плагін vim-autoread для мене працював досі:

vim-autoread

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


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
Бургі

@Burgi Я додав опис плагіна, який пояснює, як він вирішує проблему.
Войтек Крушевський

Я спробував це, але мені потрібно набрати команду навігації (як j), щоб побачити ефективне оновлення. Я створив тут питання про це: github.com/djoshea/vim-autoread/isissue/3
Мартін Деллі

3

з цієї відповіді (посилаючись на відповідь PhanHaiQuang та коментар @flukus)

Можна запустити цей oneliner з ex (whithin vim) за потреби (або поставити кожну команду в vimrc, коли відкриваються файли журналу.)

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

Пояснення:
- autoread : читає файл при зміні ззовні (але він не працює сам по собі, немає внутрішнього таймера чи щось подібне. Він буде читати файл лише тоді, коли vim виконує дію, як команда в ex :!
- CursorHold * checktime : коли курсор не переміщується користувачем протягом часу, визначеного у 'updatetime' (який за замовчуванням становить 4000 мілісекунд), виконується контрольний час, який перевіряє зміни поза файлом
- виклики виклику ("lh") : курсор переміщується один раз, праворуч і назад ліворуч, і тоді нічого не відбувається (... це означає, що CursorHold спрацьовує, це означає, що у нас є цикл )


lhне робить нічого, якщо курсор знаходиться в останньому положенні на лінії, lhзмінить своє місцезнаходження.
Махмуд Аль-Кудсі

Саме в цьому справа. Файл перезавантажується з мінімумом взаємодії або змін у файлі. Ви можете перейти до останнього чи першого рядка, якщо хочете (просто замініть lh на gg чи G), але мета тут - просто перезавантажити файл у vim, і ось що зроблено цим одноклассником, нічого більше. Що ти любиш робити тут?
eli

@ MahmoudAl-Qudsi ... це означає, що "lh" просто запускає CursorHold - дію (я вже згадував це в Поясненні), яка потім знову запускає авторедагування
eli

1

Є деякі плагіни , перераховані тут , які могли б працювати в залежності від версії 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}`) );
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.