デフォルトのレジスタに選択を配置せずに、視覚的に選択された領域に貼り付ける方法を知っている人はいますか?
私は常に明示的なレジスタから貼り付けることで問題を解決できることを知っています。しかし、入力するのは首の痛みです "xp ただではなく p
"{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 も定義しました。
d
、D
、c
、または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
以下を使用してください。
xnoremap p pgvy
これにより、ビジュアルモードで貼り付けられたテキストが再選択され、再度ヤンクされます。
編集:これが"xp
できるよ:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
は、通常モードのコマンドで使用される最後のレジスタ名に展開されます。
あなたの.vimrc
xnoremap p "_dP
私はこれを同様のスレッドでの応答から見つけましたが、元のソースは http://vim.wikia.com/wiki/Replace_a_Word_with_yanked_text でした。それにはいくつかの欠点がありますが、私にとってはうまくいきます。
~/.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 の回答 このページ
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
私がclipboard = unnamed setを持っているという事実をサポートするために変更を行った後、Lucの関数は私にとってうまく機能しました。
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
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>