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

War es hilfreich?

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ür Visual-Modus befindet, nicht Modi Visual + Select.

  • <expr> bedeutet, dass {rhs} der xnoremap {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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top