Jaka jest kolejność zdarzeń WinEnter, BufEnter, BufRead, Składnia, FileType?

16

Przeszedłem autocmd.txtpomoc, ale informacje na ten temat są rozproszone i nie zawsze są obecne (np. Z BufRead).

Czy ktoś, kto dobrze to rozumie, może wymienić kolejność tych wydarzeń - być może warunki zaznaczone w nawiasach, na przykład

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

i tak dalej, dla łatwego odniesienia?

Uwaga (skopiowano z mojego komentarza poniżej) : Nie mówię o indywidualnych wyjaśnieniach, które są w porządku, ale o tym, jak wchodzą w interakcje ze sobą i w jakiej kolejności. Na przykład WinEntermówi: „Vim wykonuje komendy automatyczne BufEnter po komendach WinEnter”, TabEntermówi „Po uruchomieniu WinEnter i przed uruchomieniem zdarzenia BufEnter” wszystko jest tak rozproszone w wielu miejscach. I czasem wcale o tym nie wspomina (na przykład BufReadnie wspomina, czy działa po BufEnterze, czy wcześniej - może ekspert może wywnioskować to na podstawie innych informacji, ale nie mogę.
Więc moim celem jest utwórz pojedyncze, proste odniesienie do porządku tych wydarzeń, które mogą być szybko sprawdzone przez osoby niebędące ekspertami,autocmd specyfikacje zdarzeń.

sundar - Przywróć Monikę
źródło
Myślę, że większość wyjaśnień jest w porządku, czy możesz podać listę tych, których nie rozumiesz?
nobe4
@ Nobe4 Nie mówię o indywidualnych wyjaśnieniach, które są w porządku, ale o tym, w jaki sposób współdziałają ze sobą i w jakiej kolejności. Na przykład WinEntermówi: „Vim wykonuje komendy automatyczne BufEnter po komendach WinEnter”, TabEntermówi „Po uruchomieniu WinEnter i przed uruchomieniem zdarzenia BufEnter” wszystko jest tak rozproszone w wielu miejscach. I czasem wcale o tym nie wspomina (na przykład BufReadnie wspomina, czy działa po BufEnter, czy wcześniej - może ekspert może wywnioskować to na podstawie innych informacji, ale nie mogę.
Sundar - Przywróć Monikę
Dlatego moim celem jest stworzenie jednego, prostego odniesienia do porządku tych wydarzeń, które mogą być szybko sprawdzone przez osoby niebędące ekspertami, aby być bardziej precyzyjne w naszych autocmdspecyfikacjach wydarzeń.
Sundar - Przywróć Monikę
OK, nie rozumiem pytania. Możesz spróbować zarejestrować każde zdarzenie i zobaczyć kolejność pojawiania się (mogę odpowiedzieć, jeśli chcesz)
nobe4
Twoim celem jest
spytanie

Odpowiedzi:

11

Aby wypełnić odpowiedź @sundar:

Możesz zalogować kolejność zdarzeń po prostu za pomocą funkcji rejestrowania:

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

Zobacz pełny plik tutaj: https://gist.github.com/nobe4/aa8313fe98ca8821afad

Możesz wtedy tail -f logi otrzymujesz aktywność zdarzenia automatycznego komendowania w czasie rzeczywistym.

nobe4
źródło
3
Stworzyłem do tego prostą wtyczkę, patrz tutaj .
Karl Yngve Lervåg,
6
Pamiętaj, że @ KarlYngveLervåg przeniósł wtyczkę na inną ścieżkę . Dziękuję Karl!
Luc Hermitte
Dzięki za zauważenie i komentowanie, Luc! (Uwaga: nie mogę zaktualizować komentarza, aby naprawić martwy link, przepraszam!)
Karl Yngve Lervåg,
10

Próbowałem googlować z różnymi zestawami słów kluczowych i uderzyłem w złoto podczas jednej takiej próby z tym rezultatem: http://www.ibm.com/developerworks/library/l-vim-script-5/

W szczególności ta część dotyczy bieżącego pytania:

Na przykład, jeśli uruchomisz Vima, edytuj plik o nazwie demo.txt, zamień w tryb wstawiania, wpisz tekst, zapisz plik, a następnie wyjdź, twoja sesja Vim otrzyma szereg zdarzeń, takich jak pokazano na Listingu 1.

Listing 1. Sekwencja zdarzeń w prostej sesji edycji Vima

> vim

  1. BufWinEnter (utwórz okno domyślne)
  2. BufEnter (utwórz domyślny bufor)
  3. VimEnter (rozpocznij sesję Vim) : edytuj demo.txt
  4. BufNew (utwórz nowy bufor zawierający plik demo.txt)
  5. BufAdd (dodaj ten nowy bufor do listy buforów sesji)
  6. BufLeave (zamknij domyślny bufor)
  7. BufWinLeave (zamknij okno domyślne)
  8. BufUnload (usuń domyślny bufor z listy buforów)
  9. BufDelete (cofnij przydział domyślnego bufora)
  10. BufReadCmd (przeczytaj konteksty pliku demo.txt w nowym buforze)
  11. BufEnter (aktywuj nowy bufor)
  12. BufWinEnter (aktywuj okno nowego bufora) i
  13. InsertEnter (zamień w tryb wstawiania)

Nadal nie jest do końca wyczerpujący (np. Brak wzmianki o BufReadaka BufReadPost, ale zakładam, że przyjdzie później BufReadCmd), ale jest to doskonały początek.

Jednym z kluczowych brakujący kawałek informacji jest jednak, w jaki sposób FileTypei Syntaxautocmd zdarzenia interakcji z tego (zakładając, filetypei syntaxsą już włączony, a nowy plik jest otwierany którego filetype i składnia są znane Vima).

sundar - Przywróć Monikę
źródło
7
Dotyczy to tylko edycji pojedynczego pliku. W przeciwieństwie do powszechnego przekonania, kolejność stosowania autocmds w wielu plikach nie jest dobrze zdefiniowana. Nawet w przypadku jednego pliku kolejność zmieniła się kilka razy wraz z wersją Vima. Problemy, które może to powodować (i robi) dla wtyczek, zostały omówione na śmierć na vim_dev, a ogólny projekt nie zmieni się w przewidywalnej przyszłości. Jeśli chodzi o pełne zrozumienie, cóż, istnieje 139 wystąpień apply_autocmdsw źródłach dla Vima 7.4.827. Powodzenia z tym.
Sato Katsura
@SatoKatsura To jest opinia eksperta, której szukałem, dzięki! Czy jest jakaś referencja, którą możesz zasugerować, aby dowiedzieć się więcej na ten temat (poza zanurzeniem się w źródłach Vima)? Poza tym może to być całkowicie poza twoim obszarem zainteresowań, ale czy masz pojęcie, czy lepiej jest zdefiniować rzeczy w krainie „Neovim”?
Sundar - Przywróć Monikę
Obawiam się, że nie znam żadnego ostatecznego odniesienia. autocmdW Vimie jest bałagan, nie sądzę, że można napisać ostateczne odniesienie, z wyjątkiem kilku prostych przypadków. Podejrzewam, że wszyscy po prostu godzą się na „zwykle działa” i wzruszają ramionami, kiedy to nie działa. Co do neovim, osobiście mam mieszane uczucia co do projektu. Ostatnio nie oglądałem kodu; Podejrzewam, że możesz uzyskać odpowiedź na temat narzędzia do śledzenia problemów.
Sato Katsura
Również sam termin „zdarzenie” powinien podważyć ideę zbyt ustalonego zamówienia.
VanLaser,