Wie bekleben ohne Register überschreiben
Frage
Kennt jemand eine Möglichkeit, einen visuell ausgewählten Bereich bekleben, ohne die Auswahl im Standardregister gesetzt zu haben?
Ich weiß, dass ich das Problem, indem sie immer das Einfügen von einem expliziten Register lösen kann. Aber es ist ein Schmerz im Nacken zu geben " x p statt nur p
Lösung
"{register}p
wird nicht funktionieren, wie Sie beschreiben. Es wird die Auswahl mit dem Inhalt des Registers ersetzen. Sie werden stattdessen wie etwas zu tun haben:
" 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()
Welche sollte in Ordnung sein, solange Sie nicht über ein Plugin verwenden, die ein nicht-nore vmap zu p hat, und dass erwartet ein Register überschrieben werden.
Dieser Code ist als ein Skript zur Verfügung: dort . Ingo Karkat definiert auch ein Plugin das gleiche Problem zu lösen.
Andere Tipps
Ich mag die Standard vim Verhalten nicht den gesamten Text mit d
, D
, c
oder C
in das Standardregister gelöscht kopieren.
Ich habe um sie durch Mapping d
bekommen "_d
, c
zu "_c
, und so weiter.
Aus meiner .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
Verwenden Sie die folgenden Schritte aus:
xnoremap p pgvy
Dies wird erneut auswählen und erneut reißt jeden Text, der im visuellen Modus eingefügt wird.
Edit: in dieser Reihenfolge mit "xp
arbeiten können Sie tun:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
erweitert zum letzten Registernamen in einem normalen Modus Befehl verwendet wird.
In Ihrem .vimrc
xnoremap p "_dP
Ich fand dies aus einer Antwort auf einem ähnlichen Thread, aber die ursprüngliche Quelle ist http: // vim. wikia.com/wiki/Replace_a_word_with_yanked_text . Er erwähnt einige Nachteile, aber es funktioniert gut für mich.
Luc Hermitte Lösung funktioniert wie ein Charme. Ich benutze es für etwa eine Woche oder so. Dann entdeckte ich eine Lösung von Steve Losh der .vimrc , die gut funktioniert wenn YankRing Teil Ihres Plugins / bundle Lineup ist:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
Versuchen Sie dies in Ihrem ~/.vimrc
:
xnoremap <expr> p 'pgv"'.v:register.'y'
-
xnoremap
bedeutet, dass dies nur fürVisual
-Modus befindet, nicht ModiVisual + Select
. -
<expr>
bedeutet, dass{rhs}
derxnoremap {lhs} {rhs}
Einstellung als Ausdruck ausgewertet wird. -
In diesem Fall unser Ausdruck von
'pgv"'.v:register.'y'
verwendet.
für Verkettung. -
v:register
in das Register ausgewertet wird bei der Erfüllung der Abbildung verwendet wird.
Das Ergebnis "xp
würde beurteilen pgv"xy
, wo x
ist das Register.
Ich wurde von einer Antwort auf diese Frage Stackoverflow geholfen: Vim - Mapping mit einem optionalen Register prefix in Verbindung mit Benoit 's Antwort auf dieser Seite
Lucs Funktion gut für mich gearbeitet, nachdem ich eine Änderung vorgenommen hat, die Tatsache zu unterstützen, dass ich Zwischenablage = unnamed gesetzt haben:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
Luc Hermitte das war der Trick! Wirklich gut. Hier ist seine Lösung in einer Toggle-Funktion setzen, so dass Sie können zwischen normalen Verhalten und kein Ersetzen-Register setzen.
der Befehl, u schaltet das Verhalten
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>
try -
:set guioptions-=a
:set guioptions-=A