別の行で始まるビジュアルブロックを貼り付ける方法


10

ビジュアルブロックで何かを(貼り付けて)貼り付ける、pまたはPでビジュアルブロックを選択しctrl+vてヤンク(コピー)するとy、以前の方法が維持されるため、コピーされたテキストが行の途中にあるときに、その後、可能な限り他のテキストの中間にコピーされます。逆に、select-line with Vは、コピーされた行を他のテキストに貼り付けず、別の行から開始します。

たとえば、私が今持っていると仮定します:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

私はカットしたいときAvocadoBean、およびCherry、(のように表さ選択を選択することで_

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

を押しy、カーソルを次の行に移動します(カーソルはとして表されます_)、

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

を押しPます。その結果:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

しかし、私が望んだのは:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

これらは行の途中でコピーされたため、行の途中で貼り付けられ、元の状態を模倣していることに気づくまで、毎回私を混乱させていました。

別の行から何かを貼り付けるのに最適な方法のようです。カーソルをで始め、03行下に移動して新しい場所に移動します。で挿入モードに入りi、を<return>3回押して、カーソルを6行戻し、右に元の場所に戻します。上記のように、コピーして、もう一度新しい場所に移動して貼り付けます。

いくつかのストロークを保存できますか?またはあなたは通常何をしますか?

(編集:上記のことは、私がこれを尋ねた瞬間に私がそれを理解した方法でした。正しい説明については、それらの回答を参照してください:)

回答:


11

テキストをコピーすると、それがレジスターに入ります。レジスター内のテキストのタイプはcharacterwiselinewiseまたはblockwiseです。

このタイプは、テキストが配置される方法を決定します。

あなたの例では、ビジュアルブロックモードからテキストをコピーしました。したがって、テキストにはタイプがblockwiseあり、名前のないレジスターに格納されていました"
このタイプのため、バッファ内に貼り付けると、ブロックとして貼り付けられます。


ブロックの代わりに一連の行として貼り付けたい場合は、3つの方法があります。

  1. 挿入モードからを押すと挿入できますC-r "
    名前のないレジスターの内容を、そのタイプが行ごとであるかのように挿入する必要があります。

  1. コマンドラインから、コマンドを使用できます:put
    :put元のタイプに関係なく、そのタイプがラインワイズであるかのように、レジスタ内にテキストを貼り付ける必要があります。レジスターの名前と引数として、レジスターを貼り付けたい行の下の行アドレスを渡すことができることに注意してください。

例えば:

:42put a

...レジスタの内容をth行のa下に置く必要があり42ます。

レジスタ名がない場合、Vimは名前のないレジスタ(または+を調整した場合はレジスタ'clipboard')を貼り付けたいと見なします。
そして、アドレスがない場合、Vimは現在の行の下に貼り付けたいと見なします。


  1. コマンドラインから、名前のないレジスタのタイプをsetreg()関数で変更できます。

    :call setreg('"', '', 'al')

ここでsetreg()は、名前のないレジスターに空の文字列を追加し(a3番目の引数として渡されたフラグのおかげで)、そのタイプを行単位に変更します(lフラグのおかげです)。

次に、通常モードから、p通常のコマンドを使用して、タイプが行単位であるかのようにレジスタを貼り付けることができるはずです。


それはあなたの問題に直接関係しているわけではありませんが、テキストをコピーすると、それも0レジスターに入ります。また、値unnamedplusをオプションの先頭に追加すると'clipboard'、それも+レジスターに入ります。

次のgetregtype()関数を使用して、レジスタのタイプを確認できます。

:echo getregtype('"')

小文字が返された場合vは、タイプが文字通りであることを意味します。
大文字を返す場合Vは、タイプが行単位であることを意味します。
が返された場合^V{some number}は、タイプがブロック単位であり、ブロックの幅がであることを意味します{some number}


3

レジスターの内容を特定の(文字ごと/行ごと/ブロックごと)モードに "キャスト"する必要があったため、UnconditionalPasteプラグインを作成しました。それが提供するgcpglpなどの代替内蔵(カンマまたは照会文字によって接合で貼り付けるように、このテーマに、現在いくつかのより変動によって)特定のモードを強制ペーストコマンド。

これを使用すると、テキストをどのようにヤンクしたかに関係なく、glp/ glPを使用して現在の行の後ろ/前に(新しい行として)貼り付けることができます。


そのようなことを書く時間があることをうらやましく思っていますQQしかし、私は満足してい:putます。(あなたも賛成しました)
Violapterin

@Aminopterin:私は頻繁に答えましたが、実際には最初の段落にsnipMateスニペットがあります。だから私は少しカスタマイズする必要があります。私の回答、そして賛成票に感謝します!
Ingo Karkat 2016

ああ、私はあなたがこのように片手でプラグインを書くのに時間があるとうらやましいと言った。そして私はvimを使用し始めました~~
Violapterin

2
@Aminopterinああ、プラグインはVimtipsからコピーされた小さなスニペットとして始まり、時間とともにゆっくりと成長しました。とても役に立ったので、だんだん大きくしていきました。多くの小さなステップは、大きな単一の努力よりも強力です!
Ingo Karkat 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.