D [sayım] d'yi nasıl eşleyebilirim?


18

NB Bu değil yinelediği "d3fg" komutu nasıl çalışır? Kapatmak için oylamadan önce lütfen okuyun!

Küçük silmelerin büyükler gibi çalışmasını sağlamak için arayışımda biraz çıkmaza girdim . Sahip olduğum sorun, komutları nasıl yeniden eşleştireceğimizi anlayamıyorum d3d. Aslında, ilk etapta nasıl çalıştıklarını bile anlayamıyorum ya da Vim'in yardımında bunlardan bahsetmiyorum bile. *

d3jbasittir: doperatörü 3jharekete uygular ,

3ddaynı zamanda basittir: ddkomutu "sayım" 3 ile çalıştırır.

d3d basit olması gerektiği gibi görünüyor , doperatöre… uygular ama nedir 3d? Bu bir hareket değil. 3dKendi başına yazarsanız , Vim bunu bir sayı ve ardından bir operatör olarak ele alır ve daha fazla girdi için sabırla bekler.

Ve operatörleri diğer operatörlere uygulayamazsınız. ddyardımda iki operatörün bir sırası olarak tanımlanmamıştır. Ayrı, iki tuşlu bir komut. (bkz dc. hiçbir şey yapmaz.)

Ayrıca, sayının konumlandırmasının iki tuş vuruşu gerektiren komutlar için esnek olması da söz konusu değildir: 2gjimleci iki ekran satırından aşağı taşır, ancak g2jilk iki tuşa basmayı tamamen atar ve imleci bir satır aşağı taşır.

Peki nasıl çalışır? Bu sadece Vim'in iç kodunda özel bir durum mu? d[count]dHarita oluşturmamın bir yolu var mı ?

EDIT : Bir metin nesnesi mi? :h text-objects"metin nesnesi seçim komutları" listesine eklemez , ancak dd'yi "küçükten büyüğe nesneler" olarak gruplandırılmış silme listesine ekler. Ve d2awimlecin altındaki ve sonraki kelimeyi siler. Öte yandan, c2dhiçbir şey yapmaz.

* Eminim onlardan biraz bahsedilmeli, ama bulamıyorum. Ben okudum :help deleting, :help motion.txtve denenmiş :helpgrep dNd1-9 den N tüm değerler için .


2
Bence sonuncusu dbir teyit görevi görür; Yani aynı d3<CR>. y3yve c3caynı şekilde çalışıyorum ... Vim'de de bu konuda herhangi bir doküman bulamıyorum: yardım, vi (1), nvi (1) veya POSIX spec ... Aynı şekilde davranıyor vive nvibtw .
Martin Tournoij

1
Bir bakıma, ddaynıdır d_. _imleci ( [count]-1). satırdaki ilk boş olmayan alana getirir , ancak satırbaşıdır, bu nedenle bir işleçle eşleştirildiğinde tüm satırlarda çalışır. Bu nedenle, iki ds arasında bir sayımın görünmesi mantıklıdır .
tommcdo

Yanıtlar:


28

Operatör beklemede modu

Bir operatör (gibi yazarak arasında d, cya da gU) ve bir hareket (gibi w, i}ya da /foo<CR>) Vim Operatör askıda modundadır. Kullanarak bu için eşleştirmeleri oluşturabilir :omapve :onoremap.

Benim örneklerde, ben Operatör bekleyen haritaya gidiyorum diçin w. Bu rastgele bir seçim, çünkü aslında ne için kullanmak istediğinizi bilmiyorum.

Bir omap oluştur

dOperatör beklemede modunda bir eşleme oluşturalım . Burada VimScript yazdığımızı varsayacağım (sizin gibi .vimrc), bu yüzden önde gelenleri atlayacağım :.

onoremap d w

Bu ddgibi davranıyor dw. Aynı şekilde d[count]dhareket eder d[count]w. Ama eminim davranışını etkilemek istemediniz dd(yani, [count]tedarik edilmemiş ).

İfade eşlemeleri

İfade eşlemeleri, eşlemenin sağ tarafını oluşturmak için bir VimScript ifadesini değerlendirmenize olanak tanır. İfade bir dize olarak değerlendirilmelidir. İfade eşlemeleri <expr>anahtar kelime ile gösterilir .

Vim ayrıca çeşitli zamanlarda doldurulan ve eşlemeler sırasında genellikle yararlı olan bazı yerleşik değişkenlere sahiptir. Bunlardan biri v:countolan, [count]bir operatör veya hareket verilir.

Hepsini bir araya getirelim. Hayır verilirse [count], v:countolacaktır 0. Haritamızı sadece dbu durumda kullanmasını söyleyebiliriz .

onoremap <expr> d v:count == 0 ? 'd' : 'w'

Şimdi ddvarsayılan gibi davranır (bir satırı siler), ancak d[count]dgibi davranır d[count]w. Güzel!

dOperatörden sonra kullanımını kısıtlayın

Yine de bir şey fark edebilirsiniz. Şimdi cdde öyle davranıyor cw. Bu bir sorun olmayabilir, ancak tamlık için, onu sadece doperatörden sonra çalışacak şekilde sınırlayalım .

Vim, v:operatoren son kullanılan operatörü içeren başka bir değişkene sahiptir . Özel bir şey yapmadan önce bunu da kontrol edelim.

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : 'w'

NOT: yana :mapkomutları ile zincirleme edilebilir |, burada bizim ifadesinde bunları kaçmak zorunda. Böylece mantıksal OR operatörü ||olur \|\|.

Serin, böylece cdve c[count]dgeri eskisi gibi, hiçbir şey yapmadan için vardır. Diğer eklentilerin tanımlayabilmesi için bu iyidir cd.

Sadece başka bir hareketi silmek istemiyorum

d[count]dTamamen farklı bir şeyle eşleştirmek istiyorsanız , metni silmekle ilgisi yoksa, bunu da yapabiliriz.

Normal modda komutlar yazarken ve yanlışlıkla bir komut yazmaya başladığınızda, <Esc>bu komutu iptal etmek için tuşuna basabilirsiniz . Aynı şey eşlemeleriniz için de geçerlidir.

En yapalım d[count]dne kadar geçerli satırı değiştirin [count]olduğunu.

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : '<Esc>cc' . v:count . '<Esc>'

Haritalama son kısmı bir VimScript ifadesidir: <Esc>cc' . v:count . '<Esc>'. Bu <Esc>, bekleyen dkomutu iptal etmek , ardından ccgeçerli satırı değiştirmek v:count, [count](Ekle modunda) değerini yazmak ve <Esc>Normal moda dönmek içindir. Burada, VimScript birleştirme operatörünü kullanarak bir dize oluşturduğumuzu unutmayın ..


Gerçek kullanım durumunuz muhtemelen burada özetlediğimden farklı olacak, ancak umarım bu, topu yuvarlamanıza yardımcı olur.

Mutlu Vimming!


Mükemmel cevap! Upvoted. Sorunun başlangıcında kullanım durumuma (vi.SE de) bağlantı verdim, ancak sanırım kaçırmış olmalısınız. Temelde :omap d d(!) Yapmam gerekiyor , ancak özel operatör işlevini ayarlayan d için eşlememden dolayı maalesef operatör bekletme moduna asla ulaşılamıyor. Umarım d3dnasıl olması gerektiğine dair iş yapmak için bir şeyler yapmak mümkündür . (Herhangi bir fikriniz varsa bana bildirin veya tercih ederseniz diğer soruya eksiksiz bir çözüm yayınlamaktan çekinmeyin.) Yakında çözemezsem, bunu kabul edeceğim ve daha özel bir soru göndereceğim. Teşekkürler!
Zengin

1
Aslında, ikinci düşüncelerimde, bunu şimdi kabul ediyorum. Hem böyle bir eşlemenin nasıl oluşturulacağını hem de kaputun altında nasıl çalıştığını açıkladınız, bu da sordum.
Zengin
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.