vimで次の数行をすばやく変更しますか?

vimで次の数行をすばやく変更しますか?

現在ファイルがあります(現在の場所は[n]です)。

The [p]hilosophical chicken saw the street
The red dog saw the street
The red dog crossed the street
The apple was red
The red dog crossed the street
The red dog was sleeping

次の4行を変更したいと思います。赤犬到着哲学的な鶏

私がよく遭遇する状況であり、結局マウスを使うようになる状況です。


最小限のキーストロークでこれを達成するための最速の方法は何ですか?

これまで私は試しました

  • Ctrl + gを押して行数を数え、次の行を数えて実行します。 :2,5s:red dog:philosophical chicken:g
    • 多くの時間、思考、タイピング
  • マクロ - >qu /red dog Enter c2W philosophical chicken Esc /red dog Enter q 2@u
    • 完了したら、交換(:s)を使用するのと同じくらい高速です。
  • 2yW j P 2dE- 両方の単語を取り出し(句読点を無視)、1行下に移動した後、カーソルの前に貼り付けて両方の単語を削除します。
    • 1行をすばやく完了しますが、今私のバッファに赤犬だから、戻ってバッファを再キャプチャする必要があります。
  • 強調する哲学的な鶏マウスで端末でCtrl+Shift+Cj 2cW+ Ctrl+ Shift+ VEsc- をクリックしてテキストをコピーし、1行下に移動して2つの単語を変更し、挿入モードに入り、貼り付け、Escを使用して挿入モードを終了します。
    • vimにマウスがありますか? :(
  • c2W philosophical chicken Esc ?red dog Enter .N.N.- 単語を2つ変更、脱出するには「Philosophy Chicken」入力、「Red Dog」の逆検索、最後のタスクを実行(2つの単語をPhilosophy Chickenに変更)、繰り返し
    • 完全な2つの単語を再入力する必要があります。

マウスを使って変更をコピーして貼り付けることが、これまで私にとって最速の方法でした。これは正しいアプローチではありません。

どうすればいいですか?

理想的には、2つの単語を取り出し、red dog2つの単語を取り出したバッファにナビゲートして置き換えたいと思います。

答え1

@MattObertが言った内容を最適化します。

  • y3iw
  • /red dogEnter
  • c3iwCtrl-r0Esc
  • n.など。

詳細:

  • y3iwyank philosophical chicken;y2W末尾の空白を含む後者よりも少し優れています。このiw部分はまた、最初の単語ではなく、最初の単語の中央にカーソルを置いたときに、ヤンクが動作し続けることを保証します。
  • /red dogEnter最初のものを探すred dog
  • c3iw削除red dog(後にスペースなしで再び)と挿入モードに切り替える
  • Ctrl-r0レジスタから貼り付け0:h i_CTRL-Rおよび参照:h quote0
  • Escノーマルモードに切り替える
  • n.次の項目を見つけて、前のred dogタスクを再実行します(例:に置き換えますphilosophical chicken)。
  • n.必要に応じて繰り返します。

最初の秘密は、ヤンクが自動的に登録に保存されることです0。 2番目の秘密は、挿入モードで貼り付けレジスタを使用できることですCtrl-r

役に立つ可能性のあるその他の事項:

  • 行番号をオン:(:setlocal relativenumber! number!オフにするにはもう一度実行してください)
  • マクロと同じ:nnoremap <silent> <Leader>, :setlocal relativenumber! number!<CR>
  • カーソル行に基づいて行オフセットを使用します。:.,+6 s/.../.../
  • 確認と交換::%s/red dog/philosophical chicken/gc

Drew Nealの作品をチェックしてくださいウィムキャッスル他の同様のヒントを確認してください。 Vimに関する質問を次のサイトに投稿することも検討してください。ウェブサイトにアクセス

答え2

もちろん、これを行う方法はいくつかあります。しかし、最も簡単な方法はreddogを検索することです。

/red dog

次に、2つの単語を変更します。

c2w

これにより、次のように入力できる挿入モードに切り替わります。

philosophical chicken

次に、Escキーをコマンドモードに戻し、次のように入力します。

n.n.

red dogのすべてのインスタンスを交換するまでphilosophical chicken。 (n次の検索インスタンスが渡され、red dog前の.コマンドが繰り返されます。)

考えが少なく、タイピングも多くなく、バッファを使う必要もありません。(バッファは素敵です!)

私は質問を誤解しているかもしれませんが、この方法はとても簡単なので、なぜ他の人が過度に考えているのか疑問に思います。

編集する:

質問をもっと注意深く読んだ後、上記のオプションの1つがこれの変形であることがわかりましたが、OPは「2つの単語全体を再入力する必要がある」という理由でこれを拒否しました。すみません。しかし、これはまだ私が好む方法です。

答え3

私は通常最初の方法を使います。しかし、これが気に入らない場合は、3番目の方法を少し変更することをお勧めします。

  1. "a2yW、「哲学的な鶏」を引っ張るバッファA入力
  2. jたとえば、必要な方法でRed Dogに移動します/red dog
  3. 2dWそして"aP(または"aPそして2dE)「哲学的なチキン」を貼り付けます バッファAからそして「Red Dog」を削除してください。
  4. ステップ2と3を繰り返します(バッファAまだ含まれています「哲学的な鶏」)。以前に「赤犬」を検索したことがある場合は、n繰り返し検索を使用してください。j以前に使用したことがある場合は、以下を使用してください2Bj (または3行から5行に移動するなど)。2B2j

答え4

philosophical chickenまず、もう一度入力するより短いので、引き出します。それから私のプラグインの1つを使いましょう。

代替A

そして私グローバルプラグインの変更、入力されたテキスト(ここでは貼り付けられたレジスタ)にgc{motion}置き換えられ、red dog次のすべての/ [count]発生に再適用されます。

"ay2ejgc2e<C-R>a<Esc>

代替B

しかし、貼り付けよりも編集に適しています。まれに発生する(または後に発生しない)状況の場合、私は次のことを好みます。置換(ReplaceWithRegister)プラグイン、レジスタを介してテキストを上書きできますgr{motion}。たとえば、私は通常+w次のイベントに移動します。 search/を使用することもできますn

y2ejgr2e+w.2+w.+w.

関連情報