web-dev-qa-db-ja.com

現在の貼り付けバッファーを使用してVimで「単語を変更」するにはどうすればよいですか?

貼り付けバッファーにテキストがあります。私はyw(yank Word)を実行しましたが、バッファに 'foo'があります。

今度はWordの「バー」に移動し、貼り付けバッファーに置き換えます。

テキストを手動で置き換えるには、cwを実行してから、新しいWordを入力します。

どうすれば「単語の変更」を実行できますが、置換単語を手動で入力する代わりに、貼り付けバッファーの内容を使用できますか?

私が今持っている最良のオプションは、置き換えたいWordの先頭に移動してdw(Wordを削除)し、別の場所に移動してyw(yank語)。次に、置換領域に戻り、p(貼り付け)を実行します。これは、特に同じ画面上にない場合は、不格好です。

102
Michael Durrant

オプション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が「そのまま」残るという利点があります。そのため、この方法を使用して、同じテキストを複数置換することができます。

145
jmathew

VIM wayは、意図的にヤンクを使用する方法、削除、およびその他の方法を学ぶことですこれらを知ったら、これを行うための独自のキーシーケンスを簡単に見つけることができます。

レジスタ"0はヤンクレジスタです。ヤンクしたものはすべてここに置かれますが、削除も変更の削除も"0を登録することはできません。

ですから、あなたの例では、あなたはただ言葉を引きずっただけです。 Wordをヤンクしたものに置き換えるには、ヤンクレジスターに触れない削除を利用します。対象のWordに移動し、dwで削除してから、ヤンクレジスターから"0p以上を貼り付けてください。cwが次に^R0(繰り返し可能)です。

ヤンクレジスタの反対側は、小さな削除レジスタ"-です。小さな削除や変更の削除はここに置かれますが、ヤンクは"-に触れません。行全体に満たない場合、削除は小さいものとしてカウントされます。

レジスタ"1-"9は、大きな削除履歴レジスタです。 "1には最新の大きな削除または変更の削除が含まれ、"9には最も古い大きな削除または変更の削除が含まれます。小さくない削除、つまり1行以上の削除のみが"1-"9にプッシュされます。

レジスタを変更する操作の場合、コピーも常にデフォルトの名前のないレジスタ""に配置されます。これは、レジスタに明示的に名前を付けない場合に使用されるレジスタです。

レジスタ"_はブラックホールレジスタであり、常に空です。削除すると、デフォルトの""レジスタやブラックホールレジスタ自体も含め、どのレジスタも変更されません。削除したテキストは、元に戻す履歴とは別に、完全に削除されています。ブラックホールレジスターにヤンクしたり、ブラックホールレジスターから貼り付けたりしても、本質的には何も起こりません。

ブラックホールレジスタ"_を使用すると、最初に1つの小さな削除を行ってから、小さな削除レジスタ"_を変更せずに、他のいくつかの削除を"-に行ってから、最初の小さな削除を貼り付けることができます。

他のレジスタは、最後に挿入されたレジスタ".、ファイル名レジスタ"%および"#、コマンドレジスタ":、検索レジスタ"/、および式レジスタ"=です。

コマンド:registerを使用すると、これらすべてのレジスタとその内容のリストを取得できます。このコマンドはレジスターの現在の内容を表示するため、コマンドを試して、何がどこで終わるかを知るのに非常に役立ちます。

12
00prometheus

ywを使用してWordをヤンクし、カーソルを置換するWordに移動して"_dwを使用して削除し、テキストをnullレジスタに送信します(そのため、内容が上書きされません) "レジスター。デフォルトでは、ヤンク/カットされたテキストが挿入されます)、次にpで貼り付けます。

次のマッピングを使用すると、少し簡単になります。

nnoremap <leader>d "_d

...通常モードでは、\dwレジスタに影響を与えずに、"を使用してWordを削除できます。

12
evilsoup

私はこれが頻繁に必要になるので、単純化して最大速度を可能にするプラグインを作成しました: ReplaceWithRegister

このプラグインは、{motion} /テキストオブジェクトでカバーされるテキスト、行全体、または現在の選択内容をレジスターの内容で置き換える、ツーインワンのgrコマンドを提供します。古いテキストがブラックホールレジスタに削除されます。つまり、テキストは消えます。多くのコーナーケースを透過的に処理し、標準の.コマンドを使用してすばやくリピートできます。気に入らない場合は、そのページに代替案へのリンクがあります。

3
Ingo Karkat

を押してビジュアルモードに移動します v 興味深いテキストをキャプチャし、押してコピーします y。削除したいテキストをキャプチャし、 p 貼り付け用。

Replacing text in Vim

2
Purkhalo Alex

貼り付けを繰り返すには、changeコマンドを使用します。

cw^RESC (^ R = Control + R;レジスタ0の場合は0)

wordをregの内容で置き換えます。 0で繰り返しましょう .

これは cgn (VIM 7.4)検索パターンを置き換えるには:

  • 最初の検索 / または *
  • cgn^RESC
  • . 次の試合で繰り返すか n スキップする
2
laktak

私は通常これを使用します: yw fooをヤンクしてからbarを削除するには dw、そして最後のステップとして、fooをレジスタ0から配置します。 "0p。ピリオド(.) 必要に応じて。

また、代わりに yw そして dw、使用できます yiw そして diw (追加に注意してください i -それはinside)を意味します。これにより、Wordの先頭だけでなく、任意の場所からWordをヤンクまたは削除できますinside it。

1
Nino

これはまだ含まれていないため、通常は文字列を:%s/.../.../に置き換えます。これは、カーソルの下のWordでも行うことができます。

  1. コマンドの最初の部分、つまり検索しているものを入力します::s/find/
  2. 次に、<ctrl-r>をクリックし、置換する単語をカーソルで選択します。
  3. 次に、<ctrl-w>(小さな "Word")または<ctrl-a>(大きな "Word")をクリックして、カーソルの下のWordをコマンドラインに貼り付けます
  4. 次に、コマンドを終了します。

コマンドラインでのカーソルのもの の使用方法に関するリンクを参照してください。

1
erikbwork

他のより良い答えに追加します。少しわかりすぎますが、削除する前に貼り付けるだけです。次に、置き換えたい単語に移動し、「pldw」(貼り付け、1文字右に移動し、単語を削除します)。

1
Ali Almoullim

まず、ヤンクするWordの先頭に移動します。 Wordの途中にいる場合は、bを実行して、単語の最初に戻ります。次にyeを実行してWord全体をヤンクしますなし末尾のスペース(yankからend)。最後に、置換するWordに移動します-wを数回実行することにより-vepを実行してvisual選択モードに入り、end of the Word、およびpaste内容を最後にヤンクします。

(受け入れられた回答に単にコメントしなかった理由を知りたい場合は、yeではなくywを使用するわずかな変更により、このスタックに対する私の評判がまだ低すぎるためです。 。)

0
Anomaly

以下のキーマッピングを使用して、現在のWordをコピーしたWordに置き換えています。
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiw Wordをコピーします。 Wordに移動します。 ,rr Wordを置き換えます。
リーダーキーはマップされています ,

0
Fisher
  1. ywを使用して世界をヤンクし、変更したい世界に移動します。
  2. vを使用して、状況に応じてveまたはvwを選択してください。
  3. pを入力して、コピーしたワールドを貼り付けて、選択したブロックを置き換えます
0
ramwin

私のヒント/提案: vim-exchange plugin 。それはこのような言葉を交換するのに役立ちます:

交換する最初の単語をマーク-> cxiwし、ドット.を押します。

Vim-plugを使用している場合は、次のように使用します。

Plug 'tommcdo/vim-exchange'

その後

:PlugInstall

他のプラグインマネージャーの場合はドキュメントに従ってください

0
SergioAraujo

私はこのプラグインを選択領域の拡張に使用します: https://github.com/terryma/vim-expand-region

したがって、Wordを変更するための私の組み合わせは次のようになります:vvpin Wordの任意の場所。

また、貼り付け後に名前のないレジスターの内容を保存するハックもあるので、これを繰り返すことができます。

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(私のクリップボードは自動選択です)

0
user2656799