Wenn h und l zu langsam sind und w und b zu grob, gibt es die Zeichen-Finden-Motions: f und t. Sie springen zum nächsten Vorkommen eines beliebigen Zeichens innerhalb der aktuellen Zeile — präziser als Wort-Motions, schneller als zeichenweise Bewegung. In Kombination mit Operatoren wie d, c oder y entstehen Edit-Befehle, die in zwei oder drei Tasten Aufgaben erledigen, für die andere Editoren Markierung mit der Maus brauchen. Wer dt; einmal verinnerlicht hat — „lösche bis vor das nächste Semikolon" —, denkt anders über Code-Edits. Dieser Artikel zeigt die vier Varianten (f/F/t/T), das Wiederholen mit ; und ,, die Kombination mit Operatoren und die typischen Praxis-Anwendungen.
Die vier Varianten
Vim hat vier Zeichen-Finden-Motions, alle erwarten als Argument ein einzelnes Zeichen:
| Taste | Aktion |
|---|---|
fx | springt zum nächsten Vorkommen von x (vorwärts, auf das Zeichen) |
Fx | springt zum vorherigen Vorkommen von x (rückwärts) |
tx | springt vorwärts bis vor das nächste x (Position davor) |
Tx | springt rückwärts bis nach das vorherige x |
Die Konvention ist einprägsam:
- f = „find" (springt auf das Zeichen)
- t = „till" (springt bis zum Zeichen, also davor)
- Kleinbuchstabe = vorwärts, Großbuchstabe = rückwärts
Beide Motions bleiben in der aktuellen Zeile — kein Sprung über Zeilenenden hinaus. Das ist Absicht: bei langen Code-Dateien wäre ein Multi-Line-f zu unspezifisch.
" Buffer-Inhalt: let x = foo.bar();
" Cursor steht auf "l" (Spalte 1)
f. " Cursor springt auf den Punkt . in "foo.bar" (Spalte 13)
t. " Cursor springt auf "o" — die Position VOR dem Punkt
F= " zurück zum Gleichheitszeichen
T= " zurück zur Position NACH dem GleichheitszeichenDer Unterschied f/t wird wichtig, sobald Operatoren ins Spiel kommen — siehe Abschnitt 3.
Wiederholen mit ; und ,
Nach einem f/t/F/T-Sprung merkt sich Vim das Such-Zeichen. Mit zwei Tasten wiederholst du den Sprung:
| Taste | Aktion |
|---|---|
| ; | wiederholt die letzte f/t/F/T-Bewegung in gleicher Richtung |
| , | wiederholt in entgegengesetzter Richtung |
" Buffer: foo, bar, baz, qux
" Cursor am Zeilenanfang
f, " auf das erste Komma (nach "foo")
; " auf das nächste Komma (nach "bar")
; " auf das nächste Komma (nach "baz")
, " einen Schritt zurück (zum vorherigen)Mit Counts: 3; springt drei ,-Trefferstellen weiter, 2, zwei zurück. Die Wiederholungs-Tasten sind extrem nützlich, wenn man eine Stelle in einer Zeile mehrfach durchläuft.
f/t mit Operatoren — der Tempo-Hebel
Die volle Kraft entfaltet sich, wenn f/t mit Operatoren kombiniert werden. Eine kleine Auswahl typischer Edits:
| Befehl | Aktion |
|---|---|
dt; | lösche bis vor dem nächsten Semikolon |
df; | lösche bis einschließlich des nächsten Semikolons |
ct, | ändere bis vor das nächste Komma |
dT( | lösche rückwärts bis nach der vorherigen Klammer |
yf. | kopiere bis einschließlich des nächsten Punkts |
3df. | lösche bis zum dritten Punkt einschließlich |
Die Wahl zwischen t und f ist semantisch: t lässt das Ziel-Zeichen stehen, f nimmt es mit.
" Buffer: console.log("hello");
" Cursor am "c" von "console"
dt( " löscht "console.log" — das ( bleibt stehen
" Ergebnis: ("hello");
df( " hätte stattdessen "console.log(" gelöscht
" Ergebnis: "hello");Im Alltag ist t die häufigere Wahl: man will den Grenz-Charakter meist behalten (die Klammer, das Semikolon, das Komma). f kommt zum Einsatz, wenn der Grenz-Charakter explizit Teil des Edits ist — z. B. beim Löschen eines kompletten Funktionsaufrufs mit df).
Counts auf f und t
Wer das zweite oder dritte Vorkommen eines Zeichens treffen will, nutzt einen Count:
" Buffer: foo.bar.baz.qux
3f. " springt zum DRITTEN Punkt (vor "qux")
2t. " springt bis vor den ZWEITEN Punkt (also auf "r")Counts auf den Wiederholungs-Tasten:
" Nach einem f. — die nächsten Sprünge:
f. " erstes "."
5; " fünf weiter — zum sechsten Punkt insgesamtIn Kombination mit Operatoren: d3f; löscht bis einschließlich des dritten Semikolons. Sehr präzise Edits ohne Visual-Mode-Ausflug.
Wann f/t — und wann etwas anderes
f/t ist die richtige Wahl für gut sichtbare, eindeutige Ziel-Zeichen innerhalb einer Zeile. Wenn das Zeichen mehrfach vorkommt, muss man entweder den Count nutzen oder ; zum Weiterspringen.
| Situation | Beste Wahl |
|---|---|
| „Springe zur nächsten Klammer auf dieser Zeile" | f( |
| „Lösche alles bis zum Semikolon, behalte es" | dt; |
| „Lösche eine Funktion samt Aufruf-Klammern" | df) (wenn Cursor vor () |
| „Cursor in einem 100-Zeichen-Quote-String" | f" und wiederholt ; — aber i" schöner |
„Suche das Wort foo im Buffer" | /foo<CR> — f/t ist nur für Zeichen |
| „Springe über mehrere Zeilen" | //? oder Marks — f/t bleibt in Zeile |
Für mehr als ein paar Zeichen voraus ist die Suche (/pattern) oft präziser. Für strukturelle Bereiche (Klammern, Anführungszeichen, Tags) sind Text-Objects (i(, i", it) eleganter. f/t ist die Wahl für ad-hoc Charakter-Sprünge auf einer Zeile, wenn keine semantische Struktur passt.
Plugin-Erweiterungen für Multi-Line-f/t
Wer den Sprung über Zeilen hinweg will — etwa „zum nächsten ( im ganzen Bildschirm" —, hat Plugin-Optionen:
- vim-sneak —
splus zwei Zeichen springt zum nächsten Vorkommen dieser Zwei-Zeichen-Sequenz im sichtbaren Bereich. - vim-easymotion —
<leader><leader>wzeigt Sprung-Marker für alle Wort-Anfänge im sichtbaren Bereich, freie Auswahl per Tastendruck. - vim-clever-f — erweitert eingebautes f/t auf Multi-Line und macht
;zum Nach-Sprung-Wiederholer.
Diese Plugins erweitern die f/t-Idee zu einem Universal-Sprung-Werkzeug. Für die meisten Workflows reichen Vims eingebautes f/t plus /pattern — Plugins sind eine bewusste Power-Wahl, kein Pflichtprogramm. Mehr im Kapitel Erweiterte Features.
Besonderheiten
`t` ist der „bis-vor"-Operator
Mnemonik: t = till, also „bis zum Ziel-Zeichen, aber nicht einschließlich". Der Cursor stoppt eine Position vor dem Ziel. Bei dt; bedeutet das: das Semikolon bleibt erhalten — was im Code-Alltag fast immer gewollt ist.
f/t ist case-sensitive
fa springt zum nächsten a, nicht zu A. Wer beides finden will, muss zweimal suchen oder die Option set ignorecase plus smartcase aktivieren — die wirkt aber nur auf /pattern, nicht auf f/t. Für f/t ist Case-Insensitivität nicht eingebaut.
`;` und `,` als die unauffälligsten Tasten
Auf der Heimreihe direkt neben l — kein Modifier, keine Sequenz. Wer einmal das f<x> plus ; plus ; plus ; als Reflex hat, navigiert in Zeilen drastisch schneller als per l oder Word-Motion.
Mehrbyte-Zeichen funktionieren
f ü springt zum nächsten Umlaut, f € zum nächsten Euro-Zeichen. UTF-8-Zeichen werden korrekt als „ein Zeichen" behandelt — ungeachtet ihrer Byte-Anzahl im Speicher.
Mit f/t in Visual-Mode markieren
Im Visual-Mode wirken f/t wie Motions: vf; markiert ab Cursor bis einschließlich des nächsten ;. vt( markiert bis vor die nächste öffnende Klammer. Das macht Visual-Mode für präzise Auswahl-Operationen zur idealen Kombination mit f/t.
DE-Tastatur: f und t sind auf der Heimreihe
Anders als viele Vim-Befehle, die auf einem US-Layout konzipiert sind, liegen f und t auf der deutschen Tastatur an exakt der gleichen Position. Keine Layout-Stolperfalle, keine AltGr-Verrenkung.
Weiterführende Ressourcen
Externe Quellen
- Vim Help: f — die f-Motion offiziell.
- Vim Help: t — die t-Motion.
- Vim Help: ; — Wiederholung.
- Vim Help: , — Umkehrung der Wiederholung.
- justinmk/vim-sneak — Multi-Line-Zweizeichen-Sprünge.
- easymotion/vim-easymotion — Sprung-Marker für jeden sichtbaren Zielpunkt.