vimで貼り付ける(上書きする)にはどうすればよいですか?


31

ではvim私が使用yyし、pすべての時間ヤンクへとラインを貼り付けます。ただし、ファイル内の1つの行を複数の場所に置き換えたい場合は 、クリップボード/レジスタへの行が削除されるyy p dd pため使用できませんdd。レジスタの使用方法をもっとよく知っているはずですが、おそらくp現在の行を置き換える方法があると思います。

回答:


27

デフォルトでは、貼り付けコマンドは(「名前なし」)レジスタを使用します"。事実上、レジスタに書き込むコマンドは名前のないレジスタにも書き込まれるため、ヤンク、削除、変更はすべて影響します。これが、yank-delete-pasteシーケンスが、ヤンクされたテキストの代わりに削除されたテキストを貼り付ける理由です。

ここで0登録が役立ちます。レジスタを指定しないyankコマンドは、0(に加えて")ヤンクされたテキストをregisterに入れます。削除または変更操作の影響を受けないため、途中で削除または変更を行った場合でも、ヤンクした行を複数回貼り付けることができます。

  1. yy:登録0および"両方にヤンクされた行があります。
  2. 置換する行に移動します。
  3. dd:登録"には削除された行がありますが、登録には0まだヤンクされた行があります。
    "0P:元のヤンクされた行をregisterから貼り付けます0
  4. 置換する次の行に移動します。
  5. dd"0P (同上)

(バッファの最後の行を置換するときのカーソル位置の動作のため、"0p代わりにを使用します"0P。)

これは、最初にヤンクするときにレジスタを指定する必要がないことを除いて、Bruce Edigerの答えに非常に近いです。1つ以上の名前付きレジスタを使用すると、(たとえば)一部の行をAAAで置き換え、他の行をBBBAAAレジスタaに入れて、レジスタに入れて(またはBBB、レジスタのb1つをレジスタに入れて)0)、それに応じてそれらを貼り付け)。

また0、行単位の視覚モード(V)から貼り付けて、キーストロークを保存することもできますV"0p

入力する必要がない場合"0は、マッピングの方が便利な場合があります。

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

別の方法は、_(「ブラックホール」)registerに削除することです。削除しても"レジスタは影響を受けないため、yank-delete-pasteシーケンスは、名前のないレジスタからヤンクしたテキストを貼り付けることができます。

  1. yy:Register 0"両方にヤンクされた行があります。
  2. "_dd:レジスタに変更はありません。
    P:元のヤンクされたテキストをregisterから貼り付けます"

繰り返しますが、マッピングの方が便利な場合があります。

noremap <Leader>d "_d

2
または、tl; drを使用するだけですyy(置き換えられる行に移動します)S<C-r>0<Esc>.コマンドで繰り返し可能という利点があります。
ワイルドカード

11

ケビンはかなり良い答えを持っているように見えますが、削除する各行に目を向ける場合は、置き換えて、わずかに異なる解決策が存在します。

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

この種のレシピを使用すると、パターンマッチングを使用して削除および置換する行を見つけることができます。また、ファイルの先頭(1G)に戻り、好きなだけ頻繁に検索できます。2つ以上の行を集めて繰り返し配置する場合"ayyは、最初の行、"byy2番目の行、"cyy3 番目の行などに使用します。精神的な負担を軽減するために、習慣を作りました(これによりレシピの一般性が低下します)。


非常に素晴らしい。したがって、私が使用"ayyしてからdd、中ddにあるものを置き換えることはありませんaが、私が入力pすると、それを使用して削除されたものを貼り付けddます。そして、私"ayyが削除しているもので現在のものを置き換えたい場合、私は使用します"add-それは正しいですか?
cwd

「ayyは行をレジスタ「a」にコピーします。「dd」は行を「a」ではなくデフォルトのレジスタにカットします。「p」はデフォルトのレジスタを貼り付けます。正しいです。そして、「addは行をレジスタ「a」にカットします、「ayyコマンドからの内容を置き換えることになる。
ブルースEdiger

5

これを行うには:s、入力する量に応じていくつかの方法があります。最も簡単な方法は、単純な検索と置換です。

:%s/find this line/replace with this/

%ファイル全体を検索し、出現をすべて置き換えます。

入力が多すぎる場合は、宛先文字列(yy)をヤンクし、"(デフォルト)レジスタを使用して挿入しCtrl+r "ます。

:%s/<ctrl+r><">/replacement/

あなたが置換文字列のコピーを持っている場合は、あなたが別のレジスタに2をヤンクすることができます"ayyし、"byyにヤンクするab(あなたがあなたの登録のための任意の文字を使用することができます)、それぞれのレジスタ。次に、Ctrl+r aCtrl+r bを使用してそれらを検索フィールドに貼り付け、フィールドを置き換えます。

1回限りのブルースではなく、行を置き換える前に行を確認する場合は、cオプションを追加するだけです。

:%s/find this line/replace with this/c

2

を使用Vして、ビジュアルモードで置換する行を強調表示し、ヒットppしてその行に貼り付けることができます。

これはキーストロークを1つ追加するだけなので、かなり良い解決策のようです。


これは動作しません:ペーストした後、クリップボードがでマークされたテキストが含まれV
ダニエルkullmann

ただのシングルp
アーロントーマ

2

私は、c通常の検索と組み合わせて、このようなことに対して、頻繁に「変更」コマンドを使用します。興味のあるテキストの各行/部分をファイルで検索してから、連続したn.コマンドを使用することができます(nnextおよびthen.最後の変更を繰り返します)。

/^hello-helloで始まる行を見つけます。
c$goodbye-行を別れに変更します。
n.-繰り返し検索、繰り返し変更

ファイル内の既存の行に変更する場合は、入力バッファーにコピーして(GUIで許可されている場合)、貼り付けて最初の変更コマンドの内容を取得します。

viのすべての場合と同様に、実行する編集の種類に応じて、ポケットに多くのオプションを用意することをお勧めします。

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