For conditional remapping, you can use an expression mapping (:help map-expr
). I don't know if this already works for you, but it should get you started:
:vnoremap <expr> p (getregtype() ==# 'v' && col("'>") == col('$') ? '"_dp' : '"_dP')
Dies bezieht sich auf / eine Fortsetzung von Wie kann ich den gerippten Text in vim ersetzen, ohne die gelöschten Zeilen mitzunehmen?
Zusammenfassend vnoremap p "_dP
wird verwendet, um visuell ausgewählten Text einzufügen, ohne das "*
Register mit dem ersetzten Text zu überschreiben . Auf diese Weise bleiben nachfolgende visuell ausgewählte Pasten gleich.
Diese Neuzuordnung funktioniert erwartungsgemäß, es sei denn, eine zeichenweise visuelle Auswahl geht bis zum Zeilenende . Ich versuche, einen Weg zu finden, um dies bedingt zu handhaben, so dass:
"_dp
"_dP
Ich denke vnoremap p
an eine Vimscript-Funktion, die für diesen speziellen Fall prüft, dh "ob die visuelle Auswahl charakteristisch ist und der Cursor am Ende der Zeile steht" und entsprechend ausgeführt werden.
Meta - wenn Vimscript die Antwort ist, sollte ich vielleicht bei StackOverflow posten?
Aktualisieren
Es funktioniert mit:
vnoremap <expr> p (getregtype() ==# 'v' && col(".") == col("$") - 1 ? '"_dp' : '"_dP')
For conditional remapping, you can use an expression mapping (:help map-expr
). I don't know if this already works for you, but it should get you started:
:vnoremap <expr> p (getregtype() ==# 'v' && col("'>") == col('$') ? '"_dp' : '"_dP')
Die Verwendung des Black-Hole-Registers kann eine Lösung für zwei Probleme sein: Sie möchten, dass Ihre nummerierten Register nur explizit gerippten Text enthalten oder dass Sie denselben Text mehrmals einfügen möchten.
Für das erste Problem ist die Verwendung von "_d
statt d
das richtige Werkzeug, da keines der Elemente, die Sie löschen, in einem Register angezeigt wird.
Beim zweiten Problem führt das Kombinieren von "_d
und p
oder P
zwangsläufig zu Problemen aufgrund der Cursorposition und der Ausrichtung von p
und P
.
Ingos Antwort scheint ein perfekter Kompromiss zu sein.
Wenn Sie sich jedoch nicht für den Status Ihrer nummerierten Register "0
interessieren, können Sie das Register verwenden, das immer den zuletzt gezogenen Text enthält und nicht durch c
oder beeinflusst wird d
.
Test riss: foo
zerrte mit yiw
.
Testzeile:, Lorem [i]psum dolor sit amet.
mit dem Cursor auf der i
von ipsum
.
Testauswahl: v$
.
"_dP Loremfoo <-- trailing whitespace and mashed text, bad "_dp Lorem foo <-- good "0p Lorem foo <-- good
Testauswahl: vee
.
"_dP Lorem foo sit amet. <-- good "_dp Lorem foosit amet. <-- bad "0p Lorem foo sit amet. <-- good