貼り付けバッファーにテキストがあります。私はyw
(yank Word)を実行しましたが、バッファに 'foo'があります。
今度はWordの「バー」に移動し、貼り付けバッファーに置き換えます。
テキストを手動で置き換えるには、cw
を実行してから、新しいWordを入力します。
どうすれば「単語の変更」を実行できますが、置換単語を手動で入力する代わりに、貼り付けバッファーの内容を使用できますか?
私が今持っている最良のオプションは、置き換えたいWordの先頭に移動してdw
(Wordを削除)し、別の場所に移動してyw
(yank語)。次に、置換領域に戻り、p
(貼り付け)を実行します。これは、特に同じ画面上にない場合は、不格好です。
オプション1
レジスターを使用してそれを行い、プロセスのキーバインドを作成できます。
置き換えたい単語をヤンクする yw。
ヤンクしたWordは0
レジスタにあり、:registers
を発行すると表示されます。
置き換えたい単語に移動して実行します cw。行う Ctrl+r に続く 0
レジスタを貼り付けます。
そのためのマップは次のようになります(仮定すると Ctrl+j 私たちの主要なコンボとして):
:map <C-j> cw<C-r>0<ESC>
オプション2(よりシンプル)
Wordをヤンクして、置き換えて実行するWordにカーソルを合わせます viwp。これは、内側の単語を視覚的に選択して貼り付けることです。
コメント内の@tloの礼儀: vep。 1文字短い。欠点は、Wordの先頭にカーソルを配置し、(私の場合と同様に)バッファーを変更することです。
コメント(マイケルから):
これはいい。補足:2番目の方法は確かに簡単ですが、現状では、置換のたびにバッファが置換されたフィールド(古いテキスト)に変更されるため、置換は1つしか機能しません。最初の方法は使用が少し難しいですが、バッファ0が「そのまま」残るという利点があります。そのため、この方法を使用して、同じテキストを複数置換することができます。
VIM wayは、意図的にヤンクを使用する方法、削除、およびその他の方法を学ぶことですこれらを知ったら、これを行うための独自のキーシーケンスを簡単に見つけることができます。
レジスタ"0
はヤンクレジスタです。ヤンクしたものはすべてここに置かれますが、削除も変更の削除も"0
を登録することはできません。
ですから、あなたの例では、あなたはただ言葉を引きずっただけです。 Wordをヤンクしたものに置き換えるには、ヤンクレジスターに触れない削除を利用します。対象のWordに移動し、dw
で削除してから、ヤンクレジスターから"0p
以上を貼り付けてください。cw
が次に^R0
(繰り返し可能)です。
ヤンクレジスタの反対側は、小さな削除レジスタ"-
です。小さな削除や変更の削除はここに置かれますが、ヤンクは"-
に触れません。行全体に満たない場合、削除は小さいものとしてカウントされます。
レジスタ"1
-"9
は、大きな削除履歴レジスタです。 "1
には最新の大きな削除または変更の削除が含まれ、"9
には最も古い大きな削除または変更の削除が含まれます。小さくない削除、つまり1行以上の削除のみが"1
-"9
にプッシュされます。
レジスタを変更する操作の場合、コピーも常にデフォルトの名前のないレジスタ""
に配置されます。これは、レジスタに明示的に名前を付けない場合に使用されるレジスタです。
レジスタ"_
はブラックホールレジスタであり、常に空です。削除すると、デフォルトの""
レジスタやブラックホールレジスタ自体も含め、どのレジスタも変更されません。削除したテキストは、元に戻す履歴とは別に、完全に削除されています。ブラックホールレジスターにヤンクしたり、ブラックホールレジスターから貼り付けたりしても、本質的には何も起こりません。
ブラックホールレジスタ"_
を使用すると、最初に1つの小さな削除を行ってから、小さな削除レジスタ"_
を変更せずに、他のいくつかの削除を"-
に行ってから、最初の小さな削除を貼り付けることができます。
他のレジスタは、最後に挿入されたレジスタ".
、ファイル名レジスタ"%
および"#
、コマンドレジスタ":
、検索レジスタ"/
、および式レジスタ"=
です。
コマンド:register
を使用すると、これらすべてのレジスタとその内容のリストを取得できます。このコマンドはレジスターの現在の内容を表示するため、コマンドを試して、何がどこで終わるかを知るのに非常に役立ちます。
yw
を使用してWordをヤンクし、カーソルを置換するWordに移動して"_dw
を使用して削除し、テキストをnullレジスタに送信します(そのため、内容が上書きされません) "
レジスター。デフォルトでは、ヤンク/カットされたテキストが挿入されます)、次にp
で貼り付けます。
次のマッピングを使用すると、少し簡単になります。
nnoremap <leader>d "_d
...通常モードでは、\dw
レジスタに影響を与えずに、"
を使用してWordを削除できます。
私はこれが頻繁に必要になるので、単純化して最大速度を可能にするプラグインを作成しました: ReplaceWithRegister 。
このプラグインは、{motion} /テキストオブジェクトでカバーされるテキスト、行全体、または現在の選択内容をレジスターの内容で置き換える、ツーインワンのgr
コマンドを提供します。古いテキストがブラックホールレジスタに削除されます。つまり、テキストは消えます。多くのコーナーケースを透過的に処理し、標準の.
コマンドを使用してすばやくリピートできます。気に入らない場合は、そのページに代替案へのリンクがあります。
貼り付けを繰り返すには、changeコマンドを使用します。
cw^RESC (^ R = Control + R;レジスタ0の場合は0)
wordをregの内容で置き換えます。 0で繰り返しましょう .
これは cgn (VIM 7.4)検索パターンを置き換えるには:
私は通常これを使用します: yw foo
をヤンクしてからbar
を削除するには dw、そして最後のステップとして、foo
をレジスタ0
から配置します。 "0p。ピリオド(.) 必要に応じて。
また、代わりに yw そして dw、使用できます yiw そして diw (追加に注意してください i -それはinside)を意味します。これにより、Wordの先頭だけでなく、任意の場所からWordをヤンクまたは削除できますinside it。
これはまだ含まれていないため、通常は文字列を:%s/.../.../
に置き換えます。これは、カーソルの下のWordでも行うことができます。
:s/find/
<ctrl-r>
をクリックし、置換する単語をカーソルで選択します。<ctrl-w>
(小さな "Word")または<ctrl-a>
(大きな "Word")をクリックして、カーソルの下のWordをコマンドラインに貼り付けますコマンドラインでのカーソルのもの の使用方法に関するリンクを参照してください。
他のより良い答えに追加します。少しわかりすぎますが、削除する前に貼り付けるだけです。次に、置き換えたい単語に移動し、「pldw」(貼り付け、1文字右に移動し、単語を削除します)。
まず、ヤンクするWordの先頭に移動します。 Wordの途中にいる場合は、b
を実行して、単語の最初に戻ります。次にye
を実行してWord全体をヤンクしますなし末尾のスペース(y
ankからe
nd)。最後に、置換するWordに移動します-w
を数回実行することにより-vep
を実行してv
isual選択モードに入り、e
nd of the Word、およびp
aste内容を最後にヤンクします。
(受け入れられた回答に単にコメントしなかった理由を知りたい場合は、ye
ではなくyw
を使用するわずかな変更により、このスタックに対する私の評判がまだ低すぎるためです。 。)
以下のキーマッピングを使用して、現在のWordをコピーしたWordに置き換えています。" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>
yiw Wordをコピーします。 Wordに移動します。 ,rr Wordを置き換えます。
リーダーキーはマップされています ,。
yw
を使用して世界をヤンクし、変更したい世界に移動します。v
を使用して、状況に応じてve
またはvw
を選択してください。p
を入力して、コピーしたワールドを貼り付けて、選択したブロックを置き換えます私のヒント/提案: vim-exchange plugin 。それはこのような言葉を交換するのに役立ちます:
交換する最初の単語をマーク-> cxiw
し、ドット.
を押します。
Vim-plugを使用している場合は、次のように使用します。
Plug 'tommcdo/vim-exchange'
その後
:PlugInstall
他のプラグインマネージャーの場合はドキュメントに従ってください
私はこのプラグインを選択領域の拡張に使用します: https://github.com/terryma/vim-expand-region
したがって、Wordを変更するための私の組み合わせは次のようになります:vvp
in Wordの任意の場所。
また、貼り付け後に名前のないレジスターの内容を保存するハックもあるので、これを繰り返すことができます。
vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>
(私のクリップボードは自動選択です)