web-dev-qa-db-ja.com

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

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

33
cwd

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

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

  1. yy:レジスタ0"の両方にヤンクラインが追加されました。
  2. 置き換える行に移動します。
  3. dd:レジスタ"には削除された行がありますが、レジスタ0にはまだヤンクされた行があります。
    "0P:レジスタ0から最初にヤンクされた行を貼り付けます。
  4. 置換する次の行に移動します。
  5. dd"0P(上記と同じ)

(バッファの最後の行を置き換えるときのカーソルの配置方法により、"0pではなく"0Pを使用する必要があります。)

これは Bruce Edigerの回答 に非常に似ていますが、最初にヤンクするときにレジスタを指定する必要がない点が異なります。 (たとえば)一部の行をAAAに置き換え、他の行をBBBに置き換える必要がある場合(ただし、レジスタにAAAを置く)、1つ以上の名前付きレジスタを使用すると非常に便利です。 a、およびBBBをレジスタbに(またはそれらの1つをレジスタ0に残してから、適宜貼り付けます)。

行ごとのビジュアルモード(V)で0から貼り付けて、キーストロークを保存することもできます:V"0p

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

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

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

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

この場合も、マッピングの方が便利な場合があります。

noremap <Leader>d "_d
31
Chris Johnsen

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

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、2行目には"byy、3行目には"cyyを使用します。私は自分の精神的負担を減らす習慣をつけました(レシピの一般性を減らします)。

11
Bruce Ediger

:sを使用してこれを行う方法は2つあり、入力するタイピングの量によって異なります。最も簡単な方法は、単純な検索と置換です。

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

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

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

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

または、置換文字列のコピーがある場合、"ayyおよび"byyを使用して2つを別々のレジスタにヤンクして、aおよびbレジスタにヤンクすることができます。 、それぞれ(レジスターには任意の文字を使用できます)。次に使用します Ctrl+ra そして Ctrl+rb それらを検索に貼り付けてフィールドを置き換えます。

1対1のBruceではありませんが、置き換える前に行をチェックしたい場合は、cオプションを追加するだけです。

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

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

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

2
mouche

この種のことには、通常の検索と組み合わせてc、 "change"、コマンドを頻繁に使用します。関心のあるテキストの各行/部分についてファイルを検索し、連続したn.コマンドを使用できます(次の場合はn、次に.を使用して最後の変更を繰り返します)。

/^hello-helloで始まる行を検索します。
c$goodbye-行をさようならに変更します。
n.-検索を繰り返し、変更を繰り返し

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

すべてのviと同様に、どのような編集を行うかに応じて、多くのオプションをポケットに入れておくことをお勧めします。

2
rghome