崇高なテキストのようなVimの複数行編集?


132

私はgvimを使い始めましたが、gvimで複数行編集がどのように機能するのか理解できません。

例えば:

元のテキスト:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q、jjjjjj、$すべてを選択してから、Iを押して複数行の挿入を行います。

私の意図は、最初の行のように引用符を挿入してから、Escキーを押すことです。

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

どうした?私はsublimetextのような動作を期待していました:

ここに画像の説明を入力してください

それがどのように機能するかわからない場合は、すべての行のアクションを繰り返すだけです。どうすればそれを達成できますか?そして、vimはここで何をしていますか?


キーボードマクロを記録して最初の行を変更し、他のすべての行のマクロを再生するだけです。
high5 2012

回答:


214

Windows互換性レイヤーを削除することにより、自分に有利に働きます。

Visual-Blockモードに入る通常のショートカットは<C-v>です。

他の人はマクロの記録を扱ってきました、ここにいくつかの他のアイデアがあります:

ビジュアルブロックモードのみを使用します。

  1. カーソルを2番目の単語に置きます。

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. を押し<C-v>ビジュアルブロックモードに入り、選択範囲を下に向かって拡大します。

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. ヒットI"<Esc>して取得:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. 3番目の単語の最後の文字にカーソルを置きます。

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. を押し<C-v>ビジュアルブロックモードに入り、選択範囲を下に向かって拡大します。

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. ヒットA"<Esc>して取得:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

ビジュアルブロックモードとSurround.vim

  1. カーソルを2番目の単語に置きます。

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. を押し<C-v>ビジュアルブロックモードに入り、選択範囲を右下に拡大します。

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. ヒットS"「であなたの選択を囲むように:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

視線モードと:normal

  1. を押しVて行全体を選択し、下に向かって展開します。

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. 次のコマンドを実行して:'<,'>norm ^wi"<C-v><Esc>eea"<CR>、取得します。

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]一連の行で通常モードのコマンドを実行できます('<,'>パーツはVimによって自動的に追加され、「選択した領域で動作する」ことを意味します)

    • ^ カーソルを行の最初の文字に置きます

    • w 次の単語に移動します

    • i""カーソルの前にaを挿入します

    • <C-v><Esc>このコンテキストで制御文字を入力するVimの方法です。ここでは、挿入モード<Esc>を終了するために使用されます

    • ee 次の単語の終わりに移動します

    • a""カーソルの後にa を追加します

    • <CR> コマンドを実行します

    Surround.vimを使用すると、上記のコマンドは次のようになります。

    :'<,'>norm ^wvees"<CR>
    

7
ステップ4と5のために私は打っ推薦するgv以前の視覚的な選択を取り戻すために、そしてその後で、おそらく、水平方向に移動します2e。(行数が多いほど、価値gvが高くなります!)
joeytwiddle '16年

4
sSS"
Surround.vim

1
視覚ブロック+ Surround.vimのポイント3はあるべきS"ではないs"
zool

1
ビジュアルブロックモードのステップ5と6の代わりに、3番目の単語の後にカーソルを置いてを押すだけ.です。
Jonas

2
これはクールですが、これは、異なる行で編集する文字が各行のまったく同じ水平位置にあり、編集された行が次々と正しい場合にのみ機能します。Vimのどの行の編集モードに入るかをチェリーピックすることはできませんか?私たちは昇華することができます... 編集:実際に2番目の答えは私が探していたものです
Alexandre Bourlier

30

これらは上記のすぐに使える優れたソリューションですが、Sublimeなどの複数のカーソルを提供するプラグインを試すこともできます。

これは有望に見えると思います:

しばらく見捨てられたようですが、2014年にいくつかの貢献がありました。

それは非常に強力ですが、フローに慣れるまで少し時間がかかりました(非常に崇高なものに似ていますが、Vimのようにまだモーダルです)。

私の経験では、他の多くのプラグインをインストールしている場合、いくつかの競合に遭遇する可能性があります!

この機能には他にもいくつかの試みがあります:

これらが改善されていることに気づいたら、遠慮なく編集してください。


github.com/osyo-manga/vim-overが現時点で最も活発なグループのようです
2015

すばらしい、それが私が探していたものです
アレクサンドルボーリエ

1
それらのほとんどをテストした後、hlissner / vim-multieditは最高のAFAIACのようです
Alexandre Bourlier

1
vim-multiple-
cursorの

29

Vimでそれを実現するにはいくつかの方法があります。Sublime Textに最も似ているものはわかりません。


1つ目は、複数行挿入モードによるものです。カーソルを最初の行の2番目の「a」に置き、を押してCtrl-V、すべての行を選択してから、を押してI、二重引用符を入力します。を押す<esc>と、すべての行で操作が繰り返されます。


2つ目はマクロによるものです。カーソルを最初の文字に置き、でマクロの記録を開始しqaます。で右に移動しllll、で挿入モードに入り a、二重引用符を書き、挿入モードを終了して、行の先頭に戻ります。<home>(または同等の)で。を押しjて1行下に移動します。で録音を停止しqます。そして、でマクロを再生し@aます。数回。


上記のアプローチのいずれかがうまくいきますか?


15

「global」コマンドを使用すると、1つのオンラインで実行できることを任意の数の行で繰り返すことができます。

:g/<search>/.<your ex command>

例:

:g/foo/.s/bar/baz/g

上記のコマンドは、fooを含むすべての行を検索し、その行にあるすべてのbarをbazに置き換えます。

:g/.*/

すべての行で行います


1
これはとても便利で、知らなかった。コマンドの組み合わせはとても強力で賢いようです。
0xc0de

便宜上、カーソルの下の単語(または視覚的に選択された単語)を受け取り、置換を求めるプロンプトを表示して、:gここで説明するコマンドを実行する小さな関数を作成しました。私はを使用/gcして「確認」を求めるのが好きです。そうすることで、ヒットしyたりn、各置換を行ったりa、それらすべてを変更したりできます。
joeytwiddle

11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)

ステップ3ではI挿入モードに入ることができません。これがなぜ起こるか知っていますか?
忍者

プラグインなしでvimをロードしてみてください。vim -u NONE必要なアクションをもう一度実行してみてください。vimの動作を変更するマップまたはプラグインである可能性があります。
SergioAraujo

6

vimをしているのかはわかりませんが、面白い効果です。必要なものを説明する方法は、マクロの機能(:help macro)に似ています。このような何かはあなたがマクロで望むことをするでしょう(通常モードで始まる):

  1. qaa登録するマクロを記録します。
  2. 0w0行頭に移動し、w1単語ジャンプします。
  3. i"<Esc>:挿入モードに入り、a "を挿入して通常モードに戻ります。
  4. 2e:2番目の単語の終わりにジャンプします。
  5. a"<Esc>:を追加し"ます。
  6. jq 次の行に移動してマクロの記録を終了します。

まとめて: qa0wi"<Esc>2ea"<Esc>

これで、マクロを@aで実行し、最後のマクロをで繰り返し@@ます。ファイルの残りの部分に適用するには、次のようにします99@a、99行を超えていないことを前提にして、マクロの実行がファイルの終わりに達したときに終了します。

ここでは、visual-block-mode(通常モードで開始する)目的の達成方法を示します。

  1. 最初の見積もりを配置する場所に移動します。
  2. を入力しvisual-block-mode、影響を与える行を選択し、G、ファイルの最後に移動します。
  3. ヒット I"<Esc>
  4. 挿入したい次の場所に移動する "
  5. あなたは今したことを繰り返したいので、単純なもので.十分です。

4
99 @ aは必要ありません。ファイルのすべての行でマクロを実行したい場合は、:%norm!@a。
ルーク

ドットがない場合(コマンドの一部ではなく、文の終わりにすぎません)
ルーク

9999@a醜いかもしれ:%norm! @aませんが、入力するよりもはるかに簡単で、編集したばかりの行では再実行されません。とにかくそれを知っておくのは良いことです。:)
joeytwiddle 2015年

0

私の解決策は、次の2つのマッピングを使用することです。

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

それらを使用する方法:

  1. 行を選択します。次の12行を選択する場合は、押すだけですV12j
  2. 押す <leader>n
  3. ラインに変更を加えます
  4. 通常モードであることを確認してから、 <leader>m

別の編集を行うために、再度選択を行う必要はありません。を押し<leader>nて編集し、を押し<leader>mて適用します。


仕組み:

  • <Esc><Esc>0qq ビジュアル選択を終了し、行の先頭に移動して、マクロの記録を開始します。

  • q マクロの記録を停止します。

  • :'<,'>-1normal!@q<CR> ビジュアル選択の開始から終了前の行まで、各行でマクロを再生します。

  • <Down> 最後の行に戻ります。


同じキーをマップすることもできますが、モードは異なります。

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

これは別の編集を行う能力を台無しにしますが。行を選択し直す必要があります。

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