Neden augroup kullanmalıyım?


31

Otomatik komutların nasıl çalıştığını ve nasıl kullanılacağını anlıyorum ama Ağustos grubunun ne için olduğundan biraz eminim. Okudum: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.

Bu gerçekten neden faydalı olduklarını veya neden yan yana bir sürü otokomu tanımlamak için bir otomatik komut grubu adı yapmak istediğimi açıklamıyor.

Örneğin, oto komutları varsa foove barilişkiliyse, neden yapmak isteyeyim?

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

ne zaman yapabilirdim

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

Ağustos gruplarının gerçekte ne için olduğunu yanlış anlamadığım sürece. Peki neden faydalılar?

Yanıtlar:


30

augroupS'yi kullanmanın ana nedeni , otokomlar aralıkları üzerinde daha fazla kontrole izin vermek, örneğin bir seferde bir dizi otokomayı silmek. Ortak bir düzen, au!grubun ilk bölümü olarak kullanmaktır . Bu, gruptaki tüm otomatik komutları kaldırır ve birinin yeni bir başlangıç ​​yapmasını sağlar. Bir grup kullanmadıysanız, au!kaldırmak istemediğiniz tüm / birçok otomatik komutları kaldırır.

Otomatik komutları silmek, örneğin eklentilerde oldukça yaygındır, çünkü bu, bir eklenti / ftplugin'i birden çok defa kaynak yapmasına izin verir. Eğer otomatik komutları silmezseniz, eklentiyi / ftplugin'i her çalıştırdığınızda, aynı otomatik komutun yeni bir kopyasını eklersiniz. Bu, vimrcdosyanız için de geçerlidir . VIMRC dosyanızdaki bir grubu kullanarak, yeniden yüklemek güvenli olur.

Daha fazla bilgi için bkz :h 40.3.


19

Otomatik komut grupları, kendi başına oldukça kullanışlı bir özellik olan otomatik komutlarınızı düzenleme fırsatı sunar.

Bir eklenti yazdığınızı söyleyin. Eklentinizin otomatik komutlarını kendi ad alanınız altında gruplamak, yalnızca otomatik komutlarınızı istediğiniz zaman etkinleştirmenize / devre dışı bırakmanıza izin verdiği için anlamlıdır.

Sizin vimrcbir temelde farklı değil plugin/foo.vimsen autocommand gruplarıyla olsun tüm kurulum üzerinde temelde daha fazla kontrol, bu yüzden.

Uygulamada…

Bunları bir gruba atamazsanız, otomatik komutlar varsayılan olarak global gruba "kurulur". İlgili otomatik komutları kendi gruplarına kurmak sadece işleri netleştirmekle kalmaz, aynı zamanda "yığılma" etkisinin çok kolay ve tek bir şekilde önlenmesini sağlar !:

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

Sol tarafta, tüm grup bir kerede kaldırılır, o grubun her bir otomatik komutu düzgün bir şekilde kurulmadan önce. Temiz.

Sağ tarafta, Vim her otomatik komut için aynı "kaldırma / yükleme" rutinini boşa çıkarır. Kirli.

Ama istemiyorsan her seferinde bu bloğu yazmak zorunda değilsin. Otomatik komutlar doğrudan bir gruba atanabilir, böylece bir grubu tanımlayabilirsiniz:

augroup spam
    autocmd!
augroup END

otomatik komutlarınızı istediğiniz yere, hatta başka bir komut dosyasında yerleştirin:

autocmd spam Foo * foo
autocmd spam Bar * bar

Bu size verecektir:

  • ad alanlarının
  • yığılma önleme
  • sipariş
  • esneklik

15

Diğer cevapların yanı sıra, en acil pratik yararın, vimscript dosyalarını yeniden yüklemeyi kolaylaştırması olduğunu biliyorum.

Örneğin, bunu vimrc'nize yapıştırın:

autocmd BufCreate * echom "New buffer!"

Çıkın, yeniden başlatın, yeni bir tampon oluşturun. New buffer!hangi ile doğrulayabileceğinizi görürsünüz :messages.

Şimdi vimrc'nizi yeniden yükleyin: :source $MYVIMRCve tekrar yeni bir tampon oluşturun.

Şimdi ne görüyorsun


Bunu yerine kullanmış mıydım:

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

O zaman iyi olurdum. Bir grup otomatik autocmd!komut yapıyorum , bu gruptaki tüm tanımlanmış otomatik komutları temizle komutu . Bu önemlidir, çünkü:

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

Sadece misiniz eklemek aynı augroup bunu.


Başka bir deyişle, hepimiz tip aynı neden fun!ve command!yerine olmadan sürümlere göre !geçersiz kılma izin vermez.


Onun "anlamsal" anlamını vurgulamak çok yararlı olur !:)
llinfeng
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.