質問
選択をデフォルトのレジスタに配置せずに、視覚的に選択された領域に貼り付ける方法を知っている人はいますか?
常に明示的なレジスタから貼り付けることで問題を解決できることを知っています。しかし、単に p ではなく <!> quot; x p と入力するのは苦痛です。 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にnon-nore vmapがあり、レジスタが上書きされることを期待するプラグインを使用しない限り、これは問題ありません。
このコードはスクリプトとして利用できますそこ。 Ingo Karkatは、プラグインも同じ問題を解決することを定義しました。
他のヒント
d
、D
、c
、またはC
で削除されたすべてのテキストをデフォルトのレジスタにコピーするデフォルトのvimの動作が好きではありません。
"_d
を"_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 。いくつかの欠点がありますが、私には問題ありません。
Luc Hermitteのソリューションは魅力のように機能します。約1週間ほど使用していました。次に、 Steve 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
はレジスタです。
このstackoverflowの質問への回答に助けられました: Vim-オプションのレジスタプレフィックスを使用したマッピング Benoit の回答このページ
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>
試用-
:set guioptions-=a
:set guioptions-=A