Tại sao tôi nên sử dụng augroup?


31

Tôi hiểu cách các lệnh tự động hoạt động và cách sử dụng chúng, nhưng tôi chắc chắn một chút về việc nhóm này dùng để làm gì. Tôi đọc trong: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.

Điều này không thực sự giải thích lý do tại sao chúng hữu ích hoặc tại sao tôi muốn tạo một tên nhóm tự động và chỉ xác định một nhóm các autocommands cạnh nhau.

Ví dụ: nếu autocommands foobarcó liên quan, tại sao tôi muốn làm

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

khi tôi có thể làm

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

Trừ khi tôi hiểu nhầm những gì nhóm thực sự dành cho. Vậy tại sao chúng hữu ích?

Câu trả lời:


30

Lý do chính để sử dụng augroups là để cho phép kiểm soát nhiều hơn phạm vi của autocommands, ví dụ: để xóa một loạt các autocommands trong một lần. Một mô hình phổ biến là sử dụng au!như là phần đầu tiên của một nhóm. Điều này loại bỏ tất cả các autocommands hiện có trong nhóm và cho phép một người bắt đầu lại từ đầu. Nếu bạn không sử dụng một nhóm, thì au!sẽ xóa tất cả / nhiều autocommands mà bạn không muốn xóa.

Việc xóa autocommands thực sự khá phổ biến, ví dụ như trong các plugin, bởi vì điều này cho phép một người tìm nguồn plugin / ftplugin nhiều lần. Nếu bạn không xóa autocommands, thì mỗi lần bạn chọn plugin / ftplugin, bạn sẽ thêm một bản sao mới của cùng một autocommand. Điều này cũng đúng với vimrctập tin của bạn . Bằng cách sử dụng một nhóm trong tệp vimrc của bạn, việc tải lại nó trở nên an toàn.

Để biết thêm thông tin, xem :h 40.3.


19

Các nhóm autocommand cung cấp cho bạn cơ hội để tổ chức autocommands của bạn, đây là một tính năng khá hữu ích trong chính nó.

Giả sử bạn đang viết một plugin. Nhóm các autocommands của plugin của bạn trong không gian tên của riêng bạn có ý nghĩa, nếu chỉ vì nó cho phép bạn bật / tắt các autocommands của bạn theo ý muốn.

Bạn vimrckhông khác biệt cơ bản so với plugin/foo.vimnhư vậy, tất cả những gì bạn nhận được với các nhóm tự động cơ bản về cơ bản là kiểm soát nhiều hơn đối với thiết lập của bạn.

Trong thực tế…

Nếu bạn không gán chúng cho một nhóm, autocommands sẽ được "cài đặt" trong nhóm toàn cầu theo mặc định. Cài đặt autocommands liên quan trong nhóm riêng của họ không chỉ giúp mọi thứ rõ ràng hơn mà còn cho phép bạn ngăn chặn hiệu ứng "chồng chất" đáng sợ rất dễ dàng và chỉ với một !:

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

Ở bên trái, toàn bộ nhóm được gỡ cài đặt cùng một lúc, trước khi mỗi chế độ tự động của nhóm đó được cài đặt đúng. Khéo léo.

Ở bên phải, Vim sẽ lãng phí chạy qua cùng một thói quen "gỡ cài đặt / cài đặt" cho mỗi chế độ tự động. Dơ bẩn.

Nhưng bạn không phải viết toàn bộ khối đó mỗi lần nếu bạn không muốn. Autocommands có thể được gán trực tiếp cho một nhóm để bạn có thể xác định một nhóm ở đâu đó:

augroup spam
    autocmd!
augroup END

và đặt autocommands của bạn vào nơi bạn muốn, ngay cả trong một tập lệnh khác:

autocmd spam Foo * foo
autocmd spam Bar * bar

Điều này sẽ cung cấp cho bạn:

  • không gian tên
  • phòng chống chồng chất
  • gọi món
  • Mềm dẻo

15

Ngoài các câu trả lời khác, tôi thấy rằng lợi ích thiết thực nhất ngay lập tức là nó giúp dễ dàng tải lại các tệp vimscript.

Ví dụ: dán cái này trong vimrc của bạn:

autocmd BufCreate * echom "New buffer!"

Thoát, khởi động lại, tạo một bộ đệm mới. bạn thấy New buffer!, mà bạn có thể xác minh với :messages.

Bây giờ tải lại vimrc của bạn: :source $MYVIMRCvà một lần nữa tạo bộ đệm mới.

Bạn thấy gì bây giờ?


Tôi đã sử dụng điều này thay thế:

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

Sau đó tôi sẽ ổn thôi. Tôi tạo một nhóm autocommands, autocmd!lệnh xóa tất cả autocommands được xác định trong nhóm đó . Điều đó rất quan trọng, bởi vì:

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

Chỉ cần thêm nó vào cùng một nhóm.


Nói cách khác, đó là cùng một lý do mà tất cả chúng ta đều gõ fun!command!, thay vì các phiên bản mà !không cho phép ghi đè.


Nó rất hữu ích để làm nổi bật ý nghĩa "ngữ nghĩa" của anh ấy !:)
llinfeng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.