Vim:複数行にわたって同じ文字を挿入します


306

時々、複数の行にまたがるテキストの特定の視覚的なブロックを編集したい。

たとえば、次のようなテキストを使用します。

name
comment
phone
email

そして、それをこのように見せます

vendor_name
vendor_comment
vendor_phone
vendor_email

現在私が今それを行う方法は...

  1. を押しVてからj4回押して、ブロックの4行すべてを選択します。
  2. でインデントし>ます。
  3. で1文字戻りhます。
  4. でビジュアルモードをブロックしますCtrlv
  5. j4回押して、4行下を選択します。この時点で、空白の4x1ビジュアルブロック(4行と1列)を選択しています。
  6. を押しCます。これは、左に1列インデントされていることに注意してください。
  7. " vendor_"引用符なしで入力します。元に戻す必要がある余分なスペースに注意してください。
  8. を押しEscます。これはEsc、挿入モードを終了するために使用する非常に数少ない時間の1つです。Ctrlc最初の行だけを編集します。
  9. 手順1を繰り返します。
  10. 逆方向にインデントし<ます。

単語の前に空白の列が少なくとも1列ある場合、インデントする必要はありません。で視覚ブロックをクリアする必要がない場合は、空白は必要ありませんc

しかし、私がクリアする必要がある場合、インデントで必要な空白を作成せずに上記で実行したことを実行する方法はありますか?

また、複数の行を一度に編集すると、Escover で挿入モードを終了することでしか機能しないのはなぜCtrlcですか?


次に、より複雑な例を示します。

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

この例では、の上で垂直方向のビジュアルブロックを実行し、.挿入モード中に再挿入します。つまり、と入力し.whatever.ます。うまくいけば、今あなたはこの方法の欠点を見ることができます。私は、垂直位置ですべて同じであるテキストの列のみを選択することに制限されています。


9
より良い方法:「:%s / ^ / vendor_ /」
Paul Tomblin、

1
ご回答ありがとうございます。これは、すべての行に単語を追加するだけの場合に機能します。しかし、私が使用する方法は、どの位置でも実行できます。より複雑な例を使用して、別の例を追加しましょう。
hobbes3 2012

3
そして、あなたはシフト-Vで変更したい行を強調表示し、適切な検索を入力して、コマンドを置き換える-第二の例では、:s/models\./\0whatever./
ポールTomblin

上記を実現する多くの方法。質問のすべての部分に完全に答えてから、パート1)regexまたはビジュアルモードのどちらかで編集escは、回答で提供されているようにうまく機能します(GVIMでのビジュアル選択を好みます)。パート2)については、Brian Nealが提供するマクロがおそらく最も簡単です。これらすべての種類の「ハウツー」について私が知っている最高のリソースは、Drew NeilによるPractical Vimです。数式を忘れたときの優れたクイックリードと軽量リファレンス。この推奨事項がお役に立てば幸いです。多くのvimユーザーにとっては、努力する価値があります。
arcseldon 2013年

@Paul:そして、あなたしている場合、カウントキーストローク、あなたは置き換えることができ\0&
icktoofay 2014

回答:


912
  1. カーソルを移動nの中でname
  2. ビジュアルブロックモードに切り替えます(Ctrlv)。
  3. j3回押します(または3j)。
  4. I(大文字のi)を押します。
  5. と入力しvendor_ます。注:最初の行の画面のみが更新されます- Escが押されるまで(6.)、その時点ですべての行が更新されます。
  6. を押しEscます。

メソッドを示すミニスクリーンキャスト

小文字はテキストオブジェクトの開始と解釈されるため、小文字ではIなく大文字を使用する必要があります。これは、タグブロック()内で選択する場合など、それ自体でかなり便利です。iiit

「it」テキストオブジェクトの有用性を示すミニスクリーンキャスト


12
これをWindowsで機能させることができませんでした(CTRL + Vがクリップボード貼り付け用にマップされているため)。しかし、VimはこれをWindowsバージョンのCtrl + Qにもマッピングしました。
Arnestig 14

2
@Ven:その間、Vimは実際にはビジーではありません。別のキーを押すのを待っているだけで、最終的にタイムアウトします。2つの実験:最初に、エスケープを押してから、すぐにjまたはなどの別のキーを押してみてください^L。結局、Vimは忙しくなかったはずです。ただ待っていました。次に、(デフォルトではなく)などの'timeout'低い値に変更してみて、タイムアウトが早くなることを確認し80ます1000
icktoofay 2014

1
@icktoofay設定しようとしている変数がそうではtimeoutlenないようtimeoutです。
jez 14

4
@ANjaNA:挿入する場所がすべて同じ列にある場合(たとえば、数字がすべて同じ長さの場合)、Aではなくを押す以外は同じ手法を使用できますI。ただし、線の長さが異なる場合は機能しません。私はそのために各行の終わりに一致する置換を使いたい:s/$/inserted/です。例えば、いくつかの行を選択してを使用します。
icktoofay 2015

3
これを機能させるには、
Escキー

69

別のアプローチは、.dot)コマンドをと組み合わせて使用することIです。

  1. 開始したい場所にカーソルを移動します
  2. 押す I
  3. (たとえば、あなたがしたいプレフィックスを入力vendor_
  4. を押しescます。
  5. 押すjと行を下ります
  6. 入力.して最後の編集を繰り返し、自動的にプレフィックスを再度挿入します
  7. 間で交互に迅速jかつ.

私は、このテクニックは、あなたが範囲内のすべての単一の行にテキストを挿入する必要がない場合は、簡単に余分押して、それらをスキップできることを速く追加の少数のためのビジュアルブロックモードよりも、多くの場合で、追加の利点を持って見つけるjのを。

多数の連続した追加の場合、ブロックアプローチまたはマクロが優れていることに注意してください。


別のアプローチを見てうれしいです。
Ibn Saeed

ほんの数行でこれを好みます。IMOを実行する方がはるかに簡単です。
Dan Bechard、2014年

プレフィックスを入力したら、エスケープキーを押す必要はありませんか。
iamnotsam 2014

41
  1. を使用して、変更する行を選択しますCtrlV
  2. 押す:

    • I:選択されているものの前に挿入します。
    • A:選択されたものの後に追加します。
    • c:選択したものを置き換えます。
  3. 新しいテキストを入力します。

  4. を押しEscて、選択したすべての行に変更を適用します。

4
優れた!私Esc自身のようなVIM初心者のための最後のステップを強調しておきます-変更が「後から」伝搬されることを理解するのにしばらく時間がかかりました!
Bugs Bunny

1
ニース、 "A"と "C"オプションも知らなかった。
hobbes3

なぜこれはうまくいかないのvですか?私はそれを行うことができCtrl+V --> Aますが、やってvは動作しませんテキストを選択する- Aその行に追加のみ。彼らは両方とも選択ではないですか?また、非常に奇妙です- Aビジュアルブロックを行の最後まで拡張した場合にのみ、行の最後に追加されます。それ以外の場合は、各行のビジュアルブロックが終了するところに追加します。それが違いを認識しないようなものだaとしますA
Alex G

1
c代わりにを使用する必要Cがありましたが、問題なく動作しました。ありがとう
タロル

29

マクロを使用して自分の行動を記録し、それを繰り返します。

  1. 名前の最初の文字にカーソルを置きます。
  2. ヒットqqして、qバッファーへの記録を開始します。
  3. 押しiて挿入モードに入り、vector_と入力してから、を押してEsc挿入モードを終了します。
  4. ここでヒット0して、行の先頭に戻ります。
  5. さあ、j降りてください。
  6. 今すぐヒットq録音を停止し、再び。

これで素晴らしいマクロができました。

入力3@qしてマクロを3回実行し、残りの行を実行します。


「q」は特別ですか(「クイックマクロ」ですか)?
Peter Mortensen、

マクロを永続化するにはどうすればよいですか(複数のセッションで機能します)?
Peter Mortensen、

@PeterMortensen Vimには、セッションと呼ばれる機能があり、調査できるバッファ(およびその他の多くのもの)を永続化します。
ブライアンニール

27
:%s/^/vendor_/

または私は何かを逃していますか?


vender_プレフィックスが不要な他の多くの行があるファイルのサブテキストである可能性があるという事実を見逃しています。
Dan Bechard、2014年

9
@danサブテキストのみが必要な場合は、検索を行番号のセットに制限できます。例1,4s/^/vendor_/
Brad Koch

1
@BradKoch興味深い。そのおかげで、行番号の制約に気づきませんでした。
Dan Bechard、2015年

8
興味深いですが、より実用的なのは、select with Vおよびtype を視覚的にブロックすること:です。edを:'<,'>選択範囲にのみ適用するed式の前に付きます:'<,'>s/^/vendor_/
Dolanor

12

2016年1月更新

受け入れられた回答は素晴らしい解決策ですが、これは実際にはわずかに少ないキーストロークであり、原則として受け入れられた回答に基づいて、より適切にスケーリングされます。

  1. カーソルを移動nの中でname
  2. ビジュアルブロックモードに切り替えます(ctrlv)。
  3. 押す 3j
  4. を押しIます。
  5. と入力しvendor_ます。
  6. を押しescます。

視覚的イラスト

これは、提供された承認済みの回答よりもキーストロークが少ないことに注意してください(ステップ3と比較)。実行するjアクションの数を数えるだけです。

(上記のように)行番号を有効にしていて、移動先の行番号がわかっている場合は、手順3を#Gに変更できます。#は目的の行番号です。

上記の例では、これはになります4G。ただし、少数の行番号を処理する場合は、明示的なカウントが適切に機能します。


7

vi(nanoではない)しかないサーバーの設定ファイルの多くの行をコメント化したかったので、視覚的な方法も面倒でしたここに私がそれをした方法があります。

  1. ファイルを開く vi file
  2. 行番号を表示:set number!または:set number
  3. 次に、行番号を使用して、行の先頭を「#」に置き換えます。方法

:35,77s/^/#/

注:数値には包括的で、35から77までの行が含まれています。含まれている両方が変更されます。

それをコメント解除/元に戻すには、単に使用します :35,77s/^#//

コードのすべての行の後にコメントとしてテキストの単語を追加する場合は、次も使用できます。

:35,77s/$/#test/ (Pythonなどの言語の場合)

:35,77s/;$/;\/\/test/ (Javaのような言語の場合)

クレジット/リファレンス:

  1. /unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. /unix/120615/how-to-comment-multiple-lines-at-once


私はしばしばvim-tinyのみを使用しているので、これは私にとって完璧なソリューションでした。
JSON C11

7

また、テキストのブロックを削除して置き換えたいというユースケースもあるかもしれません。

このような

Hello World

Hello World

Hello Cool

Hello Cool

両方の行で "World"を視覚的にブロック選択できます。

c変更のためのタイプ-挿入モードになります。

必要なものを挿入して、エスケープを押します。

どちらも垂直に反射されます。挿入するのではなく、ブロックを新しいテキストで置き換えることを除いて、「I」と同じように機能します。


6

次のファイルがあるとします。

something

name
comment
phone
email

something else
and more ...

「name」、「comment」、「phone」、「email」の前に、「vendor_」を追加しますファイル内のどこにあるか関係ありません

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

cフラグは、確認を求めるメッセージが表示されます。プロンプトが必要ない場合は、ドロップできます。


5

より柔軟な代替案:

例:行の先頭にテキストXYZを入力するには

:%norm IXYZ

ここで何が起こっているのですか?

  • % ==すべての行で実行
  • norm ==通常モードで以下のキーを実行します
  • I ==行頭に挿入
  • XYZ ==入力したいテキスト

次にを押すEnterと実行されます。

あなたの要求に固有:

:%norm Ivendor_

特定の範囲を選択することもできます。

:2,4norm Ivendor_

または、選択した視覚範囲で実行します。

:'<,'>norm Ivendor_

1
挿入モード(通常はIabc <ESC>)で<Esc>などのキーシーケンスを送信して、より興味深い処理を行うことはできますか?
batbrat

1
@batbrat私はこれを理解しました!をctrl-v ctrl-[押して「エスケープされたEsc」を挿入すると、通常のコマンドの目的で「通常モード」に戻ります。私はこれを'<,'>norm Iaa^[ysiw"でテストしました^[。エスケープされたEscはどこですか。
オーブリーラヴィーン

4
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line

この方法はvimのすべてのバージョンで機能しますか、それともvimプラグインが必要ですか?私が尋ねる理由はb / cですそれは時々いくつかのマシンで動作しますが、時々動作しません。違いがわかりません。Windowsでgitに付属しているvim-動作しません。一部のubuntuおよびcentos linuxマシンでは、機能しません。いくつかのまれなケースで成功しましたが、成功を再現できませんでした。それは謎です。ESCを押しても何も起こらないようです。
davidj411 2017年

奇妙なことに、今はうまくいきます。おそらく星以外は何も変更されていません:)私の問題の解決策を探しているときに、このページで何かを見つけましたが、vim vim.wikia.com/wiki/Inserting_text_in_multiple_linesで探す必要があると記載されていることを 確認します。 :versionコマンドを入力して、ブロック演算子の機能(I、Aなど)を使用します。出力には+ visualextraを含める必要があります。
davidj411 2017

私はあなたの答えではなく、一般的にコメントを追加するつもりでした。これらの回答のほとんどは同じことを言いますが、異なる単語を使用しています。鉱山には別のものがあり、リンクが含まれていました。
davidj411

2
  1. Ctrl + vビジュアルブロックモードに移動します
  2. 上矢印と下矢印を使用して線を選択します
  3. 小文字を入力3i小文字を I 3回押す)
  4. I(capitalを押しIます。挿入モードになります。)
  5. 追加したいテキストを書く
  6. Esc
  7. 下矢印を押す
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.