Каков порядок событий WinEnter, BufEnter, BufRead, Syntax, FileType?

16

Я прошел через autocmd.txtпомощь, но информация об этом разбросана и не всегда присутствует (например, с BufRead).

Может ли кто-то, кто хорошо понимает это, перечислить порядок этих событий - возможно, с условиями, отмеченными в параграфах, как

WinEnter   
BufEnter (if this window is for a different buffer than the current)

и так далее, для удобства?

Примечание (скопировано из моего собственного комментария ниже) : я не говорю об отдельных объяснениях их, которые в порядке, а о том, как они взаимодействуют друг с другом и в каком порядке они происходят. Например, WinEnterговорит: «Vim выполняет автокоманды BufEnter после автокоманд WinEnter», TabEnterговорит «После запуска WinEnter и до запуска события BufEnter» все это разбросано по многим параметрам. А иногда это вообще не упоминается (например BufRead, не упоминается, запускается ли он после BufEnter или раньше - возможно, эксперт может сделать вывод из какой-то другой информации, но я не могу.
Итак, мое намерение здесь состоит в том, чтобы создать единую простую ссылку на порядок этих событий, который может быть быстро найден неспециалистами,autocmd технические характеристики события.

sundar - Восстановить Монику
источник
Я думаю, что большинство объяснений в порядке, можете ли вы дать список тех, которые вы не можете понять?
nobe4
@ Nobe4 Я не говорю об отдельных их объяснениях, которые действительно хороши, а о том, как они взаимодействуют друг с другом и в каком порядке они происходят. Например, WinEnterговорит: «Vim выполняет автокоманды BufEnter после автокоманд WinEnter», TabEnterговорит «После запуска WinEnter и до запуска события BufEnter» все это разбросано по многим параметрам. И иногда это вообще не упоминается (например BufRead, не упоминается, запускается ли он после BufEnter или раньше - может быть, эксперт может сделать вывод из какой-то другой информации, но я не могу.
sundar - Восстановить Монику
Итак, мое намерение здесь состоит в том, чтобы создать единую простую ссылку на порядок этих событий, которая может быть быстро найдена неспециалистами, чтобы быть более точной в наших autocmdспецификациях событий.
sundar - Восстановить Монику
ОК, я не понял вопроса. Вы можете попытаться зарегистрировать каждое событие и посмотреть порядок появления (я могу ответить, если хотите)
nobe4
На самом деле вы намереваетесь спросить кого-то, предоставившего такую ​​простую ссылку, а не создать ее (себя);)
VanLaser

Ответы:

11

Чтобы завершить ответ @sundar:

Вы можете регистрировать порядок событий просто с помощью функции регистрации:

augroup EventLoggin
  autocmd!
  autocmd BufNewFile * call s:Log('BufNewFile')
  autocmd BufReadPre * call s:Log('BufReadPre')
  ...
  autocmd User * call s:Log('User')
augroup END

function! s:Log(eventName) abort
  silent execute '!echo '.a:eventName.' >> log'
endfunction

Смотрите полный файл здесь: https://gist.github.com/nobe4/aa8313fe98ca8821afad

После этого tail -f logвы можете получать информацию о событиях автокоманд в реальном времени.

nobe4
источник
3
Я сделал простой плагин для этого, смотрите здесь .
Карл Ингве Лервог,
6
Обратите внимание, что @ KarlYngveLervåg переместил свой плагин в другой путь . Спасибо, Карл!
Люк Эрмитт
Спасибо, что заметили и прокомментировали, Люк! (Примечание: я не могу обновить свой комментарий, чтобы исправить неработающую ссылку, извините!)
Карл Ингве Лервог
10

Я попытался найти это с разными наборами ключевых слов, и с одной попытки попытался получить такой результат: http://www.ibm.com/developerworks/library/l-vim-script-5/

В частности, эта часть относится к текущему вопросу:

Например, если вы запустите Vim, отредактируете файл с именем demo.txt, переключитесь в режим вставки, введите какой-нибудь текст, сохраните файл и выйдите из него, ваш сеанс Vim получит серию событий, аналогичную показанной в листинге 1.

Листинг 1. Последовательность событий в простом сеансе редактирования Vim

> vim

  1. BufWinEnter (создать окно по умолчанию)
  2. BufEnter (создать буфер по умолчанию)
  3. VimEnter (запустить сеанс Vim) : редактировать demo.txt
  4. BufNew (создать новый буфер для содержания demo.txt)
  5. BufAdd (добавить этот новый буфер в список буферов сеанса)
  6. BufLeave (выход из буфера по умолчанию)
  7. BufWinLeave (выход из окна по умолчанию)
  8. BufUnload (удалить буфер по умолчанию из списка буферов)
  9. BufDelete (освободить буфер по умолчанию)
  10. BufReadCmd (прочитать контексты demo.txt в новый буфер)
  11. BufEnter (активировать новый буфер)
  12. BufWinEnter (активировать окно нового буфера)
  13. InsertEnter (переключиться в режим вставки)

Это все еще не полностью всесторонне (например, никакое упоминание BufReadaka BufReadPost, но я предполагаю, что это прибудет после BufReadCmd), но это - превосходное начало.

Одним из важнейших недостающая часть информации , хотя это , как FileTypeи Syntaxautocmd события взаимодействуют с этим (при условии , filetypeи syntaxуже дальше, и открыт новый файл , чей тип файла и синтаксис , как известно Vim).

sundar - Восстановить Монику
источник
7
Это верно только при редактировании одного файла. Вопреки распространенному мнению, порядок применения autocmds в нескольких файлах не является четко определенным. И даже с одним файлом, порядок изменился несколько раз с версией Vim. Проблемы, которые это может (и делают) вызывать плагины, обсуждались до смерти на vim_dev, и общий дизайн не изменится в предсказуемом будущем. Что касается всестороннего понимания, apply_autocmdsв источниках Vim 7.4.827 есть 139 случаев . Удачи с этим.
Сато Кацура
@SatoKatsura Это то мнение эксперта, которое я искал, спасибо! Есть ли какая-нибудь рекомендация, которую вы можете предложить, чтобы узнать больше об этом (кроме погружения в источники Vim)? Кроме того, это может быть совершенно не в вашей сфере интересов, но есть ли у вас какие-либо идеи, если вещи лучше определены в «неовиме»?
sundar - Восстановить Монику
Боюсь, я не знаю ни одной конкретной ссылки. autocmdВ Vim беспорядок, я не думаю, что на самом деле можно написать точную ссылку, за исключением нескольких простых случаев. Я полагаю, что все просто соглашаются на «обычно работает» и пожимают плечами, когда это не так. Что касается неовима, лично у меня смешанные чувства по поводу проекта. Я не смотрел код недавно; Я полагаю, вы можете получить ответ на их вопрос трекера.
Сато Кацура
Также сам термин «событие» должен подорвать идею слишком фиксированного порядка.
VanLaser