Bagaimana urutan kejadian WinEnter, BufEnter, BufRead, Sintaks, FileType?

16

Saya telah melalui autocmd.txtbantuan, tetapi informasi tentang ini tersebar dan tidak selalu ada (mis. Dengan BufRead).

Dapatkah seseorang yang memahami ini dengan baik menuliskan urutan peristiwa-peristiwa ini - mungkin dengan kondisi yang ditandai dalam paranthes, seperti

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

dan seterusnya, untuk referensi mudah?

Catatan (disalin dari komentar saya sendiri di bawah) : Saya tidak berbicara tentang penjelasan individu tentang mereka, yang OK, tetapi tentang bagaimana mereka berinteraksi satu sama lain dan dalam urutan apa mereka terjadi. Misalnya, WinEnter"Vim menjalankan perintah otomatis BufEnter setelah perintah otomatis WinEnter", TabEntermengatakan "Setelah memicu WinEnter dan sebelum memicu acara BufEnter", semuanya tersebar seperti ini ke banyak tempat. Dan kadang-kadang tidak disebutkan sama sekali (misalnya misalnya BufReadtidak menyebutkan apakah berjalan setelah BufEnter atau sebelumnya - mungkin seorang ahli dapat menyimpulkannya dari beberapa info lain di sana, tapi saya tidak bisa.
Jadi, maksud saya di sini adalah untuk buat satu referensi sederhana untuk urutan peristiwa ini yang dapat dilihat dengan cepat oleh non-pakar,autocmd spesifikasi acara.

sundar - Pasang kembali Monica
sumber
Saya pikir sebagian besar penjelasannya OK, bisakah Anda memberikan daftar yang tidak Anda mengerti?
nobe4
@ Nobe4 Saya tidak berbicara tentang penjelasan individual tentang mereka, yang memang OK, tetapi tentang bagaimana mereka berinteraksi satu sama lain dan dalam urutan apa mereka terjadi. Misalnya, WinEnter"Vim menjalankan perintah otomatis BufEnter setelah perintah otomatis WinEnter", TabEntermengatakan "Setelah memicu WinEnter dan sebelum memicu acara BufEnter", semuanya tersebar seperti ini ke banyak tempat. Dan kadang-kadang tidak disebutkan sama sekali (misalnya misalnya BufReadtidak menyebutkan apakah berjalan setelah BufEnter atau sebelumnya - mungkin seorang ahli dapat menyimpulkannya dari beberapa info lain di sana, tapi saya tidak bisa.
sundar - Reinstate Monica
Jadi, maksud saya di sini adalah untuk membuat referensi tunggal dan sederhana untuk urutan acara ini yang dapat dicari dengan cepat oleh non-pakar, agar lebih tepat dalam autocmdspesifikasi acara kami .
sundar - Pasang kembali Monica
OK saya tidak mengerti pertanyaannya. Anda dapat mencoba mencatat setiap peristiwa, dan melihat urutan penampilan (saya dapat menjawab jika Anda mau)
nobe4
Maksud Anda sebenarnya adalah untuk bertanya tentang seseorang yang memberikan referensi sederhana seperti itu, bukan membuatnya (sendiri);)
VanLaser

Jawaban:

11

Untuk melengkapi jawaban @sundar:

Anda dapat mencatat urutan acara hanya dengan fungsi pencatatan:

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

Lihat file lengkapnya di sini: https://gist.github.com/nobe4/aa8313fe98ca8821afad

Anda kemudian bisa tail -f logdan Anda mendapatkan aktivitas acara autocommand waktu-nyata.

nobe4
sumber
3
Saya membuat plugin sederhana untuk ini, lihat di sini .
Karl Yngve Lervåg
6
Perhatikan bahwa @ KarlYngveLervåg telah memindahkan pengaya ke jalur lain . Terima kasih Karl!
Luc Hermitte
Terima kasih telah memperhatikan dan berkomentar, Luc! (Catatan: Saya tidak dapat memperbarui komentar saya untuk memperbaiki tautan yang mati, maaf!)
Karl Yngve Lervåg
10

Saya mencoba googling untuk ini dengan set kata kunci yang berbeda, dan mendapatkan emas pada satu upaya tersebut dengan hasil ini: http://www.ibm.com/developerworks/library/l-vim-script-5/

Secara khusus, bagian ini relevan dengan pertanyaan saat ini:

Misalnya, jika Anda memulai Vim, edit file bernama demo.txt, tukar ke mode Sisipkan, ketik beberapa teks, simpan file, dan kemudian keluar, sesi Vim Anda menerima serangkaian acara seperti apa yang ditunjukkan pada Listing 1.

Daftar 1. Urutan acara dalam sesi pengeditan Vim sederhana

> vim

  1. BufWinEnter (buat jendela default)
  2. BufEnter (buat buffer standar)
  3. VimEnter (memulai sesi Vim) : edit demo.txt
  4. BufNew (buat buffer baru untuk berisi demo.txt)
  5. BufAdd (tambahkan buffer baru ke daftar buffer sesi)
  6. BufLeave (keluar dari buffer default)
  7. BufWinLeave (keluar dari jendela default)
  8. BufUnload (hapus buffer default dari daftar buffer)
  9. BufDelete (membatalkan alokasi buffer default)
  10. BufReadCmd (baca konteks demo.txt ke dalam buffer baru)
  11. BufEnter (aktifkan buffer baru)
  12. BufWinEnter (aktifkan jendela buffer baru) i
  13. InsertEnter (swap ke mode Insert)

Ini masih belum sepenuhnya komprehensif (mis. Tidak menyebutkan BufReadalias BufReadPost, tapi saya berasumsi itu akan datang setelah itu BufReadCmd), tapi ini awal yang bagus.

Namun, satu informasi penting yang hilang adalah bagaimana peristiwa FileTypedan Syntaxautocmd berinteraksi dengan ini (dengan asumsi filetypedan syntaxsudah ada, dan file baru dibuka yang jenis file dan sintaksinya diketahui oleh Vim).

sundar - Pasang kembali Monica
sumber
7
Ini hanya benar ketika Anda mengedit satu file. Bertentangan dengan kepercayaan populer, urutan penerapan autocmddi beberapa file tidak didefinisikan dengan baik. Dan bahkan dengan satu file, urutannya telah berubah beberapa kali dengan versi Vim. Masalah yang dapat (dan memang) disebabkan oleh plugin ini telah dibahas sampai mati pada vim_dev, dan desain keseluruhan tidak akan berubah di masa mendatang yang dapat diprediksi. Adapun untuk mendapatkan pemahaman yang komprehensif , ada 139 kejadian apply_autocmdsdalam sumber untuk Vim 7.4.827. Semoga beruntung dengan itu.
Sato Katsura
@SatoKatsura Ini adalah pendapat ahli yang saya cari, terima kasih! Apakah ada beberapa referensi yang dapat Anda sarankan untuk mempelajari lebih lanjut tentang ini (selain menyelam ke sumber Vim)? Juga, ini mungkin sepenuhnya keluar dari bidang minat Anda, tetapi apakah Anda punya ide jika hal-hal yang lebih baik didefinisikan di 'Neovim'-land?
sundar - Reinstate Monica
Saya khawatir saya tidak tahu referensi yang pasti. autocmdDalam Vim berantakan, saya tidak berpikir itu sebenarnya mungkin untuk menulis referensi definitif, kecuali untuk beberapa kasus sederhana. Saya kira semua orang hanya puas dengan "biasanya bekerja", dan mengangkat bahu ketika tidak. Adapun neovim, saya pribadi memiliki perasaan campur aduk tentang proyek ini. Saya belum melihat kode baru-baru ini; Saya kira Anda bisa mendapatkan jawaban pada pelacak masalah mereka.
Sato Katsura
Juga istilah "acara" itu sendiri harus menumbangkan gagasan pesanan yang terlalu diperbaiki.
VanLaser