web-dev-qa-db-ja.com

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

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

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

109
Starr Horne

"{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への非nore vmapがあり、レジスタが上書きされることを期待するプラグインを使用しない限り、これは問題ないはずです。

このコードはスクリプトとして利用可能です there 。 Ingo Karkatは、同じ問題を解決する plugin も定義しました。

31
Luc Hermitte

dDc、またはCで削除されたすべてのテキストをデフォルトのレジスタにコピーするvimのデフォルトの動作が気に入らない。

d"_dに、c"_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
40
Jeff Lake

以下を使用してください。

xnoremap p pgvy

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

編集:これが"xp できるよ:

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

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

31
Benoit

あなたの.vimrc

xnoremap p "_dP

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

17
Jason Denney

~/.vimrcでこれを試してください:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapは、これがVisual + Selectモードではなく、Visualモード専用であることを意味します。

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

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

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

"xpの結果はpgv"xyに評価されます。ここで、xはレジスタです。

私はこのstackoverflowの質問への回答に助けられました: Vim-オプションのレジスタプレフィックスを使用したマッピングBenoit の回答 このページ

6
mrak

Luc Hermitteのソリューションは魅力のように機能します。約1週間ほど使用していました。次に、 Steve Losh's .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
Taine

私がclipboard = unnamed setを持っているという事実をサポートするために変更を行った後、Lucの関数は私にとってうまく機能しました。

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

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>
2
Joernsn