VIM'in komut satırında "imlecin altındaki kelimeyi" nasıl belirtebilirim?


86

VIM'de "imlecin altındaki kelimeyi" belirten bir komut yazmak istiyorum. Örneğin, diyelim ki imleci bir kelimenin üzerindeyken iki kez görünmesini sağlıyorum. Örneğin, kelime "abc" ise ve "abcabc" istiyorsam şunu yazabilirim:

:s/\(abc\)/\1\1/

Ama sonra imleci "def" konumuna getirebilmek ve aynı komutu "defdef" olarak değiştirmek için kullanmak istiyorum:

:s/\(def\)/\1\1/

Bunu yapması için komut satırına komutu nasıl yazabilirim?

:s/\(*whatever is under the commandline*\)/\1\1

Yanıtlar:


74

<cword>imlecin altındaki kelimedir (: yardım <cword>).

Üzgünüm, bu cevapta daha eksiksiz olmalıydım.

Ona bir komut atayabilirsiniz, yoksa tembeller için bu tuş vuruşları dizisi işe yarayacaktır:

b #go to beginning of current word
yw #yank to register

Ardından, kalıbınızı yazarken <control-r>0<enter>, komutunuza 0-inci yazmacının içeriğini yapıştıracak olan tuşa basabilirsiniz .

Bunun için aşağıdaki gibi bir komut da verebilirsiniz:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Komut satırınızı değiştirmek için '\' ve 'w' tuşlarına aynı anda

:s/\(<currentword>\)/

17
Ben büyük bir cevabı takdir ediyorum, ama muhtemelen öneririm yiwüzerinde bywsırf kas belleğinin. İmleci zaten kelimenin ilk karakterine olur senaryoda, gerekir ihmal bve sadece yazın ywsize vs olabilir ihmal iin yiw. Kazalar olabilir ve bir hata sabitleme kesinlikle daha :) basılmasını edilir
Jacob Swartwood

132

Komut satırı modundayken CTRL+ R CTRL+ W, kelimeyi imlecin altına ekler.

c_CTRL-RDiğer tüm özel kayıtların bir listesi için yardıma bakın :

:help c_CTRL-R

29
yiwP

yiw: İç kelimeyi (imlecin altındaki kelime) çekin. Bu komut ayrıca imleci sözcüğün başlangıcına taşır.

P: İmleçten önce yapıştırın.

Daha sonra örneğin: < ALT > - Dbu komuta eşleyebilirsiniz :

:nmap < ALT >-D yiwP

4
Soru özellikle, komut modundan değil, Vim'in komut satırından "imlecin altındaki kelimeyi" belirtmekle ilgiliydi
Nathan Fellman

12

Bunu yapmanın bir başka kolay yolu da *komutu kullanmaktır .

Normal modda, bir kelimenin üzerindeyken yazın

*:s//\0\0<Enter>

* arama modelini geçerli kelime yapar (örneğin \ <abc \>).

:s//mevcut arama modelini kullanarak bir değiştirme yapar \0ve değiştirme bölümünde eşleşen dizge bulunur.

Daha sonra, aynı şeyi tekrar yazarak veya yazarak bu davranışı tekrar edebilirsiniz, "def" kelimesinin üzerine söyleyin

*@:

@: sadece son ex komutunu <Enter> 'e ihtiyaç duymadan tekrarlar, bu durumda ikame.

Ayrıca kullanarak bunu yapmak için hızlı bir makro kaydedebilir qkomutu

qd*:s//\0\0<Enter>q

Sonra yazarak kalbinizin içeriğine tekrarlayın

@d

bir kelimenin üzerinde iki katına çıkarmak istediğinizde. Bu, önceki çözümden yalnızca bir karakter daha az olduğundan, sizin için buna değmeyebilir - eğer kelime ikiye katlama arasında diğer eski komutları yapmayacaksanız, bu da davranışını değiştirecektir.@:


1

Eşlemedeki ters eğik çizgilerden kaçmanız gerekir. Eşleme içine ikame dizesini de dahil edebilirsiniz.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

1
ywPx

tanımladığınız şeyi yapacak.

ywPxw

ayrıca imleci bir sonraki kelimeye ilerletir.


Soru özellikle, komut modundan değil, Vim'in komut satırından "imlecin altındaki kelimeyi" belirtmekle ilgiliydi
Nathan Fellman

Lütfen yanıtları bu şekilde tanımlayın, komuttaki her harfi.
Vitaly Zdanevich

0

@ user11211 , imlecin altındaki kelimeyi çoğaltmanın en basit yoluna sahiptir:

yiwP

iç kelimeyi çek (imleci kelimenin başlangıcına hareket ettirir), yapıştır (imleçten önce).

Örneğin. düz [t] ileri ----> basit savaş [d] basit

[] imleçtir

Detaylandırmak için ...

Muhtemelen imlecin yinelenen kelimenizi takip etmesini istersiniz:

yiwPea

düz [t] ileri ----> basit düz []

NOT:

yiw

yank iç kelimedir (boşluksuz)

yaw

tüm kelimeyi kopyala (sondaki boşluk dahil).

yawPea

bu nedenle boşluk ve konum imleci dahil olmak üzere yinelenen kelimedir.

düz [t] ileri ----> basit anlaşılır []


Soru özellikle , komut kipinden değil, Vim'in komut satırından "imlecin altındaki sözcüğü" belirtmekle ilgiliydi .
Nathan Fellman

1
Yukarıdaki normal (komut modu) komutlarından herhangi birini komut kipi içinde, bunlardan önce şu şekilde kullanabilirsiniz: normal ... örneğin: normal yiwP, normal kipte yiwP ile aynı şeyi yapacaktır. Elbette bu, istediğiniz şeyi yapmanın daha yavaş yolu.
Windows Öncesi BBW

-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

bunun ne yaptığı hakkında yorum yapabilir misin?
Nathan Fellman

1
Bu , imlecin altındaki kelimenin geçerli arabellekte kaç kez göründüğünü yazdırmak niçin :substitutekomuta bayrak kullanır . Oldukça zekice, ama aslında bu sorunun cevabı değil.
Jacob
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.