回答:
デフォルトでは、貼り付けコマンドは(「名前なし」)レジスタを使用します"
。事実上、レジスタに書き込むコマンドは名前のないレジスタにも書き込まれるため、ヤンク、削除、変更はすべて影響します。これが、yank-delete-pasteシーケンスが、ヤンクされたテキストの代わりに削除されたテキストを貼り付ける理由です。
ここで0
登録が役立ちます。レジスタを指定しないyankコマンドは、0
(に加えて"
)ヤンクされたテキストをregisterに入れます。削除または変更操作の影響を受けないため、途中で削除または変更を行った場合でも、ヤンクした行を複数回貼り付けることができます。
yy
:登録0
および"
両方にヤンクされた行があります。dd
:登録"
には削除された行がありますが、登録には0
まだヤンクされた行があります。"0P
:元のヤンクされた行をregisterから貼り付けます0
。dd"0P
(同上)(バッファの最後の行を置換するときのカーソル位置の動作のため、"0p
代わりにを使用します"0P
。)
これは、最初にヤンクするときにレジスタを指定する必要がないことを除いて、Bruce Edigerの答えに非常に近いです。1つ以上の名前付きレジスタを使用すると、(たとえば)一部の行をAAA
で置き換え、他の行をBBB
(AAA
レジスタa
に入れて、レジスタに入れて(またはBBB
、レジスタのb
1つをレジスタに入れて)0
)、それに応じてそれらを貼り付け)。
また0
、行単位の視覚モード(V
)から貼り付けて、キーストロークを保存することもできますV"0p
。
入力する必要がない場合"0
は、マッピングの方が便利な場合があります。
noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p
別の方法は、_
(「ブラックホール」)registerに削除することです。削除しても"
レジスタは影響を受けないため、yank-delete-pasteシーケンスは、名前のないレジスタからヤンクしたテキストを貼り付けることができます。
yy
:Register 0
と"
両方にヤンクされた行があります。"_dd
:レジスタに変更はありません。P
:元のヤンクされたテキストをregisterから貼り付けます"
。繰り返しますが、マッピングの方が便利な場合があります。
noremap <Leader>d "_d
ケビンはかなり良い答えを持っているように見えますが、削除する各行に目を向ける場合は、置き換えて、わずかに異なる解決策が存在します。
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
は、最初の行、"byy
2番目の行、"cyy
3 番目の行などに使用します。精神的な負担を軽減するために、習慣を作りました(これによりレシピの一般性が低下します)。
"ayy
してからdd
、中dd
にあるものを置き換えることはありませんa
が、私が入力p
すると、それを使用して削除されたものを貼り付けdd
ます。そして、私"ayy
が削除しているもので現在のものを置き換えたい場合、私は使用します"add
-それは正しいですか?
これを行うには:s
、入力する量に応じていくつかの方法があります。最も簡単な方法は、単純な検索と置換です。
:%s/find this line/replace with this/
%
ファイル全体を検索し、出現をすべて置き換えます。
入力が多すぎる場合は、宛先文字列(yy
)をヤンクし、"
(デフォルト)レジスタを使用して挿入しCtrl+r "ます。
:%s/<ctrl+r><">/replacement/
あなたが置換文字列のコピーを持っている場合は、あなたが別のレジスタに2をヤンクすることができます"ayy
し、"byy
にヤンクするa
とb
(あなたがあなたの登録のための任意の文字を使用することができます)、それぞれのレジスタ。次に、Ctrl+r aとCtrl+r bを使用してそれらを検索フィールドに貼り付け、フィールドを置き換えます。
1回限りのブルースではなく、行を置き換える前に行を確認する場合は、c
オプションを追加するだけです。
:%s/find this line/replace with this/c
を使用V
して、ビジュアルモードで置換する行を強調表示し、ヒットpp
してその行に貼り付けることができます。
これはキーストロークを1つ追加するだけなので、かなり良い解決策のようです。
V
p
。
私は、c
通常の検索と組み合わせて、このようなことに対して、頻繁に「変更」コマンドを使用します。興味のあるテキストの各行/部分をファイルで検索してから、連続したn.
コマンドを使用することができます(n
nextおよびthen.
最後の変更を繰り返します)。
/^hello
-helloで始まる行を見つけます。
c$goodbye
-行を別れに変更します。
n.
-繰り返し検索、繰り返し変更
ファイル内の既存の行に変更する場合は、入力バッファーにコピーして(GUIで許可されている場合)、貼り付けて最初の変更コマンドの内容を取得します。
viのすべての場合と同様に、実行する編集の種類に応じて、ポケットに多くのオプションを用意することをお勧めします。
yy
(置き換えられる行に移動します)S<C-r>0<Esc>
。.
コマンドで繰り返し可能という利点があります。