web-dev-qa-db-ja.com

sublimetextのようなVim複数行編集?

私は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のものに似た振る舞いを期待していました:

enter image description here

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

107
AlfredoVR

Windows互換性レイヤーを削除することで、あなた自身に賛成してください。

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

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

visual-blockモードのみを使用します。

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

    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>を押してvisual-blockモードに入り、選択を下部に向かって展開します。

    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番目のWordの最後の文字にカーソルを置きます。

    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>を押してvisual-blockモードに入り、選択を下部に向かって展開します。

    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;
    

visual-blockモードおよび Surround.vim

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

    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>を押してvisual-blockモードに入り、選択範囲を右下に広げます:

    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;
    

visual-lineモードおよび: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]を使用すると、行の範囲でnormalモードコマンドを実行できます('<,'>部分はVimによって自動的に追加され、選択した領域で動作することを意味します")

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

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

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

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

    • eeは次の単語の末尾に移動します

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

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

    Surround.vimを使用すると、上記のコマンドは

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

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

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

それはしばらく放棄されたように見えましたが、2014年にいくつかの貢献がありました。

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

私の経験では、他の多くのプラグインがインストールされている場合、競合が発生する可能性があります!

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

これらのいずれかが改善されていることに気づいたら、気軽に編集してください。

26
joeytwiddle

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


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


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


上記のアプローチのいずれかがあなたに合っていますか?

24
Rook

「グローバル」コマンドを使用すると、オンラインで何ができるかを任意の行数だけ繰り返すことができます。

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

例:

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

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

:g/.*/

すべての行で行います

12
srini.venigalla

vimが何をしているのかわかりませんが、興味深い効果です。あなたが望むものを記述する方法は、マクロがどのように機能するかのように聞こえます(:help macro)。このような何かは、マクロであなたが望むことをします(通常モードで開始):

  1. qa:マクロをaレジスタに記録します。
  2. 0w0行の先頭に移動、wは1ワードジャンプします。
  3. i"<Esc>:挿入モードに入り、"を挿入して、通常モードに戻ります。
  4. 2e:2番目のWordの最後にジャンプします。
  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. 単純な.で十分なので、今やったことを繰り返したいと思います。
5
Thor
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)
4
SergioAraujo

私の解決策は、次の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>

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

0
willmcpherson2