ลำดับของ WinEnter, BufEnter, BufRead, Syntax, FileType คืออะไร


16

ฉันได้รับautocmd.txtความช่วยเหลือแล้ว แต่ข้อมูลเกี่ยวกับเรื่องนี้กระจัดกระจายและไม่ได้นำเสนอเสมอ (เช่นกับBufRead)

ใครบางคนที่เข้าใจสิ่งนี้ดีสามารถเรียงลำดับเหตุการณ์เหล่านี้ได้ - ด้วยเงื่อนไขที่ระบุไว้ใน parantheses เช่น

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

และอื่น ๆ สำหรับการอ้างอิงได้ง่าย?

หมายเหตุ(คัดลอกมาจากความคิดเห็นของฉันด้านล่าง) : ฉันไม่ได้พูดถึงคำอธิบายของแต่ละคนซึ่งก็โอเค แต่เกี่ยวกับวิธีที่พวกเขาโต้ตอบกันและในสิ่งที่พวกเขาเกิดขึ้น สำหรับตัวอย่างเช่นWinEnterพูดว่า "Vim เรียกใช้ Autocommands ของ BufEnter หลังจาก Autocommands ของ WinEnter" TabEnterกล่าวว่า "หลังจากเรียก WinEnter และก่อนที่จะเรียกใช้เหตุการณ์ BufEnter" มันทั้งหมดกระจัดกระจายไปในหลาย ๆ ที่ และบางครั้งก็ไม่ได้กล่าวถึงเลย (เช่นBufReadไม่ได้พูดถึงว่ามันทำงานหลังจาก BufEnter หรือก่อนหน้านี้ - บางทีผู้เชี่ยวชาญอาจอนุมานได้จากข้อมูลอื่น ๆ ที่นั่น แต่ฉันทำไม่ได้
ดังนั้นความตั้งใจของฉันคือ สร้างการอ้างอิงเดียวที่เรียบง่ายสำหรับลำดับของเหตุการณ์เหล่านี้ที่สามารถค้นหาได้อย่างรวดเร็วโดยผู้ที่ไม่ใช่ผู้เชี่ยวชาญautocmd ข้อกำหนดเหตุการณ์


ฉันคิดว่าคำอธิบายส่วนใหญ่ก็โอเคคุณสามารถให้รายการสิ่งที่คุณไม่เข้าใจได้หรือไม่?
nobe4

@ Nobe4 ฉันไม่ได้พูดถึงคำอธิบายแต่ละคำของพวกเขาซึ่งก็โอเค แต่เกี่ยวกับว่าพวกเขามีปฏิสัมพันธ์กันอย่างไรและเกิดอะไรขึ้น สำหรับตัวอย่างเช่นWinEnterพูดว่า "Vim เรียกใช้ Autocommands ของ BufEnter หลังจาก Autocommands ของ WinEnter" TabEnterกล่าวว่า "หลังจากเรียก WinEnter และก่อนที่จะเรียกใช้เหตุการณ์ BufEnter" มันทั้งหมดกระจัดกระจายไปในหลาย ๆ ที่ และบางครั้งก็ไม่ได้กล่าวถึงเลย (ตัวอย่างเช่นBufReadไม่ต้องพูดถึงว่ามันทำงานหลังจาก BufEnter หรือก่อนหน้านี้ - ผู้เชี่ยวชาญอาจอนุมานได้จากข้อมูลอื่น ๆ ที่นั่น แต่ฉันทำไม่ได้
sundar - Reinstate Monica

ดังนั้นความตั้งใจของฉันที่นี่คือการสร้างการอ้างอิงเดียวที่เรียบง่ายสำหรับลำดับของเหตุการณ์เหล่านี้ที่สามารถค้นหาได้อย่างรวดเร็วโดยผู้ที่ไม่ใช่ผู้เชี่ยวชาญเพื่อให้แม่นยำยิ่งขึ้นในautocmdข้อกำหนดกิจกรรมของเรา
sundar - Reinstate Monica

ตกลงฉันไม่เข้าใจคำถาม คุณสามารถลองบันทึกทุกเหตุการณ์และดูลำดับของการปรากฏตัว (ฉันสามารถตอบได้ถ้าคุณต้องการ)
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
ฉันทำปลั๊กอินที่ง่ายสำหรับการนี้ให้ดูที่นี่
Karl Yngve Lervåg

6
โปรดทราบว่า @ KarlYngveLervågได้ย้ายปลั๊กอินไปยังเส้นทางอื่นแล้ว ขอบคุณคาร์ล!
Luc Hermitte

ขอบคุณสำหรับการสังเกตและแสดงความคิดเห็น Luc! (หมายเหตุ: ฉันไม่สามารถอัปเดตความคิดเห็นของฉันเพื่อแก้ไขลิงก์ที่ตายแล้วขอโทษ!)
Karl Yngve Lervåg

10

ฉันลอง googling ด้วยสิ่งนี้ด้วยชุดคำหลักที่แตกต่างกันและทำให้เกิดความพยายามครั้งหนึ่งกับผลลัพธ์นี้: http://www.ibm.com/developerworks/library/l-vim-script-5/

ส่วนนี้เกี่ยวข้องกับคำถามปัจจุบัน:

ตัวอย่างเช่นหากคุณเริ่ม Vim ให้แก้ไขไฟล์ที่ชื่อว่า demo.txt สลับไปที่โหมดแทรกพิมพ์ข้อความบางส่วนบันทึกไฟล์แล้วออกจากเซสชัน Vim ของคุณจะได้รับชุดกิจกรรมเช่นที่แสดงในรายการ 1

รายการ 1. ลำดับเหตุการณ์ในเซสชันการแก้ไข Vim แบบง่าย

> เสียงเรียกเข้า

  1. BufWinEnter (สร้างหน้าต่างเริ่มต้น)
  2. BufEnter (สร้างบัฟเฟอร์เริ่มต้น)
  3. VimEnter (เริ่มเซสชัน Vim) : edit 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)


7
สิ่งนี้จะเป็นจริงเมื่อคุณแก้ไขไฟล์เดียว ขัดกับความเชื่อที่นิยมลำดับของการใช้autocmds ข้ามหลายไฟล์ไม่ได้กำหนดไว้อย่างดี และถึงแม้จะมีไฟล์เดียวคำสั่งซื้อก็เปลี่ยนไปสองสามครั้งด้วยเวอร์ชั่นของ Vim ปัญหาที่เกิดขึ้นกับปลั๊กอินนี้อาจเกิดขึ้นกับ vim_dev และการออกแบบโดยรวมจะไม่เปลี่ยนแปลงในอนาคตที่คาดการณ์ได้ สำหรับการทำความเข้าใจที่ครอบคลุมก็มี 139 เหตุการณ์ที่เกิดขึ้นapply_autocmdsใน Vim 7.4.827 ขอให้โชคดี
Sato Katsura

@SatoKatsura นี่เป็นความคิดเห็นของผู้เชี่ยวชาญที่ฉันกำลังมองหาขอบคุณ! มีการอ้างอิงบางอย่างที่คุณสามารถแนะนำให้เรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ (นอกเหนือจากการดำน้ำในแหล่งที่มาของ Vim) หรือไม่? นอกจากนี้สิ่งนี้อาจหมดไปจากพื้นที่ที่คุณสนใจ แต่คุณมีความคิดใด ๆ หรือไม่หากสิ่งต่าง ๆ มีความชัดเจนมากขึ้นใน 'Neovim'-land
sundar - Reinstate Monica

ฉันเกรงว่าจะไม่รู้การอ้างอิงที่ชัดเจนใด ๆ autocmdใน Vim เป็นระเบียบฉันไม่คิดว่าจริง ๆ แล้วมันเป็นไปได้ที่จะเขียนข้อมูลอ้างอิงที่ชัดเจนยกเว้นกรณีง่าย ๆ สองสามข้อ ฉันคิดว่าทุกคนเพิ่งจะตั้งถิ่นฐานใน "มักจะทำงาน" และยักไหล่เมื่อมันไม่ได้ สำหรับ neovim ฉันมีความรู้สึกเกี่ยวกับโครงการเป็นส่วนตัว ฉันไม่ได้ดูรหัสเมื่อเร็ว ๆ นี้; ฉันคิดว่าคุณจะได้รับคำตอบในการติดตามปัญหาของพวกเขา
Sato Katsura

นอกจากนี้คำของ "เหตุการณ์" นั้นควรล้มล้างแนวคิดของการแก้ไขคำสั่งซื้อด้วย
VanLaser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.