回答:
"{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があり、レジスターが上書きされることを期待するプラグインを使用しない限り、どちらでも問題ありません。
regtype
。(行ごとに?)を覚えていないので、pをに再マップするpgvy
だけで十分です。
"xp
場合、これは@"
コンテンツと@x
は違って上書きされませんpgvy
:xnoremap p pgv@=v:register.'y'<cr>
ですか?
私は削除されたすべてのテキストをコピーのデフォルトのvimの振る舞い好きではないd
、D
、c
、またはC
へのデフォルトのレジスタを。
私は、マッピングによってその周り得ている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
通常モードコマンドで使用される最後のレジスタ名に展開します。
"xp
、このアプローチは上書きされ@"
て@x
。
xnoremap p pgv"@=v:register.'y'<cr>
うまくいきませんでした。ただし、これは次のことを行いますxnoremap <expr> p 'pgv"'.v:register.'y'
g
か?今まで見たことがありません。
g
単独では何もしません。のような拡張されたマルチキーコマンドを提供しますz
。たとえば、go
バッファ内のn番目のバイトに行き、gj
そしてgk
(異なる次と前の表示行に移動jk
ラインがラップされている場合)、ga
カーソル下の文字情報を表示するgJ
スペースせずに行を結合し、ここでgv
最後の視覚的な選択を復元します。使用できます:help gv
。
:xnoremap <expr> p 'pgv"'.v:register.'y`>'
、 `` `>` `を追加してカーソル位置を復元しました
あなたの .vimrc
xnoremap p "_dP
同様のスレッドでの応答からこれを見つけましたが、元のソースはhttp://vim.wikia.com/wiki/Replace_a_word_with_yanked_textでした。それはいくつかの欠点を述べていますが、それは私にとってはうまくいきます。
.vimrc.local
大丈夫です。
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
あなたのこれを試してください~/.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の回答 と組み合わせた、オプションのレジスタプレフィックスを使用したマッピング
自分がclipboard = unnamed setを持っているという事実をサポートするように変更を加えた後、Lucの機能はうまく機能しました。
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
clipboard=unnamedplus
まで@+
に、これはの代わりに使用する必要があり@*
ます。
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>
silent! vunmap
の代わりにvnoremap <silent> <expr> p p
ダクトテーププログラミングですが、私にとってはうまくいきます:
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<