vi / vimで複数行選択の先頭にテキストを挿入する方法


423

ではVimの、どのように私は選択の各行の先頭に文字を挿入できますか?

たとえば、//私の言語のコメントシステムでのようなブロックコメントが許可されていないと想定して、各行の先頭に先頭に追加してコードブロックをコメント化し/* */ます。どうすればいいですか?

回答:


748
  • 押しEscて「コマンドモード」に入ります
  • Ctrl+ Vを使用してビジュアルブロックモードに入ります
  • Up/ Downを移動して、コメントする行のテキストの列を選択します。
  • 次にShift+ iを押して、挿入するテキストを入力します。
  • 次にを押しEsc、1秒待つと、挿入されたテキストがすべての行に表示されます。

詳しくは、Vim Tips Wikiの「Inserting text in multiple lines」を確認してください。


6
これの唯一の厄介な点は、Ctrl + VがGVIMでオーバーライドされているように見えることです。
ジョーダンパーマー

14
私にとっては(Linuxでは)そうではありません
pixelbeat 2008年

23
Ctrl-QをgVimの代わりに使用できます(:help Ctrl-Vで説明されています)。このモードで移動するには、矢印キーではなくhjklを使用する必要があります
Gareth

9
ctrl-vがWindowsのgvimでオーバーライドされている場合は、グローバルvimrcを編集してmswin.vimのインクルードを停止する必要があります。
graywh 2009年

18
これがescを押した後に何もしないのはなぜですか?100行未満で何かが発生するまで、10秒ほど待ってShift + vいましたCTRL + v。@ vkaul11おそらくあなたが笑ったのと同じこと
Tek

186

これにより、各行の先頭が「//」に置き換えられます。

:%s!^!//!

これは、選択された各行の先頭(ビジュアルモードを使用して選択)を「//」に置き換えます。

:'<,'>s!^!//!

gv(通常モードでは)最後のビジュアル選択を復元することに注意しください。これは時々役立ちます。


3
ありがとう!完全に理にかなっています。そして、テキストの削除は次のようになります: '<、'> s!^ // !!
ジョーダンパーマー、

4
上記の回答の感嘆符の意味は何ですか?(:%s!^!//!)
Henrik K

19
@HKK、通常はスラッシュ文字/を検索および置換コマンドの区切り文字として使用します。この場合、検索と置換の一部としてスラッシュを挿入しているので、代わりの区切り文字、つまり感嘆符を使用します。
サイバーモンク

+1これはVsVimで機能し、(Ctrl + V)(Shiift + I)Escは機能しません。
セス・リノ

4
+1、正規表現の区切り文字として他の何かを使用できるとは思いもしませんでした(ここでは、書く代わりにin /をエスケープする必要//:s/^/\/\/ありました:s!^!//
Hashbrown

83

検索と置換の一般的なパターンは次のとおりです。

:s/search/replace/

現在の行の最初の「search」を「replace」に置き換えます

:s/search/replace/g

現在の行のすべての「search」の出現箇所を「replace」に置き換えます。「g」は「global」の略です

このコマンドは、現在の行についてのみ、「search」が出現するたびに「replace」に置き換えます。%は、ファイル全体を検索するために使用されます。各置換をインタラクティブに確認するには、確認のために「c」を追加します。

:%s/search/replace/c

ファイル全体の「search」を「replace」に置き換えるインタラクティブな確認

%文字の代わりに、行番号の範囲を使用できます( '^'文字は行頭の特別な検索文字であることに注意してください)

:14,20s/^/#/

14〜20行目の先頭に「#」文字を挿入します

別のコメント文字(//など)を使用する場合は、コマンドの区切り文字を変更します。

:14,20s!^!//!

14〜20行目の先頭に「//」文字シーケンスを挿入します

または、常に//文字を次のようにエスケープすることもできます。

:14,20s/^/\/\//

14〜20行目の先頭に「//」文字シーケンスを挿入します

エディターに行番号が表示されない場合は、次のように入力してください

:set nu

先頭の#:を削除するには、:14,20s /#/ ^ /の代わりに、:14,20s /#//を使用する必要があります
cn1h

1
@ cn1h私はこれが#ラインの他のものも置き換えると思います。^#代わりに使用する必要があります。
ankush981 2015

基本を説明していただきありがとうございます。なぜ何かが起こるのかを知るのは良いことです。
didierCH

38

新規参入者にとってより簡単かもしれない別の方法:

 some█
 code
 here

カーソルを最初の行に置きます。

gg

次のように入力して挿入モードに入り、テキストを追加します。

I / / Space

 // █some
 code
 here

を押しEscてコマンドモードに戻り、ダイグラフを使用します。

j . j .

 // some
 // code
 //█here

j1行下がるモーションコマンドで.、最後に行った編集コマンドを繰り返します。


3
それは本当に簡単です:)。問題がある場合|は、大文字ではなくバー(\が付いたもう1つの記号)を入力していることが原因である可能性がありますI|最初はと思った。
cokedude 2014

1
「5」をすると 同じ行から5文字削除します。各行から一度に5文字を削除するにはどうすればよいですか?
Rahul Prasad

1
@RahulPrasadたとえば、25行あるとします。最初の行の先頭から始めて、レジスタに5xjを記録し、そのレジスタを24回再生します。次に例を示します。qa5xjq25 @ aこれを実際の質問として投稿した方がよいでしょうまだ存在しない場合...
ninegrid

26

そしてさらに別の方法:

  • 行頭に移動
  • ビジュアルブロックモードに入る(CTRL- v
  • あなたがしたい行を選択します(と下/上に移動j/ k[ライン]で行に、またはジャンプG
  • 押すI(それは大文字i)
  • コメント文字を入力してください
  • 押す ESC

20

これは#すべての行の最初に追加されます:

:%s/^/#/

そして、人々はあなたが適切にコメントするスクリプトの欠如について不平を言うのをやめるでしょう。


2
選択した(またはいくつかの)行のみに#を追加する場合
Rahul Prasad

15

それについて非常に凝ったものにしたいなら、これを.vimrcに入れてください:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

その後、ビジュアルモードでは、あなたがヒットすることができますたび\c、Cブロックをommentと\uするuのそれをncomment。もちろん、それらのショートカットキーストロークを何にでも変更できます。


何か新しいものを紹介したので賛成です- vmap
ankush981 2015

11

さらに別の方法:

:'<,'>g/^/norm I//

/^/すべての行に一致するダミーパターンです。 norm次の通常モードのコマンドを実行できます。 I//カーソルを行の先頭にジャンプしながら挿入モードに入り、次のテキスト(2つのスラッシュ)を挿入するように指示します。

:g 多くの場合、複数の行で複雑なことを実行するのに便利です。複数のモード間でジャンプしたり、行を削除または追加したり、カーソルを移動したり、一連のマクロを実行したりすることができます。そして、パターンと一致します。


1
実際には:gコマンドは必要ありません。これは次のようになります:: '<、'> norm I //
Cyber​​ Oliveira

1
そして、この場合にも:sを使う方が良いです。
graywh 2009年

これが最も役立つ答えです。
2016

3

コードのブロックにコメントを付けるために、私はNERD Commenterプラグインが好きです。

テキストを選択してください:

Shift-V
...select the lines of text you want to comment....

コメント:

,cc

コメント解除:

,cu

または、行またはブロックのコメント状態を切り替えます。

,c<space>

2

EnhCommentifyプラグインをお勧めします。

例えば。これをあなたのvimrcに入れてください:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

次に、(選択した)行を '、c'でコメント/コメント解除できます



1

コメントする領域をビジュアルブロックとしてマークします(<C-V

そして、やります c#<ESC>p

  1. c「#」に変更します
  2. 元に戻す

頻繁に行う場合\qは、.vimrcにショートカット(例)を定義します

:vmap \q c#<ESC>p

1

誰かの複数行選択が実際に段落である場合、手動で行を選択する必要はありません。vimはあなたのためにそれを行うことができます:

  1. vip:段落全体を選択してマークします
  2. shift-i:行頭にテキストを挿入
  3. escape:挿入モードのままにする/通常モードにする[行頭はまだ選択されています]
  4. escape:行頭の選択を解除

0

各行の先頭に「ABC」を挿入するには:

1)コマンドモードに移動します

2):%ノルムI ABC


これにより、行の最初の非スペース文字の左側にテキストが追加されます。
Kingsley 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.