เหตุใดฉันจึงควรใช้ augroup


31

ฉันเข้าใจว่าคำสั่งอัตโนมัติทำงานอย่างไรและใช้งานอย่างไร แต่ฉันก็ค่อนข้างแน่ใจว่าเป็นกลุ่มใด ฉันอ่าน:help augroup

                                                    *:aug* *:augroup*
:aug[roup] {name}               Define the autocmd group name for the
                                following ":autocmd" commands.  The name "end"
                                or "END" selects the default group.
                                To avoid confusion, the name should be
                                different from existing {event} names, as this
                                most likely will not do what you intended.

สิ่งนี้ไม่ได้อธิบายว่าทำไมพวกเขาถึงมีประโยชน์หรือทำไมฉันต้องการสร้างชื่อกลุ่มข้อความอัตโนมัติและเพียงแค่กำหนดกลุ่มข้อความอัตโนมัติที่อยู่ติดกัน

ตัวอย่างเช่นหากการเติมข้อความอัตโนมัติfooและbarเกี่ยวข้องกันทำไมฉันต้องทำ

augroup spam
  au!
  au foo * foo
  au bar * bar
augroup END

เมื่อฉันสามารถทำได้

"Autocommands for spam
au foo * foo
au bar * bar

นอกเสียจากว่าฉันเข้าใจผิดว่าสิ่งที่กลุ่มมีไว้เพื่ออะไรจริงๆ แล้วทำไมพวกเขาถึงมีประโยชน์

คำตอบ:


30

เหตุผลหลักในการใช้augroups คือเพื่อให้สามารถควบคุมช่วงของ autocommands ได้มากขึ้นเช่นการลบ autocommands ในคราวเดียว รูปแบบทั่วไปคือการใช้au!เป็นส่วนแรกของกลุ่ม สิ่งนี้จะลบข้อความอัตโนมัติที่มีอยู่ทั้งหมดในกลุ่มและอนุญาตให้เริ่มใหม่อีกครั้ง หากคุณไม่ได้ใช้กลุ่มคุณau!จะลบ autocommands ทั้งหมด / หลายรายการที่คุณไม่ต้องการลบออก

การลบข้อความอัตโนมัตินั้นเป็นเรื่องที่พบได้บ่อยเช่นในปลั๊กอินเพราะสิ่งนี้อนุญาตให้ปลั๊กอินแหล่งที่มา / ftplugin หลายครั้ง หากคุณไม่ได้ลบ autocommands ดังนั้นทุกครั้งที่คุณจัดหาปลั๊กอิน / ftplugin คุณจะต้องเพิ่มสำเนาใหม่ของ autocommand ตัวเดียวกัน สิ่งนี้เป็นจริงสำหรับvimrcไฟล์ของคุณด้วย การใช้กลุ่มในไฟล์ vimrc ของคุณจะปลอดภัยในการโหลดซ้ำ

:h 40.3สำหรับข้อมูลเพิ่มเติมโปรดดูที่


19

กลุ่ม Autocommand ให้โอกาสคุณในการจัดระเบียบ autocommand ของคุณซึ่งเป็นคุณสมบัติที่มีประโยชน์มากในตัวมันเอง

สมมติว่าคุณกำลังเขียนปลั๊กอิน การจัดกลุ่มข้อความอัตโนมัติของปลั๊กอินภายใต้เนมสเปซของคุณเองจะสมเหตุสมผลถ้าเพียงเพราะมันให้คุณเปิดใช้งาน / ปิดใช้งานข้อความอัตโนมัติของคุณได้ตามต้องการ

คุณvimrcไม่ได้เป็นพื้นฐานที่แตกต่างจากplugin/foo.vimดังนั้นสิ่งที่คุณได้รับกับกลุ่ม autocommand ควบคุมโดยทั่วไปมากกว่าการตั้งค่าของคุณ

ในทางปฏิบัติ ...

หากคุณไม่ได้กำหนดให้กลุ่มคำสั่งอัตโนมัติจะถูก "ติดตั้ง" ในกลุ่มส่วนกลางโดยค่าเริ่มต้น การติดตั้งระบบเติมข้อความอัตโนมัติที่เกี่ยวข้องในกลุ่มของตัวเองไม่เพียง แต่ทำให้ทุกอย่างชัดเจนขึ้น แต่ยังช่วยให้คุณสามารถป้องกันเอฟเฟ็กต์ "pile-up" ที่หวั่นไหวได้ง่ายมากและใช้เพียงครั้งเดียว!:

augroup spam             versus    autocmd! Foo * foo
    autocmd!                       autocmd! Bar * bar
    autocmd Foo * foo
    autocmd Bar * bar
augroup END

ทางด้านซ้ายกลุ่มทั้งหมดจะถูกถอนการติดตั้งในครั้งเดียวก่อนที่จะติดตั้งระบบเติมข้อความอัตโนมัติแต่ละอันของกลุ่มนั้นอย่างถูกต้อง เรียบร้อย

ทางด้านขวา Vim จะเรียกใช้ชุดคำสั่ง "ถอนการติดตั้ง / ติดตั้ง" แบบเดียวกันสำหรับแต่ละรายการโดยอัตโนมัติ สกปรก.

แต่คุณไม่จำเป็นต้องเขียนบล็อกทั้งหมดนั้นทุกครั้งหากคุณไม่ต้องการ คำสั่งอัตโนมัติสามารถกำหนดให้กับกลุ่มโดยตรงเพื่อให้คุณสามารถกำหนดกลุ่มได้ที่ไหน:

augroup spam
    autocmd!
augroup END

และวางคำสั่งอัตโนมัติของคุณตามที่คุณต้องการแม้แต่ในสคริปต์อื่น:

autocmd spam Foo * foo
autocmd spam Bar * bar

สิ่งนี้จะทำให้คุณ:

  • namespacing
  • การป้องกันกองพะเนิน
  • ใบสั่ง
  • มีความยืดหยุ่น

15

นอกเหนือจากคำตอบอื่น ๆ ฉันพบว่าประโยชน์ในทางปฏิบัติที่เกิดขึ้นทันทีที่สุดคือมันทำให้ง่ายต่อการโหลดไฟล์ vimscript

ตัวอย่างเช่นติดสิ่งนี้ไว้ใน vimrc ของคุณ:

autocmd BufCreate * echom "New buffer!"

ปิดเริ่มต้นใหม่สร้างบัฟเฟอร์ใหม่ คุณเห็นซึ่งคุณสามารถตรวจสอบกับNew buffer!:messages

ทีนี้โหลด vimrc ของคุณ:source $MYVIMRCแล้วทำบัฟเฟอร์ใหม่อีกครั้ง

คุณเห็นอะไรตอนนี้


หากฉันใช้สิ่งนี้แทน:

augroup inform_new_buffer
    autocmd!
    autocmd BufCreate * echom "New buffer!"
augroup end

งั้นฉันคงสบายดี ฉันสร้างกลุ่มของautocmd!คำสั่งอัตโนมัติคำสั่งล้างข้อมูลคำอัตโนมัติที่กำหนดไว้ทั้งหมดในกลุ่มนั้น นั่นเป็นสิ่งสำคัญเพราะ:

augroup inform_new_buffer
    autocmd BufCreate * echom "New buffer!"
augroup end

จะเพิ่มลงในกลุ่มเดียวกัน


มันเป็นเหตุผลเดียวกันกับที่เราทุกคนพิมพ์fun!และcommand!แทนที่จะเป็นเวอร์ชั่นที่ไม่มีตัวเลือก!ที่ไม่อนุญาตให้มีการแทนที่


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