Vi / vim'de parantez aralarını tutabilir veya silebilir misiniz?


128

C'deki bu kod satırı verildiğinde:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

İlk kalın parantezden eşleşen parantezine kadar silmenin veya çekmenin bir yolu var mı? Df) hakkında düşündüm , ancak bu sizi sadece 9.0'dan hemen sonraya götürecektir.

Yeni satırlardan bağımsız olarak, eşleşen parantezler arasındaki her şeyi kapmak için vim'i almanın benzer bir yolu var mı?

Yanıtlar:


167

Çeşitli Hareketler:%

%Komut imlecin altındaki öğenin maçına atlar. İmleci açılış (veya kapanış) y%parantezinin üzerine konumlandırın ve hızlıca çekmek veya d%imleçten eşleşen parene kadar her şeyi silmek için kullanın .

Bu işe yarar çünkü %bir "hareket komutu" olduğundan, vim'in böyle bir komut beklediği her yerde kullanılabilir. Kimden :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Varsayılan olarak, "öğe" parantezleri, parantezleri, parantezleri, C-stili açıklamaları ve çeşitli ön derleyici ifadelerini ( #ifdefvb.) İçerir .

Vim ana sayfasında bulabileceğiniz "genişletilmiş% eşleştirme" için bir eklenti var .

Komut moduna %girerek dokümantasyonu ve ilgili hareket komutlarını okuyabilirsiniz :help various-motions.

Nesne-select

Görsel modda çeşitli metin nesnelerini seçmek için kullanabileceğiniz başka bir dizi hareket komutu vardır.

Özel probleminizi çözmek için aşağıdakileri yapmalısınız:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

İmlecinizin konumunda olduğunu varsayalım ^. Aradığınız parçayı seçmek için aşağıdaki sırayı girin:

v2a)

Önce vGörsel moda girer, ardından 2parantez seviyelerini yükseltmek istediğinizi belirtirsiniz . Son olarak a)"bir blok" u seçer. Bundan sonra silebilir dveya kullanabilirsiniz x.

Dış parantezleri dahil etmek istemiyorsanız, bunun yerine "iç bloğu" kullanabilirsiniz:

v2i)

:help object-selectİlgili komutların tam listesi için bakın .


Teşekkürler! Eşleşen öğeler arasında% geçiş yaptığımı biliyordum; komutlar içinde de yararlı olduğunu bilmiyordum. +1 ve kabul edildi.
romandas

5
İlginç, her zaman a"a" yerine "etrafta" demek olduğunu düşünmüşümdür . "İç" i daha iyi tamamladığını hissedin. Görünüşe göre Vim hakkında yeni bir şey öğrenmemek için bir gün geçmiyor.
Andrew Marshall

218

Peki ya dibya di(.

İmlecin bulunduğu (...) bloğu siler .

Metin-nesne hareketlerini ve seçimlerini seviyorum !


10
Neyse ki, bu soru için google'da ilk hit oldu - bu cevabın beni kaç kez kurtardığını bilmiyorum. Ve hep unutmak ... :-(
Konrad Rudolph

16
Parantezler dahil olmak üzere silmek mümkün müdür? (evet, kendi sorumu cevapladım: dab=> bir bloğu sil (parantezleri dahil)
bantic

5
Oy veriyorum. Ayrıca, parantez içindeki kelimeyi düzeltmek istiyorsanız ciw yapın .
Geliştirici Marius Žilėnas

5
1! Yakın zamanda metin-nesne hareketlerini keşfettiğimde aklımı başımdan almıştım! metni çekmek için imleci doğru noktaya yerleştirmeye çalışmak yok: D
verboze

36

Bir çift parantez içindeki her şeyi silmek için, her zaman di(ve türevlerini çıkarabilirsiniz .

Not :

@Porglezomb'un yorumunda önerdiği gibi , parantezleri eklemek için ("içinde") ayerine ("birlikte i") kullanabilirsiniz. Yani kullanarak da(siler her şeyi içini (ve )dahil (ve ).

Hemen dış parantez çiftinin içindeki metni silme:

Yani, bu kod satırı için

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

imlecinizin yukarıda belirtilen imleç aralığında olduğunu varsayarak, aşağıdaki komutları verebilirsiniz:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

N'inci dış parantez çiftinin içindeki metni silme:

N'inci dış parantez çiftinin içindeki her şeyi almak niçin yukarıdaki komutun önüne ekleyin . Dolayısıyla, yukarıdakiyle aynı imleç konumu ile,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'

3
Sen söz bir not eklemek gerekir amuhatabı olarak ibu birçok insan yardım etmek olasıdır çünkü.
porglezomp

@romandas bu, kabul edilen soru olmalıdır. Bugün aynı sorunu arıyordum ve @ Kevin burada doğru cevabı veren tek kişi. Elbette, %bu problem için "kötüye kullanabilirim" , ancak bu daha fazla zaman alır ve bence sadece daha karmaşık senaryolar için kullanılmalıdır. Belirli bir kapsamdaki bir şeyi silmek, tam olarak kullanım durumudur di.
daniel451

19

Sen kullanabilirsiniz d%silme ve y%Kopyalama için.


3
%, "eşleşen parantez, köşeli parantez veya parantez" için hareket belirticidir. Herhangi bir hareket özelliği, d ve y (ve diğer birçok şey) ile eşleştirilebilir.
kaos

10

İmlecinizi ilk parantezin üzerine getirin ve ardından v%yveya tuşuna basın v%d.


3
Harika! % eşleşen parene atlar. Böylece d% ve y% kullanabilirsiniz.

1
Ayrıca, 'd %'nin bir işlev adının başlangıcında başlayabileceğini ve işlev çağrısının tamamını sileceğini unutmayın. Aynı zamanda '{}', '[]' ve hatta '<>' çiftleri için de çalışır.
Jonathan Leffler

@Leffler, İpuçları için teşekkürler! Ve% 'nin görsel modda da çalıştığını bilmek güzel.
strager

3

Ci [block-surrounder] 'ı deneyin

Sizin durumunuzda, imleci vurguladığınız 2 parantez arasında herhangi bir yere getirin ve şu tuşları deneyin: ci (


Neredeyse. Bunu test ederken, imlecin arasında değil ilk parantezde olması gerekiyor gibi görünüyor ve 'c', değiştirme komutu. İmleç açılış parantezinin üzerindeyken, 'di (' eşleşen kapanış parantezini siler ve 'yi (' yankılar.
Richard Neish

ci her zaman benim için çalışıyor. Tek yapmam gereken, imlecin, silmem gereken metin bloğunu çevreleyen parantezler arasında olduğundan emin olmak.
Justin Nguyen

2

Gibi cevap David Norman diyor

İmlecinizi ilk parantezin üzerine getirin ve ardından v%yveya tuşuna basın v%d.

Http://vimdoc.sourceforge.net/htmldoc/vimindex.html adresinden açıklama :

Normal modda karakter notu etiketi eylemi        
-------------------------------------------------- ----------------------------
| V | v karakter bazında başlat Görsel mod
|% | % 1 sonraki (kıvrık / kare) ayracı bul
                                       bu satıra gidin ve eşleşmesine gidin veya
                                       eşleşen yorum parantezine veya eşleşmeye git
| D | ["x] d {hareket} 2 Nmove metnini sil [arabelleğe x]

Bu %, seçimi görsel olarak size gösterirken ( ) iki parantez ( ) arasındaki ve dahil olmak üzere her şeyi seçeceği ve ardından onu çekeceği v/ kopyalayacağı yveya sileceği / keseceği anlamına dgelir. (Varsayılan arabelleğe.)

İle koyabilir / yapıştırabilirsiniz p.

Bu cevabı "kendime balık tutmayı öğretmek" için yaptım .


not: vimdoc.sourceforge.net, 2015 itibariyle
vim'in
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.