web-dev-qa-db-ja.com

視覚的な選択のすべての行のVimマクロ

頭の行数を合計するのではなく、選択範囲のすべての行でマクロを実行したいと思います。例えば、変換するマクロを書くかもしれません:

Last, First

First Last

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

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

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

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

76
Stefan Mai

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

:'<,'>normal @q

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

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

: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.
141
rampion

行を選択し、:を押してコマンドモードに入ります。 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
16
Dave Kirby

以下の関数を~/.vimrcに追加するか、ブラウザにコピーして:@+を実行するだけです

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

利点は、ビジュアル選択に任意のマクロを適用できることです。次のように、マクロ文字を引数として与える必要があります。

:Rover a
1
SergioAraujo