Vimで複数行の編集を繰り返すにはどうすればよいですか?


122

Vimでは、コマンドの前に数字を追加するだけでコマンドを繰り返すことができることを知っています。たとえば、次の方法で5行を削除できます。

5dd

たとえば、コマンドを適用する行の範囲を指定することも可能です。たとえば、

:10,20s:hello:goodbye:gc

「垂直編集」を実行するにはどうすればよいですか?たとえば、特定の記号、たとえばカンマを、指定された行の先頭(空白をスキップ、つまりコマンドモードでShift-Iの後にコンマを入力した場合に得られるもの)に挿入します。範囲。これはどのようにして達成できますか(ダウン期間ダウン期間ダウン期間に頼ることなく)?

回答:


107

:10,20s/^/,/

または、マクロを使用して、次のように記録します。

q a i , ESC j h q

で使用:

@ a

説明:q a登録するマクロの記録を開始aq終了を記録。このためaz利用できるレジスタがあります。


ありがとう。Shift-iと同等の機能が必要な場合はどうなりますか?つまり、最初の空白をスキップしますか?
saffsd 2008

2
説明:^\(\s*\)最初の空白を取り込んでレジスターに保存し、それをで読み取ることができます\1
Svante

136

Ctrl- vブロックごとにビジュアルモードに入ります。次に移動(hjkl通常どおり-wise)できます。複数の行に何かを挿入する場合はShift-を使用しますi

したがって、テキストについて:

abc123abc
def456def
ghi789ghi

あなたがヒットした場合Ctrl- vあなたのカーソルで1かけ、ヒットj2つの列を下るために二回、そしてShift- i,ESC、あなたのテキストは次のようになります。

abc,123abc
def,456def
ghi,789ghi

(複数行の挿入には少し遅れがあり、を押すまでレンダリングされませんESC)。


3
いいね。Ctrl-Vは大文字を意味し、ちなみにCtrl-Shift-vと言うこともできます
Svante

8
実際には、CTRL-vまたはCTRL-Vです。VimはCTRL-コードの大文字と小文字を区別しません(:help CTRL- {char}を参照)。
ランピオン

2
このメソッドが機能しなかった理由を少し調べたところ、iではなく大文字のI(shift-i)を使用しているためです(また、ctrl-shift-vで最後に移動したため、ctrl-vのみでした)
ウィリーフロッグ

4
私は興味がある。彼らはなぜiシフトキーなしで使用しないのですか?
off99555 2016年

1
シフトなしのiは現在の位置に挿入されます。Shift + iは行頭に挿入
Kevin P


44

すでに「。」を使用している場合 あなたの最後のコマンド多くのことを繰り返して、その後、私が見つかりました。これは、これまでに最も便利なソリューションであることを。これを使用して、ビジュアルブロックの各行で最後のコマンドを繰り返すことができます。

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
これは便利ですが.、ビジュアルモードで行ごとに動作するため、制限もあります。この場合のビジュアルモードは、行範囲を選択するのに便利な場合があります。ただし、この場合、コマンドとマクロはより柔軟で強力です。
ボーア

23

これを行う最も簡単な方法は

1)マクロを1行記録し、それを「a」と呼びます。この場合、1つのタイプ

qa I、ESC jq

2)マクロを適用する行のブロックを選択します

3) 'norm'関数を使用して、この行ブロックに対してマクロ 'a'を実行します。つまり、

:'<,'>norm@a

17

一番簡単なのは、マクロを記録して、必要な回数だけマクロを繰り返すことです。たとえば、各行の先頭にカンマを追加するには、次のように入力します。

q a I , ESC j q

それを5回繰り返すには、次のように入力します。

5 @ a


2

.オペレーターに既に保存されている編集を使用して、以下を実行します。

  1. ビジュアルモードを使用して演算子を適用するテキストを選択します
  2. 次に、コマンドを実行します :norm .

1

すでに回答したように、マクロを除いて、ある範囲の行にコンマを挿入する特定のケース(たとえば、10行目から20行目)については、次のようにすることができます。

:10,20s/\(.*\)/,\1

つまり、\(と\)を使用して番号付きグループマッチを作成し、置換文字列で\ 1を使用して「マッチの内容で置換する」と言うことができます。

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