Hareketle eşleme


12

Bir eşleme içinde sonraki hareketle operatörü nasıl kullanabileceğimi anlamaya çalışıyorum. Örneğin:

nmap /c c{here we pending for a motion}/<C-r>"<CR>

Harita aşağıdakileri yapmalıdır:

  1. cOperatörü etkinleştirin ve bir sonraki hareketi dinleyin;
  2. Örneğin, bir t,sonraki virgülden önce her şeyi değiştirmek için buraya yazabilirim ;
  3. İmleç ve virgül arasındaki her şeyi silen ekleme moduna gidin;
  4. Silinen metin otomatik olarak desen olarak aranır

Basitçe ifade etmek gerekirse, hareketli metin kaldırıldıktan sonra, silinen metnin vurgulanan örnekleriyle ekleme modunda bırakıldım. Birisi bu davayı çözmeme yardım ederse çok minnettar olurum.

GÜNCELLEME

Cevaplar neredeyse istediğim şey. Fakat! Tuşuna /cwbastığımda, kelime yerine bir şey yazın ve düğmesine basın <Esc>. Sonraki olaylarla aynı şeyi yapmayı bekledikten sonra. Ancak, bastırma işleminden sonra n(sonraki tekrarlamaya git) ve .(son komutu tekrarla), yerine son yazılan metnin başına gelir. Eşlemenin ana amacı, haritayı n/Nve .ile tekrarlamaktır. Bir şey kaçırdım mı?

Yanıtlar:


9

vim operatör eşlemesini destekler :h map-operator.

İhtiyacınız olan şey bir operatorfuncve bir eşlemedir. ihtiyaçlarınız için aşağıdaki kodlar çalışır. Bu sadece bir örnek, daha da hassaslaşıyorsunuz.

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

exec 'let @/=@"'Sadece arabellekteki kodları vurgulamak için olduğunu unutmayın . Vurgulamayı hemen görmek istemiyorsanız,let @/=@"


Sorumu güncelledim. Görünüşe göre cevabım ihtiyaçlarıma en yakın olanı, ama bir sonraki olayla aynı şeyi yapmıyor, bu yüzden sorudaki o anı açıkladım.
Timur Fayzrakhmanov

İki operatörünüz var ( /cve i) vim .sonuncuyu tekrarlıyor. Uzatmak istiyorsanız, repeateklentiyi kontrol edin . @TimurFayzrakhmanov da var :gve :skomutlar, size de yardımcı olabilir.
Kent

"Kodunuzda tuhaflık var mı 'let @/=@""'? Mümkün olduğunu düşündüm, örneğin silent exec 'normal! [v ]c', çünkü coperatör arama desenine değiştirilen metni eklememesi dışında beklediğim şeyi yapıyor.
Timur Fayzrakhmanov

1
@ TimurFayzrakhmanov "" bir yazım hatasıydı .. düzeltme .. Ben de geldim c, ancak bir boşluk ekledi, çünkü mod değişikliği var n-i-n-isanırım ... göreceksiniz bazı test yapın.
Kent

@TimurFayzrakhmanov d, yve startinsertile değiştirerek herhangi bir eklenti olmadan tekrarlanabilir hale getirebilirsiniz (aşağıdaki cevabıma call feedkeys("cgn", 'n')bakın)
Jerome Dalbert

4

İşlevleri kullanarak karmaşık eşlemeler uygulamak (ve belgelemek) daha kolaydır:

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

Ardından eşlemenizin bu işlevi çağırmasını sağlayın:

nmap /c :call DoMagic()<CR>

Düzenle:

Niyetinizi arama yapmak ve yerlerde çok sayıda yer değiştirme ise siz yedek komutunu denemelisiniz: :s. Görsel seçimi arama modeline kopyalamak için eşlemenizi değiştirebilirsiniz:

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>

1
bu bile "güzel" bir kullanıcı arayüzü ile, OP ihtiyacı için çalışır ve ne beklenenden "daha fazla" olabilir, ne girdi bağlıdır. Örneğin, bir bakın enter motion:, verdi: t,ggVGJZZ ^ _ ^ Bu komut birleştirme için yaygın bir sorundur
Kent

Neredeyse istediğim bu. Örneğin: tuşuna basıp /cwsözcük yerine bir şey yazıyorum , sonra tuşuna basıyorum <Esc>. Sonraki olaylarda da aynısını yapmak istiyorum. Ancak, bastırma işleminden sonra n(sonraki tekrarlamaya git) ve .(son komutu tekrarla), yerine son yazılan metnin başına gelir. Eşlemenin ana amacı, haritayı n/Nve .ile tekrarlamaktır. Bir şey kaçırdım mı?
Timur Fayzrakhmanov

1
Bu işlev, karmaşık eşlemelerle ilgili sorun yaşadığınızda işlevleri kullanma fikrini netleştirmek içindir. İhtiyaçlarınızı karşılamak için değiştirmelisiniz; .Komutunuzu tekrarlamak için Kent'in tavsiyelerini izlemeyi deneyin .
mMontu

Cevap için teşekkür ederim. Çok kullanışlı, ama ben (beklemede olmadan onları yazdıktan hemen sonra hareket yapmak çünkü @Kent Bir 'i kabul <CR>dan input()).
Timur Fayzrakhmanov

1
@ TimurFayzrakhmanov da güncellemede açıklandığı gibi, yerine geçmeyi deneyebilirsiniz.
mMontu

1

Bu çözüm "son komutu tekrarla" (aka .) ile çalışır:

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

Tekrarlarken, kullanmanıza bile gerek yoktur n, .daha hızlı gitmek istiyorsanız, bir sonraki oluşumu doğrudan almak ve değiştirmek için kullanabilirsiniz .

Eğer eşleşen sözcüklerin vurgular olması gibi İsteğe bağlı olarak, sen yerini alabilir 'cgn'tarafından 'n``cgn'.

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.