web-gelistirme-sc.com

Vim'de tüm fonksiyon tanımını seçme

Neredeyse bir haftadır herhangi bir metin düzenleme çalışması için Vim'i deniyorum. Bir C işlevi tanımı seçmenin en hızlı yolunu bilmek istiyorum.

Örneğin, eğer böyle bir işleve sahipsem:

void helloworlds( int num )
{
    int n;
    for ( n = 0; n < num; ++n ) {
        printf( "Hello World!\n" );
    }
}

İşlev adı dahil tüm tanımı nasıl silebilirim?

45
Jacky Boen

Vim'de yaygın olduğu gibi, bir çok yol var!

İlk iki çözümün boş satır olmamasına bağlı olduğunu unutmayın.

  • İmleciniz işlev adının yanındaysa, deneyin. d}. Her şeyi bir sonraki bloğa siler (yani, işlev gövdesiniz).

  • İşlev vücudunun içinde, dap 'paragrafı' silecek.

  • İle küme ayracı bloğunu silebilirsiniz. da}. (Bu sözdizimini seviyorsanız, Tim Papa'nın fantastik surround.vim 'i benzer özelliklere sahip daha fazla özellik ekleyen) öneririz.

  • Ayrıca bir sonraki sola girintili kapanış kaşlı ayraca kadar silmek için normal ifadeleri kullanmayı deneyebilirsiniz: d/^}Enter

  • ]] ve [[ sonraki/önceki ilk sütun küme parantezine ilerleyin (yukarıda belirtilen I regex ile / ve ? kullanmaya eşdeğerdir. d hareket ve aynı etkiyi elde edersiniz. Python-mode gibi eklentilerde, bunlar işleçler yeniden tanımlanır tam olarak aradığınızı kastediyoruz: işlevden işleve geçiş.

Tüm bloğu silme, başlık dahil

Başlık/ad veya bloktan önceki satırdaysanız, da} hile yapmalı.

Bir bloğun altındaysanız, Vim aramasının kullanışlı 'ofset' özelliğini de kullanabilirsiniz. d?^{?-1 ilk sütun açma kaşlı ayracının ilk oluşumundan önce bir satır geriye doğru siler. Bu komut yazmak biraz zor. Belki bir <leader> kısayolu yapabilirsin.

Eklentiler

Vim'de çok fazla C programlama yapmıyorum, ancak kesinlikle böyle bir konuda yardımcı olacak eklentiler var. Deneyin Vim Scripts veya onların GitHub'taki ayna .

68
David Cain

Tanımını da içeren tam bir işlevi silmek için:

function tick() {
        // ... 
}
  • İşlev adıyla çizgiye gidin.
  • İmleci açılış ayracına getirin,f{, ya da basitçe$.
  • V%d(Görsel çizgi, eşleşen çifti kullan, sil) tuşuna basın.

İşlevleriniz şuna benziyorsa:

function tick() 
{
        // ... 
}
  • İşlev adıyla çizgiye gidin.
  • J(join ile satırın altındaki geçerli satıra basın. İmleci, sonuçtaki satırdaki son karakter olan {, bir sonraki komut için ihtiyacımız olan karaktere getirir.)
  • V%d(Görsel çizgi, eşleşen çifti kullan, sil.) Tuşuna basın.

veya

  • İşlev adıyla çizgiye gidin.
  • V[Down]%d(Görsel çizgi, bir satırı aşağı taşı, eşleşen çifte taşı, sil.) Tuşuna basın.
16
Nick Zalutskiy

Bu kısayolu yalnızca işlevi değil, aynı zamanda küme parantezleri arasındaki satırları, yani if-else ifadeleri arasındaki kodu, döngüler için vb. Silmek için kullanabilirsiniz.

Kıvrımlı ayraç başlangıcında/sonunda Shitf + v [sizi görsel modda görecek] tuşuna basın.

Sonra] +} i.e] + Shitf] - Basamaklamaya başlarsanız.

Sonra [+ {i.e [+ Shitf [- tuşuna basın.

Ardından seçilen satırları silmek için DEL.

4
Manikanda raj S

Bu basit yolu kullanın

   1.Go to the function definition 
   2.dd  - delete function definition 
   3.d    -start delete operation 
   4.shift+5(%) - delete the lines between { to }
4
Kalanidhi

En basit ve doğrudan yol şu şekildedir (işlevin içinde herhangi bir yerde çalışır):

v   enter visual mode
{   move to first brace in function (may have to press more than once)
o   exchange cursor from top to bottom of selection
}   extend selection to bottom of function
d   delete selected text

Komut dizisinin tamamı v{o}d olacaktır. Aynı işlemi silmek dışında başka işlemler yapabileceğinizi unutmayın. Örneğin, işlevi kopyalamak için y yerine d (yank) kullanın.

3
Tyler Durden

Eklentileri kurmak için istekli iseniz vim-textobj-function size Visual select İç Fonksiyonu için vif ve Visual seçim A Fonksiyonu için vaf verecektir. 

daf işlevi, hem imza içeren satırı hem de işlev gövdesini ({}) siler

Bu eklenti tarafından tanımlanan metin nesnesi daha spesifiktir ve fonksiyon gövdesine dayanmaz, bitişik bir metin bloğuna veya satırdaki ilk karaktere yerleştirilmiş { beign fonksiyonuna dayanmazlar. 

Dezavantajı, harici bir eklentiye bağlı olmanızdır. 

2
ecerulm

Eğer fonksiyonunuz boş satırlarla ayrılmışsa, sadece şunu yazın:

dip

"iç paragrafı sil" anlamına gelir.

1
wzFelix

Önkoşul: işlevin içinde bir yerde ol .. .. İlk satırda önceki kapanış kıvrık parantez içine gidin.

[]

Ardından, ilk satırda bir sonraki kapanış kıvrık ayracı kullanarak silin

d][
0
Hope

Diğer bir yol ise, fonksiyonunuzun başlangıcına girip isabet etmektir: Vj% (veya stiliniz açılış çizgisini aynı satıra yerleştirirse V%%). Bu sizi Visual-Line moduna geçirir ve yüzde sizi eşleşen kapanış ayracına götürür. İkinci stilde, ilk% sizi seçtiğiniz satırdaki açılış ayracına, ikincisi ise eşleşen kapanış ayracına götürür. 

Ayrıca parantez, parantez, C tarzı çok satırlı yorumlar ve önişlemci direktifleri için çalışır.

Daha fazla bilgi için manual bölümüne bakın.

0
gvkv

görsel olmayan yol:

d/^}/e

... satırın başında } ifadesini arayarak silme, silme dahil.

/e olmadan (yukarıdaki cevaplarda bahsedilmemiş), çözüm eksik.

/e ile - arama, eşleşme sonuna kadar gider, bu nedenle kapanış braketi include şeklindedir ve komut da yanmak için iyidir:

y/^}/e
0
Asain Kujovic