レジスタを上書きせずに貼り付ける方法


112

デフォルトのレジスタに選択を配置せずに、視覚的に選択された領域に貼り付ける方法を知っている人はいますか?

私は常に明示的なレジスタから貼り付けることで問題を解決できることを知っています。しかし、タイプ"xpするのではなくタイプするのは首の痛みですp

回答:


33

"{register}pあなたが説明するように動作しません。選択内容をレジスターの内容に置き換えます。代わりに次のようなことをする必要があります:

" I haven't found how to hide this function (yet)
function! RestoreRegister()
  let @" = s:restore_reg
  return ''
endfunction

function! s:Repl()
    let s:restore_reg = @"
    return "p@=RestoreRegister()\<cr>"
endfunction

" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()

pへのnon-nore vmapがあり、レジスターが上書きされることを期待するプラグインを使用しない限り、どちらでも問題ありません。

このコードはそこでスクリプトとして利用できます。Ingo Karkatも同じ問題を解決するプラグインを定義しました。


実は、使ったレジスタをちゃんとフェッチする方法はありましたが、覚えていませんでした。したがって、関数の複雑さ。
Luc Hermitte、

1
これはやり過ぎだと思いますregtype。(行ごとに?)を覚えていないので、pをに再マップするpgvyだけで十分です。
Benoit

2
やり過ぎかもしれませんが、副作用はありません。の"xp場合、これは@"コンテンツと@xは違って上書きされませんpgvy
Luc Hermitte

1
それではどう:xnoremap p pgv@=v:register.'y'<cr>ですか?
ブノワ

1
私にはうまくいきません。また、スクリプトをダウンロードしてみました。これが私が行うコマンドのリストです。まずvを押し、次にeを押して単語の最後まで選択し、次にyを押してヤンクします。その後、置き換えたい別の単語に移動します。v、e、pの順に押して置き換えます。それからもう一度やりますが、今度は次の単語が以前に置き換えた単語に置き換えられます。
Eddy

41

私は削除されたすべてのテキストをコピーのデフォルトのvimの振る舞い好きではないdDc、またはCへのデフォルトのレジスタを。

私は、マッピングによってその周り得ているd"_dc"_c、そしてそうで。

私の.vimrcから:

"These are to cancel the default behavior of d, D, c, C
"  to put the text they delete in the default register.
"  Note that this means e.g. "ad won't copy the text into
"  register a anymore.  You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C

これらのマッピングは便利ですが(私自身も同様です)、OPの質問には答えません。pは、選択したコンテンツに貼り付けたものを上書きします。
マグナス

32

以下を使用します。

xnoremap p pgvy

これにより、ビジュアルモードで貼り付けられたテキストがすべて再選択され、再度ヤンクされます。

編集:これを使用するには、次のようにし"xpます:

xnoremap p pgv"@=v:register.'y'<cr>

v:register 通常モードコマンドで使用される最後のレジスタ名に展開します。


"xp、このアプローチは上書きされ@"@x
Luc Hermitte、2011

3
の提案はxnoremap p pgv"@=v:register.'y'<cr>うまくいきませんでした。ただし、これは次のことを行いますxnoremap <expr> p 'pgv"'.v:register.'y'
。– mrak

これは面白いですね。何についての行を追加できますgか?今まで見たことがありません。
LondonRob

4
@LondonRob:g単独では何もしません。のような拡張されたマルチキーコマンドを提供しますz。たとえば、goバッファ内のn番目のバイトに行き、gjそしてgk(異なる次と前の表示行に移動jkラインがラップされている場合)、gaカーソル下の文字情報を表示するgJスペースせずに行を結合し、ここでgv最後の視覚的な選択を復元します。使用できます:help gv
Benoit、

6
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' 、 `` `>` `を追加してカーソル位置を復元しました
rox

19

あなたの .vimrc

xnoremap p "_dP

同様のスレッドでの応答からこれを見つけましたが、元のソースはhttp://vim.wikia.com/wiki/Replace_a_word_with_yanked_textでした。それはいくつかの欠点を述べていますが、それは私にとってはうまくいきます。


2
これは最も簡単な解決策のようです。
rudolph9 2016

1
私のために働いた。そして、この答えは明らかです。.vimrc.local大丈夫です。
BaiJiFeiLong

3
選択範囲が行末まで及ぶ場合は機能しません。
John Freeman、

6

Luc Hermitteのソリューションは魅力のように機能します。1週間くらい使っていました。次に、Stank Loshの.vimrcから、YankRingがプラグイン/バンドルラインナップの一部である場合に適切に機能するソリューションを発見しました。

function! YRRunAfterMaps()                                                                                                      
    " From Steve Losh, Preserve the yank post selection/put.    
    vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr> 
endfunction  

6

あなたのこれを試してください~/.vimrc

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapこれはVisualモードのみであり、モードではないことを意味しVisual + Selectます。

  • <expr>{rhs}xnoremap {lhs} {rhs}設定が式として評価されることを意味します。

  • この場合、式は連結に'pgv"'.v:register.'y'使用さ.れます。

  • v:register マッピングの実行中に使用されているレジスタに対して評価されます。

結果として "xpに評価されますがpgv"xy、どこxのレジスタです。

私はこのスタックオーバーフローの質問に対する回答に助けられました:Vim- このページBenoitの回答 と組み合わせた、オプションのレジスタプレフィックス使用したマッピング


4

自分がclipboard = unnamed setを持っているという事実をサポートするように変更を加えた後、Lucの機能はうまく機能しました。

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

1
参考clipboard=unnamedplusまで@+に、これはの代わりに使用する必要があり@*ます。
Sebastian Blask 2017年

2

Luc Hermitteがトリックを行いました!本当に良い。これがトグル関数に入れられた彼の解決策です。したがって、通常の動作と置換なしレジスタの配置を切り替えることができます。

コマンド、uは動作を切り替えます

let s:putSwap = 1 
function TogglePutSwap()
    if s:putSwap
        vnoremap <silent> <expr> p <sid>Repl()
        let s:putSwap = 0 
        echo 'noreplace put'
    else
        vnoremap <silent> <expr> p p 
        let s:putSwap = 1 
        echo 'replace put'
    endif
    return
endfunction
noremap ,p :call TogglePutSwap()<cr>

s:putSwapの値に応じて、「p @ = RestoreRegister()\ <cr>」の代わりに「p」を返すようにs:Replを変更することもできます。
リュックHermitte

1
好むsilent! vunmapの代わりにvnoremap <silent> <expr> p p
リュックHermitte

0

ダクトテーププログラミングですが、私にとってはうまくいきます:

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<

-4

試してください-

:set guioptions-=a
:set guioptions-=A

3
これらは、Vimの内部コピーレジスターではなく、ウィンドウシステムのクリップボード(X11やWin32など)に選択したテキストを追加するかどうかを制御します。
ロブ・ケネディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.