VIM単語を貼り付けバッファの内容で置き換えますか?


110

ファイル内で一連の単語の置換を行う必要があり、それをのようなEXコマンドではなく、viコマンドで実行したい:%s///g。これが現在のカーソル位置の単語を置き換える一般的な方法であることは知っていますcw<text><esc>が、名前のないレジスタの内容を置換テキストとして、レジスタを上書きせずにこれを行う方法はありますか?


8
解決策:私の緊急の必要性のために、私は12yl12文字をヤンクし"_cw^r0て単語を置き換えていました。その後、.コマンドを使用して、ファイル全体で置換を繰り返すことができました。
plong

回答:


127

「貼り付け」とは、名前のない(ヤンク/プット/変更/削除/置換)レジスタを意味していると思いますよね?(それはchangeコマンドによって上書きされるものだからです。)

レジスタは、一般的に入力することで指定されている"ように、その後、レジスタの名前(単一の文字)を"ay、その後"apレジスタにヤンクしa、その後、レジスタの内容を置きますa。変更コマンドについても同様です。あなたが変更コマンドで削除したテキストがどこにも行きたくない場合は、この場合、あなたはブラックホールのレジスタを使用することができます"_"_cw。次に、挿入モードになったら、Ctrlキーを押しながらRキーを押し、続けてレジスタ(おそらく")にそのレジスタの内容を入力させます。

  • "* -選択レジスター(中央ボタンの貼り付け)
  • "+ -クリップボードレジスタ(おそらく、端末を介してctrl-shift-vでアクセス可能)
  • "" -vimのデフォルト(名前のない)yank / put / change / delete / substituteレジスター。

短い答え: "_cw^R"

編集:他の人が示唆しているように、もちろん、テキストをデフォルトのレジスターに入れたヤンク(または何でも)に別のレジスターを使用できます。ただし、常に最初にそのことを考えるとは限らないため、1つの変更コマンドを吹き飛ばさずに実行するのがよいでしょう。それは完全に吹き飛ばされていませんが。"0を通じて番号付きレジスタがあります"9

Vimはこれらのレジスタにyankコマンドとdeleteコマンドからのテキストを入力します。

番号付きレジスタ0には、コマンドが["x]で別のレジスタを指定していない限り、最新のyankコマンドからのテキストが含まれています。

番号付きレジスター1には、コマンドが別のレジスターを指定した場合、またはテキストが1行未満の場合(小さな削除レジスターが使用されます)を除き、最新の削除または変更コマンドによって削除されたテキストが含まれます。:例外がこれらの移動コマンドとdelete演算子のために作られている%()`/?nN{}。レジスタ「1」は常に使用されます(これはVi互換です)。削除が行内にある場合は、「-レジスタ」も使用されます。

連続して削除または変更されるたびに、Vimはレジスター1の以前の内容をレジスター2に、2を3に、というようにシフトし、レジスター9の以前の内容を失います。


1
よし、レジスターのドキュメントを十分に私の回答にコピーしたと思いますか?それはすべて下にあり:help registersます。
Cascabel

48

この投稿の情報を使用して、この便利なマッピングを作成しました。「変更」を意味する「cp」を選択しました

nmap <silent> cp "_cw<C-R>"<Esc>

編集:

また、これをさらに一歩進め、あらゆる動きをサポートしました。

上記のコマンドと同等のものを取得するにはcpw、「貼り付け単語を変更する」

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<無音>は私にとってそれを機能させません...なぜそれがそうなるのでしょうか?私はマッピングと関数のn00bです。
ホリスター、

これに関する唯一の問題は、貼り付けるレジスタを選択できないことです...しかし、その場合、CWを押してCTRL + Rを使用できると思います
Steve Vermeulen

2
:私のためのレジスタ命名が、次の作品を追加するためのより良い方法があるかもしれません nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
スティーブ・バーミューレン

@eventualEntropyこれは行を置き換えるのに適していますが、行ではなく単語でこれを機能させるにはどうすればよいですか、私はまだvimを学習しています。助けてくれてありがとう。
Xavitoj Cheema

@XavitojCheema私はそのコメントをしたことさえ覚えていません、ハハ。結局のところしかし、私はこの機能を提供するプラグインを書いているので、実際にしました(github.com/svermeulen/vim-easyclipは
スティーブ・バーミューレン

27

これにはvimのビジュアルモードを使用できます。たとえば、単語をコピーし、コピーした単語でye別の単語を上書きします。vep


9
これは機能しますが、ビジュアルペーストにより、新しく削除されたテキストのヤンクバッファーが上書きされることにも注意してください。
ostler.c

24

名前のないレジスタの内容で置き換えたい単語の上にカーソルがある場合は、を使用できますviwpvビジュアルモードに切り替えiw、内側の単語を選択しp、レジスタの内容をその場所に配置します。

実際には、ある単語(関数名など)を別の単語に置き換える必要がある場合は、その単語に移動して置換として使用しyiw、内部の単語を名前のないレジスターにヤンクしてから、単語に移動します。 m交換し、viwp交換します。ある単語を別の単語に置き換えるかなり簡単な方法。/置換する単語を検索()してその単語に到達した場合は、次に押すだけでn、置換する必要のある次の出現に到達できます。明らかにを使用する代わりはありません:%s/find/replace/gが、特にレジスタに新しい単語がある場合は、いくつかの簡単な置換を行うと便利です。


4
これが受け入れられた解決策ではないことに驚いています:上記のすべては、一部のエッジケースではより柔軟ですが、元の状況である「現在の名前のないレジスターをどこかで選択のためにスワップする」よりもはるかに冗長です質問者はここに来ました。
ELLIOTTCABLE 2015

1
これは非常に便利で直感的です。
lacostenycoder

6

名前付きレジスターを使用する場合(つまり、"ayまたはを使用して"ad、貼り付けレジスターを埋める)、次のようなことができます

cw<CTRL-R>a<esc>

これは、単語をレジスタの内容に置き換えますa。私が知る限り、デフォルトのレジスターを使用することはできませんcw。そのコマンドによって切り取られた単語でいっぱいになるからです。


デフォルトのレジスタを使用できます!私の答えをチェックしてください。
Cascabel 2010年

2

システム貼り付けバッファまたはviレジスタを意味しますか?

あなたはペーストバッファシステムを使用したい場合、あなたは大丈夫ですと行うことができますdw"+P- "レジスタを選択し、"+システムのペーストバッファです。

それ以外の場合は、たとえばデフォルト以外のレジスタ"ayにコピーして、レジスタにコピーしてaから何かを置き換えるようにしますdw"aP


ありがとう、ハミッシュ。私はそれを試しましたが、dw「単語」と見なすものの後の空白を削除しcwますが、単語を変更するだけです。そのため、dw私にはうまくいきません。
10

その場合de、あなたのために働くはずです-それはこの単語の最後まで削除しますdwが、次の単語の最初まで削除します。
Hamish Downer

1

を使用ywして単語をヤンクした後、ヤンクされた単語で単語を変更して、単語vipwをヤンクして以前にヤンクされた単語を貼り付けることができます。


0

そのためにレジスターを使用できます。

レジスターの最初の置換テキスト <mark some text>"ay

aレジスタ名はどこですか

次に、そのレジスタを代わりに使用できます

ve"ap


残念ながら、最後の貼り付け操作を単に繰り返すことはできませんでした.。これは、もう1つのやりたいことです。ありがとう。とても有難い。
2010年

0

または、Shift+ v-を実行することもできますp(行全体を選択して、その場所に貼り付けます)


1
またはpdw ... vimが好きではありませんか?:P
elimirks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.