User Tools

Site Tools


viki:05_bewegen

Vim ist keine Insel

5. Bewegen im Puffer

Vim bietet eine Vielzahl von Möglichkeiten, sich zu einem bestimmten Punkt im aktuellen Puffer zu bewegen. Manche davon machen intuitiv Sinn, aber relativ schnell fragt man sich “brauche ich wirklich noch einen Befehl zur Bewegung?”.

Ja, den braucht man!

Wir werden später sehen, das Befehle zur Bearbeitung von Text über einen gewissen Bereich wirken können. Man gibt den Bearbeitungsbefehl ein, und anschließend einen Bewegungsbefehl. Die Bearbeitung erfolgt über den Bereich der Bewegung.

Und noch später werden wir sehen, wie man mit Vim Makros anlegen kann, kleine Editierprogramme, die einem wiederkehrende Aufgaben erleichtern können. Auch bei diesen sind präzise Bewegungsbefehle ausgesprochen nützlich.

Dieses Kapitel wird man nicht in einem Durchgang verinnerlichen können. Ich würde vorschlagen, jede der beschriebenen Bewegungen zumindest einmal in einer Beispieldatei auszuprobieren, und dann zum nächsten Kapitel überzugehen. Aber man sollte regelmäßig hierhin zurückkehren, um sein “Arsenal” an Bewegungsbefehlen im Laufe der Zeit immer mehr zu erweitern.

Grundlagen

Als geübter Tastaturschreiber ruhen die Finger auf der mittleren Buchstabenreihe des Hauptblocks. Bei den meisten Editoren muss man, um im Text zu navigieren, diese Grundhaltung aufgeben, um eine Abfolge von Funktions- und Cursortasten zu benutzen.

Bei Vim ist das anders; die Navigation erfolgt im Befehlsmodus, d.h. die Buchstaben- und Zahlentasten stehen für die Navigation zur Verfügung. Man kann sich im Text bewegen, ohne die Hände vom Hauptblock wegbewegen zu müssen. (Insbesondere für Laptop-Benutzer ein Feature, da hier die Cursortasten oft auf “interessante” Weise angeordnet sind.)

Grundbewegungen

Die einfachsten Bewegungen liegen daher direkt unter den Fingern der rechten Hand:

  • h – zum vorherigen Zeichen
  • j – eine Zeile nach unten
  • k – eine Zeile nach oben
  • l – zum nächsten Zeichen

So gut wie jeden Befehl in Vim kann man mehrfach ausführen, indem man vor dem Befehl eine Zahl eingibt. Ein 6k zum Beispiel führt den Bewegungsbefehl k sechs Mal aus. Wenn man sich von Beginn an angewöhnt, jede Bewegung im Puffer durch den “richtigen” Befehl zu machen statt durch “Cursortasten bis ich da bin wo ich hin will”, zahlt sich das später massiv aus!

Kommen wir zur nächsten Gruppe:

  • w – zum nächsten Wortanfang
  • e – zum nächsten Wortende
  • b – zum vorherigen Wortanfang (engl. begin, “Anfang”)

Ein “Wort” endet hierbei immer dort, wo zwischen Buchstabe, Zahl oder Unterstrich auf der einen, und anderen druckbaren Zeichen auf der anderen Seite gewechselt wird. foo_42_bar ist ein “Wort”, foo.bar}}}}baz sind fünf “Worte” (foo, ., bar, }}}}, baz).

Benutzt man diese drei Befehle in Großbuchstaben, ist ein “WORT” alles bis zum nächsten Leerzeichen:

  • W – zum nächsten WORTanfang
  • E – zum nächsten WORTende
  • B – zum vorherigen WORTanfang

Und weil auch ein WORT manchmal noch zu wenig ist, gibt es noch größere “Schritte”:

  • ) – zum nächsten Satzanfang
  • ( – zum vorherigen Satzanfang
  • } – einen Absatz weiter
  • { – einen Absatz zurück

Ein “Absatz” ist eine Leerzeile zwischen Textblöcken. Es geht aber noch größer:

  • ]] – zum nächsten Kapitel oder nächsten { in der ersten Spalte; nach einem Operator auch einem } in der ersten Spalte
  • ][ – zum nächsten Kapitel oder nächsten } in der ersten Spalte
  • [[ – zum vorherigen Kapitel oder vorherigen { in der ersten Spalte
  • [] – zum vorherigen Kapitel oder vorherigen } in der ersten Spalte

Wem es nicht aufgefallen ist: Das erste Zeichen entscheidet über “vorwärts” oder “rückwärts”, das zweite über die Art der Klammer die gesucht wird. Ein “Kapitel” ist vordefiniert als ein Seitenvorschub (<Strg>-L), oder eines von mehreren nroff-Makros (was natürlich nur hilft wenn man nroff-Text editiert). Die Klammern sind, offensichtlich, beim Editieren von C/C++, Java o.ä. hilfreich. Verschiedene Dateitypen-Plugins (LaTeX z.B.) definieren Absatz, Kapitel usw. entsprechend geeignet nach Dateityp.

Innerhalb einer Zeile kann man auch navigieren:

  • 0 – erste (nullte) Spalte der Zeile
  • ^ – erstes Zeichen der Zeile das kein Leerzeichen ist
  • g_ – letztes Zeichen der Zeile das kein Leerzeichen ist
  • $ – Ende der Zeile

Die Befehle 0 und ^ sind etwas eigen, insofern als bei ihnen eine Mehrfachausführung nicht möglich ist. Während sich 8$ acht Zeilenenden weiterbewegt, führt auch 8^ nur an den Anfang der aktuellen Zeile. Will man sich “zeilenanfangsweise” bewegen, gibt es diese beiden hier:

  • + – zum ersten Zeichen der nächsten Zeile
  • - – zum ersten Zeichen der vorherigen Zeile

Dann kann man noch zu einer bestimmten Zeilennummer springen, über einen der beiden go-Befehle (engl. für “gehe zu”):

  • <Zahl>gg – springe zu Zeile <Zahl> (ohne <Zahl>: Anfang des Puffers)
  • <Zahl>G – springe zu Zeile <Zahl> (ohne <Zahl>: Ende des Puffers)

Und weil zum Zeilenspringen auch das Spaltenspringen gehört:

  • <Zahl>| – springe zu Spalte <Zahl>

Die gerade beschriebenen Bewegungen orientieren sich im Puffer. Manchmal möchte man sich aber im Fenster bewegen, ohne den angezeigten Teil des Puffers zu ändern:

  • H – springe im Fenster nach oben (engl. high, “hoch”)
  • M – springe zur Mitte des Fensters (engl. middle)
  • L – springe im Fenster nach unten (engl. lower, “unten”)

Suchen (Zeichen)

Wie man sich nach dieser Liste von Bewegungsbefehlen denken kann, bietet Vim auch eine breite Palette an Suchbefehlen – die wiederum effektiv Bewegungsbefehle sind. Man kann mit ihnen also eine Operation “bis zum nächsten Vorkommen von…” ausführen.

  • f<Zeichen> – setzt den Cursor auf das nächste Vorkommen von <Zeichen>
  • F<Zeichen> – setzt den Cursor auf das vorherige Vorkommen von <Zeichen>

Die Gedächtnisstütze hier ist forward (engl. “vorwärts”). Diese beiden Befehle agieren nur in der aktuellen Zeile, d.h. die Suche bleibt am letzten <Zeichen> der Zeile “hängen”, springt nicht in die nächste Zeile(n).

  • t<Zeichen> – setzt den Cursor vor das nächste Vorkommen von <Zeichen>
  • T<Zeichen> – setzt den Cursor hinter das vorherige Vorkommen von <Zeichen>

Die Gedächtnisstütze ist dieses Mal till (engl. “bis”). Auch hier wird nur in der aktuellen Zeile gesucht.

Will man einen dieser Befehle wiederholen, ohne ihn erneut eingeben zu müssen, geht das mit:

  • ; – vorhergehendes f, F, t, T wiederholen
  • , – vorhergehendes f, F, t, T in entgegengesetzte Richtung wiederholen

Wurde für die ursprüngliche Suche eine Zahl Wiederholungen eingegeben, wird diese bei ; oder , nicht mit wiederholt. Statt dessen kann man bei ; oder , jeweils eine eigene Zahl Wiederholungen eingeben. Ein 4f_ sucht also den vierten Unterstrich vorwärts in der aktuellen Zeile, und ein anschließendes 2, würde zwei Unterstriche zurück suchen.

Suchen (Speziell)

Eine Sonderform des “Suchen nach Zeichen” ist besonders für Programmierer interessant:

  • % – Finde die nächste “Klammer” in der Zeile, und springe zu ihrem Gegenstück.

Dabei ist “Klammer” im weitesten Sinne und im Kontext des gerade bearbeiteten Dateityps gemeint; es werden z.B. auch C-Kommentare (`/*`, `*/`) oder Präprozessor-Direktiven (`#if`, `#else`, `#endif`) erkannt.

Suchen (Regulärer Ausdruck)

Eine weitere Möglichkeit, sich in einer Datei zu bewegen, ist die Suche nach regulärem Ausdruck. Sie wird eingeleitet durch ein /:

  • /<Suchbegriff> – sucht nach dem nächsten Vorkommen von <Suchbegriff> im aktuellen Puffer.

Wird der Text zwischen der aktuellen Cursorposition und dem Dateiende nicht gefunden, wird die Suche am Dateianfang fortgesetzt. In diesem Fall generiert Vim eine Warnung in der letzten Bildschirmzeile.

Der <Suchbegriff> wird dabei als Regulärer Ausdruck interpretiert.

(…wird fortgesetzt.)


Nächstes Kapitel -- Bearbeiten des Puffers

viki/05_bewegen.txt · Last modified: 2020/12/29 12:39 by solar