Her Görsel Seçim Satırında Vim Makro


86

Kafamdaki satırların sayısını toplamak yerine, seçimdeki her satırda bir makro çalıştırmak istiyorum. Örneğin, dönüştürmek için bir makro yazabilirim:

Last, First

İçine

First Last

ve tüm bu satırlarda çalışmasını istiyorum:

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

Herhangi bir fikir Vim guru?

DÜZENLEME: Bu sadece bir örnek, tabii ki bu önemsiz bir şekilde yeniden ifade edilebilir, ancak makroları kullanmayı tercih ettiğim kadar kolay olmayan başka örnekler de var.


1
Dürüst olmak gerekirse, muhtemelen bu belirli görevi regex ile yapardım. Ancak soru, daha karmaşık durumlar için hala geçerlidir.
Jamie Wong

Neden vim? Bence sed daha uygun.
54'te kokosing

8
@kogut: Metninizi tek satırlık bir normal ifadeyle düzenlemek için neden düzenleyicinizden çıkasınız?
Stephen

1
Tamam, noktayı
anladınız

Yanıtlar:


154

qTek bir satırda çalışan (ve kalan) bir makronuz olduğunu varsayalım . Ardından, seçiminizdeki her satırda şununla çalıştırabilirsiniz:

:'<,'>normal @q

(Halihazırda seçili bir satır grubunuz varsa , komut satırına basmak :üretir :'<,'>)

Örneğin, aşağıdaki makro, bir satırdaki ilk hariç her kelimeyi büyük harf yapar:

:let @q="^dwgU$P"

Öyleyse, aşağıdaki ( +satırların seçildiği yerde) çalıştırarak

 0000: a long long time ago
 0001: in a galaxy far away
+0002: naboo was under an attack
+0003: and i thought me and qui-gon jinn
+0004: could talk the federation in
 0005: to maybe cutting them a little slack.

Yukarıdaki normal @qkomutla şunu üretir:

 0000: a long long time ago
 0001: in a galaxy far away
 0002: naboo WAS UNDER AN ATTACK
 0003: and I THOUGHT ME AND QUI-GON JINN
 0004: could TALK THE FEDERATION IN
 0005: to maybe cutting them a little slack.

@Roger Pate: iyi, evet :) golf kendisine isteseydi
rampion

1
@rampion: Komutunuzda bir yazım hatası var mı? benim için sadece şu şekilde çalışıyor::'<,'>normal! @q
oliver

3
@oliver: eşlemelerinizi kontrol edin - yeniden eşlemiş olabilirsiniz @q. Kimden :help normal- "[!] Verilirse, eşlemeler kullanılmayacaktır."
rampion

2
@rampion: lanet olsun ... haklısın! Ben yankring kullanıyorum ve görünüşe göre bununla ilgili bir sorun var: ... ": normal @a" ile bir makro çalıştıramazsınız. Hala mümkün değil, ancak bunu ": normal! @A" ile çalıştırabilirsiniz (yankring'in yardım belgelerinden)
oliver

1
Ben şahsen haritasına ister @böyle görsel modunda: vnoremap @ :normal @. Hala yapabilirsiniz Bu şekilde @abeklediğiniz gibi (siz :( sonradan girmek vurmak zorunda olsa)
LondonRob

19

Satırları seçin ve :komut moduna girmek için tuşuna basın . Vim '<,'>, aralığı seçilen satırlarla sınırlayan otomatik olarak dolduracaktır . Örneğiniz için :s, takas yapmak için şu komutu kullanabilirsiniz :

:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/

Bu, görsel seçimdeki her satırda virgülle ayrılmış iki kelimeyi değiştirecektir.

Ayrıca , örneğin bir hareket komutunun bir parçası olarak başka bir yer imi veya çizgi konumunu da kullanabilir '<ve bu şekilde kullanabilirsiniz '>, böylece normal modda d'<mevcut imleç konumundan görsel seçimdeki ilk satırın başlangıcına kadar silinir. Blok artık görsel olarak vurgulanmasa bile işaretler etkin kalır.

Kayıtlı bir makroyu her satırda yeniden oynatmak istiyorsanız, makroyu :normalkomutla çalıştırmanız gerekir . Maalesef :normalkomut bir dizi satırda çalışmıyor, ancak bunu :globalkomutla düzeltebilirsiniz . Bu, bir :exnormal ifadeyle eşleşen her satırda bir komut çalıştırır , böylece bunu yapabilirsiniz:

:'<,'>g/^/ norm @a

Açıklama:

:'<,'>       for every line in the visual block
g/^/         on every line that matches the regex /^/ - i.e. every line
norm         run in normal mode
@a           the macro recorded in a

Bu, kabul edilen cevaptan daha iyidir çünkü yeni satırlar ekleyen makroları destekler.
Jan Warchoł

@Dave Kirby Belki alışverişi daha iyi olurdu ^ile .olmaz, sadece bir bölüm vardır hatlarında makro çalışmasını sağlamak için?
SergioAraujo

1

Aşağıdaki işlevi ekleyebilir ~/.vimrcveya tarayıcınıza kopyalayıp çalıştırabilirsiniz.:@+

fun! RunMacroOverSelection(macroname)
    execute "'<,'>normal @". a:macroname
endfun
com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
nnoremap <leader>r :Rover<space>

Avantajı, görsel seçime herhangi bir makroyu uygulayabilmenizdir. Makro harfini argüman olarak vermeniz gerekir, örneğin:

:Rover a
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.