10

目的

行をヤンクし、それを使用して、それに続く行の一部を上書きします。

予測

この場合、置換を適用する行を手動で選択することをお勧めします。つまり、自動検索と置換は望ましくありません。

類推

このプロセスは、テキスト行から「スタンプ」を作成し、アイテムのリスト(各アイテムは「スタンプ」行に続くテキスト行)を調べ、その行をオーバーライドするかどうかを決定することと考えてください。 「スタンプ」かどうか(前者の場合、もちろん、行を「スタンプ」に置き換えます)。

カーソルの下の行をスタンプの内容に置き換えるトリガーのこの最後のステップは、可能な限り簡単にする必要があります。できれば、 (最後の変更を繰り返す)または .マクロレジスタの内容を実行する )を押すのと同じくらい簡単 です。@@@

問題

もちろん、簡単なワークフローは次のとおりです。

  1. コピーする行にカーソルを置きます(移動コマンドを使用)。
  2. V (コマンドを使用して)行単位のビジュアルモードに入ります。
  3. 選択したテキストをコピーします(y コマンドを使用)。
  4. 置換する行にカーソルを手動で置きます(移動コマンドを使用)。
  5. もう一度ビジュアルモードに入り、置き換えるテキストを選択します(V コマンドを使用)。
  6. 選択範囲に貼り付けます(p コマンドを使用)。

ただし、このアプローチは、交換を複数回行う必要がある場合は機能しません。具体的には、手順6でテキストを置き換えると、最初にコピーされ、「スタンプ」として使用することを目的とした行を含む(名前のない)レジスタが上書きされます。

私が試したこと

"_yスタンプの内容が失われないように、レジスターにヤンクまたは削除するために使用しようとしまし_ たが、リストを手動で調べて置換を適用するときに、すばやく快適に入力できるものを探しています。フィットを参照してください。

使いたくないもの

私はそれを助けることができれば、これにマクロや「リマップ」を使用したくありません。

実例となるサンプルファイル

さらに明確にするために、以下のサンプル開始ファイルを参照してから、目的の最終段階を参照してください。

サンプルファイル、開始条件

この段階で、を選択しblueberryて「スタンプ」にします。

blueberry

apple
banana
coconut
apple
banana
coconut
apple
banana
coconut

サンプルファイル、目的の最終状態

リストを移動した後、いくつかの行に「スタンプ」を適用して、「スタンプ」blueberry行と同じにしました。

blueberry

apple
banana
blueberry
apple
banana
coconut
apple
banana
blueberry
4

6 に答える 6

2

ワークフローを期待どおりに機能させるに"0は、デフォルトのレジスタではなく、前のヤンクレジスタから貼り付ける必要があります。

したがって、Vy(またはyy、同じです)を使用して、前と同じように最初の行をヤンクし、置換する行の上にカーソルを置いて、次の手順を実行します。

V"0p

これにより、現在の行が以前にヤンクされたテキストに置き換えられますが、ヤンクされたテキストは上書きされません。私はあなたを正しく理解したと思います!

編集1:マクロを使用して繰り返す

を使用してこの操作を繰り返すことができないことに驚きました.が、これはおそらくビジュアルモードを使用しているためです。マクロを使用して操作を繰り返すには、次のようにします。

qqV"0pq

@q次に、またはを押してマクロを繰り返すことができます@@

編集2:繰り返し使用.

.ビジュアルモードを使用せずに、を使用して繰り返し可能にする試みを次に示します。スタンプラインをヤンクしてカーソルを移動した後、次のようにします。

"_S<c-r>0<delete>

これは、insertmode<c-r>コマンドを使用してレジスターの内容を挿入します0<delete>スタンプラインにはキャリッジリターンが含まれているため、が必要であることに注意してください。そうでない場合(つまり、y$ではなくを使用してヤンクするyy)、<delete>を省略できます。

于 2012-09-22T20:31:27.983 に答える
1

ここでの多くの回答は、一般的なキーまたはコマンドの概要を示しています。私はそれらをReplaceWithRegisterプラグインに変えました。このプラグインは多くのコーナーケースも処理し、コマンドを介してすばやく繰り返すことができます.。また、あなたが説明したスタンプの作成と置換のテクニックを頻繁に使用しますが、私のスクリプトは不可欠であることがわかりました。気に入らない場合は、プラグインページに代替プラグインへのリンクもあります。

于 2012-09-23T09:24:56.810 に答える
1

少なくとも少しの「再マッピング」なしでは、目標を達成することはできないと思います。

私はこれを「長い間」使用しています。

vnoremap <leader>p "_dP

pPそれでも通常どおりに機能し、後で同じ貼り付けを繰り返したい場合は、視覚的な選択を押すだけです,p。単一のファンクションキーをマップして、全体をより速くすることもできます。

cまた、置換のフラグについて知っていますか?

:%s/coconut/blueberry/c

試合ごとに確認を求められます。

于 2012-09-22T21:22:16.317 に答える
1

Exコマンドを使用して、前述のワークフローを実現できます。

単一の置換の場合は、「スタンプ」行を(、、、、またはその他の方法で)ヤンクしてyyからVy、 コマンドとコマンド:yの組み合わせを繰り返し使用し ます。:put:delete

:pu|-d_

他のExコマンドと同様に、このコマンドは @:ショートカットを使用して簡単に繰り返すことができます(を参照:help @:)。その間に別のExコマンドが発行された場合を除きます(その場合、代わりにそのコマンドが繰り返されます)。

もちろん、上記のExコマンドをマクロとして記録し、その方法で呼び出すこともできます。

于 2012-09-23T05:57:12.860 に答える
1

本当に簡単な解決策:このスクリプトを.vimrcに入れてから、、、(2つのコンマ)を入力して削除キーの「バッファ上書き」副作用動作をオフに切り替え、「副作用なし」モードに入ります。

このモードでは、ワークフローは説明したとおりに機能します。好きなものをヤンクしてから、選択、貼り付け、削除を自由に繰り返してください。バッファは常にそのまま残ります。次に、vimの通常のバッファ変更動作を復元する場合は、もう一度、、と入力します。

スクリプトはここで受け入れられた答えです:

削除時のvimトグルバッファ上書き動作

于 2012-10-03T14:48:11.320 に答える
0

複製する行の先頭にカーソルを置きます。

  1. y$行全体をヤンクします(ラインフィードを除く)。
  2. j置き換えられる次の行にk進みます(必要に応じて繰り返します)
  3. 行をヤンクされたテキストに置き換えます
    • C<c-r>0<esc>0 (初めて)
    • . (その後)
  4. 置き換える行がまだある場合は、2に進みます。

各ステップの後、カーソルは列0に留まります。

于 2012-09-23T00:24:29.773 に答える