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 iç (...) 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.