User Tools

Site Tools


viki:05_bewegen

This is an old revision of the document!


Vim ist keine Insel

5. Bewegen im Puffer

Vim bietet eine Vielzahl von Möglichkeiten, sich zu einem bestimmten Punkt in einem Puffer zu bewegen. Manche davon machen intuitiv Sinn, aber relativ schnell kommt man an den Punkt von “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 nicht nur nützlich, sondern schlechthin notwendig.

Dieses Kapitel wird man nicht in einem Durchgang verinnerlichen können. Ich würde vorschlagen, so weit zu lesen wie man kommt, und dann zum nächsten Kapitel überzugehen. Aber man sollte regelmäßig hierhin zurückkehren, denn man sollte sein “Arsenal” an Bewegungsbefehlen im Laufe der Zeit immer mehr erweitern.

Grundlagen

Als geübter Tastaturschreiber ruhen die Finger auf der mittleren Buchstabenreihe. 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 von der Haupttastatur 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 jede Bewegung kann man mehrfach ausführen, indem man vor dem Bewegungsbefehl eine Zahl eingibt. Ein 6k zum Beispiel führt den Bewegungsbefehl k sechs Mal 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 zuwenig 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.

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 4fx sucht also das vierte x nach dem Cursor in der aktuellen Zeile, und ein anschließendes 2; würde zwei x weiter 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 zu verstehen. Hier sind nicht nur `([{}])` gemeint, sondern auch C-Kommentare (`/*`, `*/`) oder Präprozessor-Direktiven (`#if`, `#else`, `#endif`).

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.1536589296.txt.gz · Last modified: 2018/09/10 16:21 by 127.0.0.1