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:

TasteAktion
fxspringt zum nächsten Vorkommen von x (vorwärts, auf das Zeichen)
Fxspringt zum vorherigen Vorkommen von x (rückwärts)
txspringt vorwärts bis vor das nächste x (Position davor)
Txspringt 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.

text f, t, F, T in Aktion
" 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 Gleichheitszeichen

Der 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:

TasteAktion
;wiederholt die letzte f/t/F/T-Bewegung in gleicher Richtung
,wiederholt in entgegengesetzter Richtung
text Wiederholen
" 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:

BefehlAktion
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.

text dt; vs. df;
" 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:

text Counts mit f/t
" 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:

text Counts mit ; und ,
" Nach einem f. — die nächsten Sprünge:
f.                  " erstes "."
5;                  " fünf weiter — zum sechsten Punkt insgesamt

In 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.

SituationBeste 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-sneaks plus zwei Zeichen springt zum nächsten Vorkommen dieser Zwei-Zeichen-Sequenz im sichtbaren Bereich.
  • vim-easymotion<leader><leader>w zeigt 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

Verwandte Artikel

/ Weiter

Zurück zu Navigation

Zur Übersicht