Was ich lange nicht hinbekommen habe: Man hat in vim einen Text in Anführungszeichen und möchte den Inhalt löschen. Aber wie trifft man exakt alle Wörter des Strings beziehungsweise der wörtlichen Rede, ohne erst nachzuzählen?
Der Trick ist eigentlich ganz einfach. Man nehme einen Text wie diesen:
print("|Was mir schon immer Probleme bereitet hat, ist das \", ein %s Anführungszeichen" % "einfaches")Ok, wollte man hier den String ersetzen, wäre Folgendes möglich. Der Cursor ist dabei durch | dargestellt:
c13wlöscht bis einschließlich dem%, aber nicht dassc14wlöscht dann bis zumseinschließlichc15wlöscht den gewünschten Bereich
Blöd ist dabei, dass man sich schnell am %s vertut. Aber vim wäre nicht vim, wenn es nicht etwas dafür bereithalten würde. Der gesuchte Befehl heißt:
c2t"Kurze Erklärung
Die Bestandteile des Befehls lassen sich gut einzeln lesen:
| Teil | Bedeutung |
|---|---|
| Startet einen Ersetzen-Befehl. |
| Steht sinngemäß für »until«, also bis direkt vor das angegebene Zeichen. |
| Springt bis zum zweiten Auftreten des folgenden Zeichens. |
| Das gesuchte Zeichen sind hier die Anführungszeichen. |
In Umgangssprache wäre das dann: »Ersetze den Text bis zum zweiten Auftreten des Zeichens "«.
Ähnliche Operationen
Register nutzen
Möchte man den ausgeschnittenen Text wieder einfügen, drückt man einfach p für Paste. Soll dieser zuvor in ein Register gespeichert werden, nutzt man etwa den Befehl "xc2t", um den entfernten Text in Register x zu speichern. Mit "xp fügt man ihn anschließend wieder ein.
Umgebende Zeichen
Möchte man die umgebenden Zeichen, hier also die Anführungszeichen, gleich mit ersetzen, empfehle ich das Plugin »surround.vim«.
Weblinks
Jonathan Gardner, ViM Motions: http://tech.jonathangardner.net/wiki/ViM#Motions
ViM Wiki, Beschleunigte Bewegungen: http://vim.wikia.com/wiki/Accelerated_motion
Vim-Plugin »surround.vim«: http://www.vim.org/scripts/script.php?script_id=1697