web-dev-qa-db-ja.com

VIM Wordを貼り付けバッファーの内容に置き換えますか?

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

108
plong

「貼り付け」とは、名前のない(yank/put/change/delete/substitute)レジスタを意味すると思いますか? (それはchangeコマンドによって上書きされるものだからです。)

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

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

短い答え:"_cw^R"

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

Vimはこれらのレジスタをyankおよびdeleteコマンドからのテキストで埋めます。

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

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

Vimは、削除または変更が連続するたびに、レジスタ1の以前の内容をレジスタ2に、2を2に3などにシフトし、レジスタ9の以前の内容を失います。

122
Cascabel

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

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

編集:

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

上記のコマンドと同等のものを取得するには、「Wordの貼り付けを変更」の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
47
ostler.c

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

27
Ste

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

実際には、あるWord(関数名など)を別のWordに置き換える必要がある場合は、置換として使用するものに移動します。yiwは、内側のWordを名前のないレジスタにヤンクしてから移動します。置換するWordに、およびviwpを置換します。あるWordを別のWordに置き換える非常に簡単な方法。置換するWordを探して(/)検索した場合、nを押すだけで、次に置換する必要のあるものを見つけることができます。明らかに:%s/find/replace/gを使用するのに代わるものはありませんが、いくつかの簡単な置換には、特にレジスタに新しいWordが既にある場合は便利です。

21

名前付きレジスタを使用する場合(つまり、"ayまたは"adなど、ペーストレジスタに入力します)、次のようなことができます

cw<CTRL-R>a<esc>

これにより、Wordはレジスタaの内容に置き換えられます。私の知る限り、デフォルトのレジスタは使用できません。cwを入力すると、そのコマンドでカットされたWordが入力されるからです。

5

システムペーストバッファまたはviレジスタを意味しますか?

システムペーストバッファを使用する場合は問題ありません。dw"+P-"はレジスタを選択し、"+はシステムペーストバッファです。

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

2
Hamish Downer

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

1
YevgenyYork

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

0
elimirks

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

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

ここで、aはレジスタ名です

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

ve"ap

0
lollinus