Wie bedingte Behandlung einer vim remap?

749
Kache

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 "_dPwird 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:

  • in diesem speziellen Fall tun "_dp
  • ansonsten tun "_dP

Ich denke vnoremap pan 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') 
1

2 Antworten auf die Frage

2
Ingo Karkat

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') 
This got me what I needed, thanks. Problem with this exact line is `col("'>"` keeps using the visual selection previous to the one I'm using *right now*, and `col('$')` returns 'last column + 1'. Kache vor 11 Jahren 0
1
romainl

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 "_dstatt ddas richtige Werkzeug, da keines der Elemente, die Sie löschen, in einem Register angezeigt wird.

Beim zweiten Problem führt das Kombinieren von "_dund poder Pzwangsläufig zu Problemen aufgrund der Cursorposition und der Ausrichtung von pund P.

Ingos Antwort scheint ein perfekter Kompromiss zu sein.

Wenn Sie sich jedoch nicht für den Status Ihrer nummerierten Register "0interessieren, können Sie das Register verwenden, das immer den zuletzt gezogenen Text enthält und nicht durch coder beeinflusst wird d.

Test riss: foozerrte mit yiw.

Testzeile:, Lorem [i]psum dolor sit amet.mit dem Cursor auf der ivon 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 
Dies könnte definitiv eine Lösung sein (obwohl ich "0p" irgendwie wortreich finde), aber ich habe genau das gefunden, wonach ich gesucht habe. Kache vor 11 Jahren 0