ビジュアルセレクションのすべての行のVimマクロ


86

頭の中の行数を合計するのではなく、選択範囲のすべての行でマクロを実行したいと思います。たとえば、次のように変換するマクロを作成できます。

Last, First

First Last

そして、私はそれをこれらすべての行で実行したいと思います:

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

Vimの達人のアイデアはありますか?

編集:これは単なる例であり、明らかにこれは些細なことですが、マクロを使用したいほど簡単ではない他のインスタンスが出てきます。


1
正直なところ、私はおそらくこの特定のタスクを正規表現で行います。しかし、この質問は、より複雑なケースでも有効です。
ジェイミーウォン

なぜvim?私の意見では、sedの方が適切です。
2010

8
@kogut:なぜエディターを終了して、1行の正規表現でテキストを編集するのですか?
スティーブン

1
わかり

回答:


154

q1行で実行された(そして残った)マクロがあるとします。次に、次の方法で、選択したすべての行で実行できます。

:'<,'>normal @q

(すでに行のグループを選択している場合は、コマンドラインでを押すと:生成さ:'<,'>れます)

たとえば、次のマクロは、行の最初の単語を除くすべての単語を大文字にします。

:let @q="^dwgU$P"

したがって、次の場所で実行します(+行が選択されている場所)

 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.

上記のnormal @qコマンドを使用すると、次のようになります。

 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パテ:まあ、はい、あなたはゴルフにそれを望んでいた場合:)
ホタルブクロ

1
@rampion:コマンドにタイプミスはありますか?:私のためにそれだけでこのように動作します:'<,'>normal! @q
オリバー

3
@oliver:マッピングを確認してください-再マップし@qた可能性があります。From :help normal-「[!]が指定されている場合、マッピングは使用されません。」
暴れ2011

2
@rampion:くそー...あなたは正しいです!私はヤンクリングを使用していますが、明らかにこれに問題があります:... ":normal @ a"でマクロを実行することはできません。それはまだ不可能ですが、「:normal!@a」yankringのヘルプドキュメントから)で実行できます
オリバー2011

1
私は個人的に次のような@ビジュアルモードでマップするのが好きですvnoremap @ :normal @。そう@aすれば、期待どおりに実行できます(ただし、
後でEnterキーを押す

19

行を選択し、を押し:てコマンドモードに入ります。Vimは自動的に入力'<,'>し、選択した行に範囲を制限します。あなたの例では、:sコマンドを使用してスワップを実行できます。

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

これにより、ビジュアル選択のすべての行でコンマで区切られた2つの単語が入れ替わります。

使用することもできます'<し、'>他のブックマークやラインの位置のように、移動コマンドの一部として、例えば、その通常モードでd'<視覚的な選択では最初の行の先頭に現在のカーソル位置から削除されます。ブロックが視覚的に強調表示されなくなっても、マークは有効なままです。

記録されたマクロをすべての行で再生する場合は、:normalコマンドを使用してマクロを実行する必要があります。残念ながら、:normalコマンドはある範囲の行では機能しませんが、:globalコマンドで修正できます。これにより:ex、正規表現に一致するすべての行でコマンドが実行されるため、次のことができます。

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

説明:

:'<,'>       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

これは、新しい行を追加するマクロをサポートしているため、受け入れられている回答よりも優れています。
ヤンWarchoł

@ Dave、Kirbyたぶんテキストのある行でのみマクロを実行するために交換^したほうがいいでしょう.
SergioAraujo 2017

1

以下の機能をに追加する~/.vimrcか、ブラウザにコピーして実行することができます:@+

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

利点は、視覚的な選択に任意のマクロを適用できることです。次のように、引数としてマクロ文字を指定する必要があります。

:Rover a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.