web-dev-qa-db-ja.com

Vimの複数行に行の途中のテキストを追加するにはどうすればよいですか?

10行あり、それらの行で発生するWordにテキストを追加したいとしますか?行の先頭にある必要はありません。

から:

_sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf
_

に:

_sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf
_

_bar(_を付加するだけでなく、実際にfoobar(foo)で囲むことも可能ですか?

_//_コメントを複数行(Cスタイルのコメント)に追加する簡単な方法も欲しいです。

Vim/GVim 7.2を使用しています。

90
Sasha

最初のfooに移動し、を押します Ctrl-v 視覚的なブロックモードに入り、fooのすべての行がマークされるまで押し下げます。次に Shift-i (ブロックの)先頭に挿入します。終了したらを押します Esc、挿入された文字は、マークされたブロックの左側の各行に追加されます。

最後に挿入するには、もう一度押します Ctrl-v、上下に移動して、影響を受けるすべての行をマークしてから、を押します End または $ 行の終わりまで選択範囲を拡張します。今、あなたは押すことができます Shift-a 以前と同様に、すべての行の最後に追加する Shift-i

視覚的な選択は、通常の移動コマンドでも実行できます。したがって、Cのブロック全体をコメントするには、開き中かっこに移動して次のように入力します。 Ctrl-v%Shift-i//Esc

168
sth

最初の質問に答えるために、以下を

_:%s/foo/bar(&)/g
_

fooを探し、一致したパターンをbar()で囲みます。 _/g_は、これを1行で複数回行います。

fooと一致しているだけなので、簡単な:s/foo/bar(foo)/gを実行できます。ただし、単純なWord(たとえば_f[a-z][a-z]_)ではなく正規表現で一致することにした場合、上記は機能します。上記の「&」は、一致したものを表します。

44
Brian Agnew

一連の行にプレフィックスを付けるには、2つの異なるアプローチのいずれかを使用します。

1つのアプローチは、ブロック選択(sthが言及)です。一般的に、長方形の領域を選択するには ctrl-V カーソル移動が続きます。長方形をハイライトしたら、を押します shift-I 長方形の左側に文字を挿入します、または shift-A 四角形の右側に追加します。したがって、この手法を使用して、プレフィックスを付ける行の左端の列を含む四角形を作成できます。 shift-I、プレフィックスを入力し、エスケープを押します。

もう1つのアプローチは、置換を使用することです(Brian Agnewが述べたように)。 Brianの置換はファイル全体に影響します(コマンド内の%は「すべての行」を意味します)。ほんの数行に影響を与えるための最も簡単なアプローチは、 shift-V (これにより、視覚行モードが有効になります)最初/最後の行で、最後/最初の行に移動します。次に入力します:

:s/^/YOUR PREFIX/

^は正規表現です(この場合、行の先頭)。これを視覚的な行モードで入力すると、sの前に「<、」>が自動的に挿入されます。これは、置換の範囲が視覚的な選択になることを意味します。

追加のヒント:プレフィックスにスラッシュが含まれている場合は、バックスラッシュでエスケープするか、コマンドの区切り文字として別​​の句読文字を使用できます。たとえば、C++の行コメントを追加するには、通常次のように記述します。

:s:^:// :

接尾辞を追加する場合、すべての行がまったく同じ長さでない限り、置換アプローチは一般に簡単です。パターンの代わりに^の代わりに$を使用するだけで、文字列が事前にペンディングされる代わりに追加されます。

プレフィックスとサフィックスを同時に追加する場合は、次のようなことができます。

:s/.*/PREFIX & SUFFIX/

。*は行全体に一致します。置換の&は、一致したテキスト(行全体)を戻しますが、プレフィックスとサフィックスが追加されます。

ところで:コードをコメントアウトするときは、おそらく後でコメント解除したいでしょう。 visual-block(ctrl-V)スラッシュを選択してからdを押して削除するか、置換を使用することができます(おそらく視覚的な行選択で、 shift-V)このような先頭のスラッシュを削除するには:

:s:// ::
16

:通常の救助!

:%norm Wibar(

:%norm WEa)

:norm(al)は、コマンドを入力したかのように再生します。

W-次の単語に移動します

i-挿入モードを開始します

bar(-シーケンス 'bar('

または1行で:

:%norm Wibar(ctrlvESCEa)

Windowsを実行している場合は、次を入力します ctrlq の代わりに ctrlv

6
Cyber Oliveira

さらに別の可能性(おそらくテストケースではあまり有用ではありませんが、他の状況では便利です)は、マークで変更したい領域をコードで囲むことです。

  • 一番上の行の任意の場所にカーソルを置き、を押します 'a
  • 最後の行の任意の場所にカーソルを置き、を押します 'b
  • コマンド:'a,'b s/foo/bar(&)/を発行します

私は通常、すべてが画面に表示される場合は視覚ブロックモードが好きです。また、開始と停止が多くの画面で区切られている場合は、通常マークを好みます。

3
Godfrey Parke

別の単純な正規表現は次のとおりです。

%s/^/<text you want to prepend>/
1
Artorias2718

Cスタイルのコメントの場合は、Brianの正規表現の回答を使用し、$、および挿入します。

0
maxwellb