Який порядок подій 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 Технічні характеристики події


Я думаю, що більшість пояснень добре, чи можете ви дати список тих, яких ви не можете зрозуміти?
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ви зможете отримувати активні події в режимі реального часу.


3
Я зробив простий плагін для цього, дивіться тут .
Карл Інгве Лервег

6
Зауважте, що @ KarlYngveLervåg перемістив свій плагін на інший шлях . Дякую Карлу!
Люк Ермітт

Дякуємо, що помітили та коментували, Люк! (Примітка. Я не можу оновити свій коментар, щоб виправити мертве посилання, вибачте!)
Карл Інгве Лервег

10

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

Зокрема, ця частина стосується поточного питання:

Наприклад, якщо ви запускаєте Vim, редагуєте файл з назвою demo.txt, поміняєте його в режим Вставка, введіть текст, збережіть файл, а потім вийдіть, ваш сеанс Vim отримує ряд подій, як те, що показано у Лістингу 1.

Лістинг 1. Послідовність подій у простому сеансі редагування 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 (активуйте нове вікно буфера) i
  13. InsertEnter (поміняти в режим Вставка)

Це все ще не зовсім всебічно (наприклад, згадка про BufReadака BufReadPost, але я припускаю, що це відбудеться після BufReadCmd), але це чудовий початок.

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


7
Це справедливо лише під час редагування одного файлу. Всупереч поширеній думці, порядок застосування autocmds для кількох файлів недостатньо визначений. І навіть з одним файлом порядок кілька разів змінювався з версією Vim. Проблеми, які це може (і може) викликати для плагінів, обговорювались на vim_dev, і загальний дизайн не збирається змінюватись у передбачуваному майбутньому. Що стосується отримання всебічного розуміння, то apply_autocmdsв джерелах для Vim 7.4.827 є 139 випадків . Удачі в цьому.
Сато Кацура

@SatoKatsura Це такий експертний висновок, який я шукав, дякую! Чи є якась довідка, яку ви можете запропонувати дізнатися більше про це (крім занурення у джерела Vim)? Крім того, це може бути виключно з вашої сфери інтересів, але чи маєте ви уявлення, чи краще все визначено в країні "Неовім"?
sundar

Боюся, я не знаю жодної остаточної посилання. autocmds у Vim - це безлад, я не думаю, що насправді можна написати остаточну посилання, за винятком кількох простих випадків. Я гадаю, що всі просто влаштовуються на "зазвичай працює", і знизують плечима, коли цього не відбувається. Що стосується неоовіма, у мене особисто є неоднозначні почуття щодо проекту. Я недавно не переглядав код; Я припускаю, що ви можете отримати відповідь на їх трекер з питань.
Сато Кацура

Також сам термін "подія" повинен підривати ідею занадто фіксованого замовлення.
VanLaser
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.