Geçerli iç bloğun sağ sonuna kadar sil


21

Diyelim ki böyle bir kodum var ( |imleç pozisyonunu gösterir ):

func1(x|, func2(), y); 

Almak isterim:

func1(x|);

Kodu, imlecin konumundan o anki iç bloğun sağ ucundan önceki konumuna silmenin bir yolu var mı ?

Gidebileceğimi biliyorum, dt).ama bunu ne ile karıştırmanın bir yolu olup olmadığını merak ediyorum di).


1
İstediğiniz gibi "iç / dış bloğun sol / sağ yarısını silmenin" kolay bir yolu olup olmadığını bilmekle ilgileniyorum. Ancak bir not olarak, muhtemelen C);bu durumda yapardım .
Shahbaz

1
Bazen %hareket aradığınızı yapabilir (yani d%).
alxndr

Yanıtlar:


29

Kullanmak istiyorum

d])

bu d, bir sonraki eşleşmeyen ')' ( ])) ile delete ( ) anlamına gelir .

Bakın :help ]).


5

Metin nesneleri yalnızca iki yöne giderken hareketler yalnızca bir yöne gider .

Bu, başlık altındaki o metin nesnesini kullanan veya davranışını taklit eden özel bir işleç beklemediğiniz sürece, bir metin nesnesinin yarısına sahip olamayacağınız anlamına gelir.

Örneğinizde, içerdiği metnin i)görselleştirilmesi oldukça kolaydır:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

Fakat Vim'e imlecin o metnin sonuna kadar işlemesini nasıl söylersin? Kişinin obi)ve gibi oei)(yarı-rastgele örnekler) özel operatörler yaratması gerekir .

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
Mevcut imleç konumuyla birlikte önceden tanımlanmış tüm metin nesnelerini yeniden kullanan genel bir hareket oluşturmak ilginç olurdu; Örneğin, yerine için ib, imbsağa ve iMbsola ve böylece (otomatik) üzerine.
VanLaser

3

Bu özel durum için dfy

Genel durum için:

  • dT( imleçten bloğun başlangıcına kadar sil
  • vib iç bloğun geri kalanını seç
  • p iç bloğu yeni sildiklerinizle değiştirin

Bir haritalama yapabilirsin.

 :map K dt(vibp

3

Mevcut diğer cevapların tümü, Vim'in bir blok tanımına ve tespitine bağlıdır. Bu tür silmelere yönelik stratejim, ckomutu, fhareketle ve durulacak gerçek karakterle birlikte kullanmaktır. Bu daha sonra durma karakterini siler, ancak aynı zamanda iki kez tekrarladığınızda en son bastığınız anahtar olduğundan, sıfır maliyetin yanında olur ve cekleme modundaki değişikliklerden sonra tekrar ekleyecektir.


Örneklerle açıklamak,

func1(x|, func2(), y); 

komut c2f))verecek

func1(x)|;

ilk başta diğer cevapların bazılarından daha az zarif görünebilir ancak bu stratejinin evrensel olduğunu ve herhangi bir blok tanımına bağlı olmadığını unutmayın.


Örneğin

<div| class="some-class">text</div>

komut cf>>verecek

<div>|text</div>

Veya csv dosyalarını düzenlerken

2016-11-29,question,vi|.stackexchange.com,10435

komut cf,,verecek

2016-11-29,question,vi,|10435

Genellikle bunu bir dizenin geri kalanını silmek için kullanırım.

printf("Hello world| - a boring example\n");

için

printf("Hello world\|n");

ile cf\\

veya

print("Hello world| - a boring example");

için

print("Hello world"|);

ile cf"".


Bu, geçerli konumu istenenden biraz farklı bir yere değiştirir ve ayrıca ekleme moduna geçer. Ama geri kalan her şeyi silmek için çözüme gitmek istediğimi paylaşmak istedim.


1
Çözümle ilgili sorun, cfsilmeyi durdurmak istediğim karakteri belirtmem gerektiğidir. Sorular basitçe yapamazsanız ne yapmanız gerektiğini sorar cf)çünkü gerçekten ulaşmak istediğinizden (örneğin, değiştirmek istediğinizde ) )önce başka bir şey vardır . Temel olarak, sonradan basmaktan kaçınabileceğimi bilmek istedim . )func(x|, g(x, x), x, x, g(x, x))func(x).cf)
Mateusz Piotrowski

Ayrıca , verilen karaktere kadar silme tyerine, fsilme yerine de kullanabileceğinizi unutmayın , bu nedenle ilk örneğinizde ( func1(x|, func2(), y);) sadece kullanabilirsiniz d2t). @MateuszPiotrowski'nin dediği gibi, genel bir çözüm değildir ve hangi karakteri silmek istediğinizi bilmenizi gerektirir. Genellikle hangi karakterin bloğu sonlandırdığını bildiğiniz için, belirli bir dilde bulunuyorsunuz, bu o kadar da kötü değil.
Haegin

3

-Fit vim-ninja eklentisi aradığınız şey olabilir. Anladığım kadarıyla, "imleçten metin nesnesinin başlangıcına / sonuna kadar sil" i yapar d[ve d]" d]i)çevre parantezlerinin sonuna kadar sil" olmalıdır.

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.