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


86

貼り付けバッファーにテキストがあります。たとえば、yw(yank word)を実行しましたが、バッファーに「foo」があります。

ここで「バー」という単語に移動し、それを貼り付けバッファーに置き換えたいと思います。

テキストを手動で置き換えるにはcw、新しい単語を入力します。

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

私が今持っている最良のオプションは、置換したい単語の先頭に移動してdw(単語を削除)、他の場所に移動してyw(ヤンク語)、置換領域に戻って実行することですp(貼り付け)これは、特に同じ画面上にない場合は少し不器用です。

回答:


120

オプション1

レジスタを使用してそれを実行し、プロセスのキーバインドを作成できます。

置き換えたい単語をヤンクしますyw

ヤンクされた単語は0レジスタにあり、それを発行することで見ることができます:registers

置換して実行する単語に移動しますcw。くださいCtrl+ rに続いて0ペーストする0レジスタを。

そのためのマップは次のようになります(キーコンボとしてCtrl+ jを想定):

:map <C-j> cw<C-r>0<ESC>

オプション2(シンプル)

単語をヤンクした状態で、置換したい単語にカーソルを合わせて実行しますviwp。視覚的に選択する内部単語と貼り付けです。

コメントの@tloの礼儀:あなたも行うことができますvep。1文字短くなります。マイナス面は、単語の先頭にカーソルを配置する必要があり、(私の場合と同様に)バッファを変更します。

コメント(マイケル):

これはいい。特記事項:2番目の方法は確かに簡単ですが、各置換の後にバッファーが置換されたフィールド(古いテキスト)に変更されるため、そのままでは1つの置換に対してのみ機能します。最初の方法は使いにくいですが、バッファ0が「そのまま」であるという利点があるため、その方法を使用して同じテキストを複数回置換できます。


14
オプション3(さらに簡単):単語をヤンクした状態で、置換して実行する単語の最初の文字にカーソルを合わせますvep
14

変更する単語が1つしかない場合、オプション3が気に入っています。変更する同じ単語が複数ある場合、オプション1でを使用できます。オペレータはそれを繰り返す...
typelogic

3
ve"0p変更を繰り返すことができるようになります
JKillian

何かにマッピングする場合は、おそらく使用した方が良いでしょう。map <C-j> ciw<C-r>0<ESC>そうすれば、あなたが押す単語のどこからでも問題になりません^j
ポールパーカー

CTRL-Rがなぜ魔法をかけるのかを知りたい人は::help insertCTRL-Rを検索してください/CTRL-R。方法についてはve"0p作品、見て:help registers
ポール・パーカー

12

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

次のマッピングを使用して、物事を少し簡単にすることができます。

nnoremap <leader>d "_d

...したがって、通常モードでは\dw"レジスタに影響を与えることなく、単語を削除するために使用できます。


3

これをVIMの方法で行うには、ヤンク、削除、およびその他のレジスタを意図的に使用します。

Register "0はヤンクレジスタです。あなたがヤンクしたものはすべてここに置かれますが、削除は決してregisterに触れません"0

したがって、あなたの例では、単語をヤンクしただけです。単語をヤンクしたものに置き換えるには、ヤンクレジスタに触れない削除を利用します。だから、とそれを削除し、目的の単語に移動しdw、その後、あなたのヤンク登録してから貼り付け"0p、まだ良く、またはcwそれから^R0(繰り返し可能です)。

yank登録簿の反対側には、小さな削除登録簿があり"-ます。小さな削除または変更の削除はここに配置されますが、ヤンクは決して触れません"-。削除は、1行に満たない場合は小さいとカウントされます。

レジスタ"1- "9削除履歴レジスタです。"1最新の大型削除や変更の除去を含む、そして"9最古の大型削除や変更の除去を含みます。小さくない削除、つまり1行以上の削除のみが"1- にプッシュされ"9ます。

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

レジスタ"_はブラックホールレジスタであり、常に空です。削除すると、デフォルトの""レジスタやブラックホールレジスタ自体でさえ、どのレジスタでも何も変更されません。元に戻す履歴を除いて、削除されたテキストは完全に削除されます。ブラックホールレジスタへのヤンクまたはペーストは、基本的には何も行いません。

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

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

これらのすべてのレジスターとその内容のリストをコマンドで取得できます:register。そのコマンドは、何がどこで終わるかを実験して知るのに非常に便利です。


2

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

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


2

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

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

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

これはcgn、検索パターンを置き換える(VIM 7.4)に最適です。

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

1

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

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

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


1

私は通常これを使用します:ywヤンクfooしてからで削除bardw、最後のステップとして、を使用してヤンクfooされ0たテキストを保持するレジスタから配置します"0p.必要に応じて、ピリオド()でパッティングを繰り返します。

また、代わりにywdw、あなたが使用することができますyiwし、diw(余分に気づくi-それは意味の内側)。これにより、単語の先頭だけでなく、その中の任意の場所から単語をヤンクまたは削除できます。


0

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

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

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

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

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


0

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

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


,rwより意味があり、QWERTYではおそらく、ベルトを締めるのがより簡単で高速なsmidgenです。DVORAKで、私はを選択しましたが,rc、まったく意味をなさないものの、それらすべてよりも簡単で高速です。DVORAKでは,rw、ホラーショーです;)
ポールパーカー

0

まず、ヤンクする単語の先頭に移動します。あなたが言葉の真ん中にいるなら、ただbそれの最初に戻って行ってください。次に、末尾のスペースなしでye単語全体をヤンクします(ankからnd)。最後に、置き換えたい単語に移動します-おそらく数回行うことで-を実行して、通常の選択モードに入り、単語の最後まで選択し、最後にヤンクした内容をテイストします。yewvepvep

(誰もが、私は単純に受け入れ答えにはコメントしなかった理由を知りたい場合は、使用しての小さな変更のためyeというよりもyw、このスタック上の私の評判は依然として低すぎるので、それはです。)


0
  1. 使用ywを変更したいの世界に行って、世界をヤンクします。
  2. v世界を選択するために、veまたはvwあなたの状況に応じて使用します。
  3. 入力pあなたが選択したブロックを置き換えるためにコピーされた世界をペースターへ

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.