*usr_27.txt* Für Vim Version 8.1. Letzte Änderung: 26.Jan.2018 VIM-BENUTZERHANDBUCH - von Bram Moolenaar Befehle und Muster zum Suchen In Kapitel 3 wurden einige einfache Suchmuster erwähnt |03.9|. Vim kann viel komplexere Suchen erledigen. In diesem Kapitel werden die am häufigsten verwendeten erläutert. Eine detaillierte Spezifikation finden Sie hier: |pattern| |27.1| Groß-/Kleinschreibung ignorieren |27.2| Umlauf um das Dateiende |27.3| Offsets |27.4| Übereinstimmungen mehrere Male finden |27.5| Alternativen |27.6| Zeichenbereiche |27.7| Zeichenklassen |27.8| Einen Zeilenumbruch finden |27.9| Beispiele Nächstes Kapitel: |usr_28.txt| Faltungen Vorheriges Kapitel: |usr_26.txt| Wiederholen Inhaltsverzeichnis: |usr_toc.txt| ============================================================================== *27.1* Groß-/Kleinschreibung ignorieren Bei der Suche in Vim wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Deshalb sind »include«, »INCLUDE« und »Include« drei verschiedene Wörter und eine Suche wird nur mit einem von ihnen übereinstimmen. Schalten Sie nun die Option 'ignorecase' ein: > :set ignorecase Suchen Sie erneut nach »include», und jetzt wird es mit »Include», »INCLUDE« und »InCluDe« übereinstimmen. (Stellen Sie die Option 'hlsearch' ein, um schnell zu sehen, wo sich die Übereinstimmungen eines Musters befinden.) Sie können dies wieder ausschalten mit: > :set noignorecase Aber lassen Sie uns die Einstellung gesetzt behalten und nach »INCLUDE« suchen. Es wird mit genau dem gleichen Text wie »include« übereinstimmen. Setzen Sie nun die Option 'smartcase': > :set ignorecase smartcase Falls Sie ein Muster mit mindestens einem Großbuchstaben haben, erfolgt die Suche nach Groß-/Kleinschreibung. Die Idee ist, dass Sie den Großbuchstaben nicht tippen mussten, also müssen Sie es getan haben, weil Sie Übereinstimmung nach Groß- und Kleinschreibung wollten. Das ist Schlau! Mit diesen beiden Optionen finden Sie die folgenden Übereinstimmungen: Muster entspricht ~ wort wort, Wort, WORT, WoRt usw. Wort Wort WORT WORT WoRt WoRt GROß-/KLEINSCHREIBUNG IN EINEM MUSTER Falls Sie die Groß- und Kleinschreibung für ein bestimmtes Muster ignorieren möchten, können Sie dies tun, indem Sie der Zeichenkette »\c« voranstellen. Mit »\C« wird bei dem Muster auf Groß- / Kleinschreibung übereingestimmt. Dies setzt die Optionen 'ignorecase' und 'smartcase' außer Kraft, wenn »\c« oder »\C« verwendet wird, spielt ihr Wert keine Rolle. Muster entspricht ~ \Cwort wort \CWort Wort \cwort wort, Wort, WORT, WoRt usw. \cWort wort, Wort, WORT, WoRt usw. Ein großer Vorteil der Verwendung von »\c« und »\C« ist, dass es bei dem Muster bleibt. Wenn Sie also ein Muster aus dem Suchverlauf wiederholen, passiert dasselbe, egal ob 'ignorecase' oder 'smartcase' geändert wurde. Anmerkung: Die Verwendung von »\«-Elementen in Suchmustern hängt von der Option 'magic' ab. In diesem Kapitel gehen wir davon aus, dass 'magic' aktiviert ist, da dies die standardmäßige und empfohlene Einstellung ist. Wenn Sie 'magic' ändern würden, würden viele Suchmuster plötzlich ungültig. Anmerkung: Wenn Ihre Suche viel länger dauert als erwartet, können Sie sie mit CTRL-C unter Unix und CTRL-Break unter MS-DOS und MS-Windows unterbrechen. ============================================================================== *27.2* Umlauf um das Dateiende Standardmäßig beginnt eine Vorwärtssuche mit der Suche nach der angegebenen Zeichenkette an der aktuellen Cursorposition. Sie geht dann zum Ende der Datei weitergegangen. Falls die Zeichenkette zu diesem Zeitpunkt nicht gefunden wurde, wird von vorne begonnen und vom Dateianfang bis zur Cursorposition gesucht. Beachten Sie, dass Sie bei der Wiederholung des Befehls »n«, um nach der nächsten Übereinstimmung zu suchen, schließlich zu der ersten Übereinstimmung zurückgelangen. Falls Sie das nicht bemerken, suchen Sie unendlich! Um Ihnen einen Hinweis zu geben, zeigt Vim diese Meldung an: Suche erreichte das ENDE und wurde am ANFANG fortgesetzt ~ Falls Sie den Befehl »?« verwende, um in die andere Richtung zu suchen, erhalten Sie diese Meldung: Suche erreichte den ANFANG und wurde am ENDE fortgesetzt ~ Sie wissen immer noch nicht, wann Sie bei der ersten Übereinstimmung zurück sind. Ein Weg dies zu sehen, ist durch Einschalten der Option 'ruler': > :set ruler Vim zeigt die Cursorposition in der unteren rechten Ecke des Fensters an (in der Statuszeile, falls vorhanden). Es sieht aus wie dies: 101,29 84% ~ Die erste Zahl ist die Zeilennummer des Cursors. Merken Sie sich die Zeilennummer, wo Sie angefangen haben, damit Sie überprüfen können, ob Sie diese Position erneut passiert haben. NICHT UMLAUFEN Verwenden Sie den folgenden Befehl, um den Suchumlauf zu deaktivieren: > :set nowrapscan Wenn die Suche nun das Ende der Datei erreicht, wird folgende Fehlermeldung angezeigt: E385: Suche erreichte das ENDE ohne Treffer für: für immer ~ Sie können also alle Übereinstimmungen finden, indem Sie mit »gg« zum Anfang der Datei gehen und weiter suchen, bis Sie diese Nachricht sehen. Falls Sie mit »?« in die andere Richtung suchen, erhalten Sie: E384: Suche erreichte den ANFANG ohne Treffer für: für immer ~ ============================================================================== *27.3* Offsets Standardmäßig lässt der Suchbefehl den Cursor am Anfang des Musters positioniert. Sie können Vim anweisen, es an einem anderen Ort zu lassen, indem Sie ein Offset angeben. Für den Vorwärtssuchbefehl »/« wird der Offset durch Anhängen eines Schrägstrichs (/) und des Offsets angegeben: > /Standardmäßig/2 Dieser Befehl sucht nach dem Muster »Standardmäßig« und geht dann zum Beginn der zweiten Zeile nach dem Muster. Vim findet bei Verwenden dieses Befehls auf den obigen Absatz das Wort »Standardmäßig« in der ersten Zeile. Dann wird der Cursor zwei Zeilen nach unten bewegt und landet auf »indem Sie«. Falls der Offset eine einfache Zahl ist, wird der Cursor an den Anfang der Zeile gesetzt, die so viele Zeilen von der Übereinstimmung entfernt ist. Die Offsetzahl kann positiv oder negativ sein. Falls sie positiv ist, bewegt sich der Cursor um so viele Zeilen nach unten, falls negativ, bewegt er sich nach oben. ZEICHENWEISE OFFSETS Der Offset »e« gibt einen Offset vom Ende der Übereinstimmung an. Er bewegt den Cursor auf das letzte Zeichen der Übereinstimmung. Der Befehl: > /const/e setzt den Cursor auf das »t« von »const«. Von dieser Position aus eine Zahl Hinzufügen, geht so viele Zeichen nach vorne. Dieser Befehl springt direkt zum Zeichen nach der Übereinstimmung: > /const/e+1 Eine positive Zahl bewegt den Cursor nach rechts, eine negative Zahl bewegt ihn nach links. Zum Beispiel bewegt: > /const/e-1 Den Cursor auf das »s« von »const«. Falls der Offset mit »b« beginnt, springt der Cursor an den Anfang des Musters. Das ist nicht sehr nützlich, da das Weglassen des »b« dasselbe bewirkt. Nützlich wird es, wenn eine Zahl addiert oder subtrahiert wird. Der Cursor geht dann so viele Zeichen vorwärts oder rückwärts. Zum Beispiel bewegt: > /const/b+2 Den Cursor an den Anfang der Übereinstimmung und dann zwei Zeichen nach rechts. Also landet er auf dem »n«. WIEDERHOLEN Um die Suche nach dem zuvor verwendeten Suchmuster zu wiederholen, jedoch mit einem abweichenden Offset, lassen Sie das Muster weg: > /Das //e Ist gleich: > /Das/e Um mit dem gleichen Versatz zu wiederholen: > / »n« macht dasselbe. Um zu wiederholen, während ein zuvor verwendeter Offset entfernt wird: > // RÜCKWÄRTS SUCHEN Das »?« Befehl verwendet Offsets auf die gleiche Weise, aber Sie müssen »?« zum Trennen des Offsets vom Muster verwenden, anstelle von »/«: > ?const?e-2 Das »b« und »e« behalten ihre Bedeutung, sie ändern nicht die Richtung bei der Verwendung von »?«. STARTPOSITION Wenn eine Suche begonnen wird, beginnt diese normalerweise an der Cursorposition. Wenn Sie einen Zeilenoffset angeben, kann dies zu Problemen führen. Zum Beispiel: > /const/-2 Dies findet das nächste Wort »const« und geht dann zwei Zeilen nach oben. Wenn Sie »n« verwenden, um erneut zu suchen, könnte Vim an der aktuellen Position beginnen und die gleiche »const«-Übereinstimmung finden. Wenn Sie dann den Offset erneut verwenden, sind Sie wieder da, wo Sie gestartet sind. Sie würden stecken bleiben! Es könnte schlimmer sein: Angenommen, es gibt eine weitere Übereinstimmung mit »const« in der nächsten Zeile. Wenn Sie dann die Vorwärtssuche wiederholen, wird diese Übereinstimmung gefunden und es wird zwei Zeilen nach oben gegangen. Sie würden also den Cursor tatsächlich zurückbewegen! Wenn Sie einen Zeichenoffset angeben, wird dies von Vim ausgeglichen. So startet die Suche einige Zeichen vorwärts oder rückwärts, so dass dieselbe Übereinstimmung nicht wieder gefunden wird. ============================================================================== *27.4* Übereinstimmungen mehrere Male finden Das Element »*« gibt an, dass das Element davor beliebig oft übereinstimmen kann. Also stimmt: > /a* Mit »a«, »aa«, »aaa« usw. überein. Aber auch mit »« (die leere Zeichenkette), weil null Mal inbegriffen ist. Das »*« gilt nur für das Element direkt davor. Somit stimmt »ab*« überein mit »a«, »ab«, »abb«, »abbb« usw. Um eine ganze Zeichenfolge mehrfach zur Übereinstimmung zu bringen, muss sie zu einem Element zusammengefasst werden. Dazu setzen Sie »\(« davor und »\)« danach. Also hat dieser Befehl: > /\(ab\)* Als Übereinstimmungen: »ab«, »abab«, »ababab« usw. Und auch »«. Verwenden Sie »\+«, um eine Übereinstimmung mit der leeren Zeichenkette zu vermeiden. Dies lässt das vorherige Element mindestens einmal übereinstimmen. > /ab\+ Entspricht »ab«, »abb«, »abbb« usw. Es stimmt nicht mit »a« überein, wenn kein »b« folgt. Verwenden Sie »\=«, um ein optionales Element zu finden. Beispiel: > /Ordnern\= Entspricht »Ordner« und »Ordnern«. BESTIMMTE ANZAHLEN Verwenden Sie die Form »\{n,m}«, um eine bestimmte Anzahl von Elementen zur Übereinstimmung zu bringen. »n« und »m« sind Zahlen. Das Element davor wird »n« bis »m« mal einschließlich übereingestimmt (siehe |inclusive|). Beispiel: > /ab\{3,5} Entspricht »abbb«, »abbbb« und »abbbbb«. Wenn »n« weggelassen wird, ist der Standardwert Null. Wenn »m« weggelassen wir d, wird die Standardeinstellung unendlich verwendet. Wenn »,m« weggelassen wird, entspricht es genau »n« mal. Beispiele: Muster Übereinstimmungsanzahl ~ \{,4} 0, 1, 2, 3 oder 4 \{3,} 3, 4, 5 usw. \{0,1} 0 oder 1, dasselbe wie \= \{0,} 0 oder mehr, dasselbe wie * \{1,} 1 oder mehr, dasselbe wie \+ \{3} 3 MIT SO WENIG WIE MÖGLICH ÜBEREINSTIMMEN Die Elemente bisher stimmen mit so vielen Zeichen überein, wie sie finden können . Um mit so wenig wie möglich übereinzustimmen, verwenden Sie »\{-n,m}«. Es funktioniert genauso wie »\{n,m}«, nur dass die minimale Menge verwendet wird. Verwenden Sie zum Beispiel: > /ab\{-1,3} Dies stimmt mit »ab« in »abbb« überein. Eigentlich wird nie mehr als ein b passen, weil es keinen Grund gibt, mit mehr übereinzustimmen. Es erfordert etwas anderes, zu erzwingen, dass es mehr als die untere Grenze zur Übereinstimmung bringt. Die gleichen Regeln gelten für das Entfernen von »n« und »m«. Es ist sogar möglich beide Zahlen zu entfernen, was zu »\{-}« führt. Dies entspricht dem Objekt davor null oder mehrmals, so wenig wie möglich. Das Element für sich stimmt immer null mal überein. Es ist nützlich, wenn es mit etwas anderem kombiniert wird. Beispiel: > /a.\{-}b Dies entspricht »axb« in »axbxb«. Wenn dieses Muster verwendet werden würde: > /a.*b Würde versucht, so viele Zeichen wie möglich mit ».*« zur Übereinstimmung zu bringen, entspricht also »axbxb« als Ganzem. ============================================================================== *27.5* Alternativen Der Operator »oder« in einem Muster ist »\|«. Beispiel: > /foo\|bar Dies entspricht »foo« oder »bar«. Weitere Alternativen können verkettet werden: > /eins\|zwei\|drei Entspricht »eins«, »zwei« und »drei«. Um mehrere Übereinstimmungen zu erhalten, muss das Ganze in »\(« und »\)« platziert werden: > /\(foo\|bar\)\+ Dies entspricht »foo«, »foobar«, »foofoo«, »barfoobar« usw. Ein weiteres Beispiel: > /end\(if\|while\|for\) Dies entspricht »endif«, »endwhile« und »endfor«. Ein verwandtes Element ist »\&«. Dies erfordert, dass beide Alternativen an derselben Stelle übereinstimmen. Die resultierende Übereinstimmung verwendet die letzte Alternative. Beispiel: > /forever\&... Dies entspricht »for« in »forever«. Es wird zum Beispiel nicht mit »fortuin« übereinstimmen. ============================================================================== *27.6* Zeichenbereiche Um »a«, »b« oder »c« zu finden, könnten Sie »/a\|b\|c« verwenden. Wenn Sie eine Übereinstimmung auf alle Buchstaben von »a« bis »z« möchten, wird dies sehr lang. Es gibt eine kürzere Methode: > /[a-z] Das Konstrukt [] entspricht einem einzelnen Zeichen. Innen legen Sie fest, welche Zeichen übereinstimmen sollen. Sie können eine Liste von Zeichen wie folgt einfügen: > /[0123456789abcdef] Dies entspricht einem der enthaltenen Zeichen. Für aufeinanderfolgende Zeichen können Sie den Bereich angeben. »0-3« steht für »0123«. »w-z« steht für »wxyz«. Somit kann der gleiche Befehl wie oben verkürzt werden zu: > /[0-9a-f] Um mit dem Zeichen »-« selbst übereinzustimmen, machen Sie es zum ersten oder letzten Zeichen im Bereich. Diese Sonderzeichen werden akzeptiert, um die Verwendung in einem Bereich in [] zu vereinfachen (sie können tatsächlich überall im Suchmuster verwendet werden): \e \t \r \b Es gibt noch einige Sonderfälle für []-Bereiche, siehe |/[]| für die ganze Geschichte. VERNEINTE BEREICHE Verwenden Sie »^« am Anfang des Bereichs, um eine Übereinstimmung mit einem bestimmten Zeichen zu vermeiden. Das Element [] stimmt dann mit allen Zeichen außer den enthaltenen überein. Beispiel: > /"[^"]*" < " ein doppeltes Anführungszeichen [^"] ein Zeichen, das kein doppeltes Anführungszeichen ist * so viele wie möglich " wieder ein doppeltes Anführungszeichen Dies entspricht "foo" und "3!x", einschließlich der doppelten Anführungszeichen. VORDEFINIERTE BEREICHE Eine Reihe von Bereichen wird sehr häufig verwendet. Vim bietet hierfür Kurznamen. Zum Beispiel findet: > /\a Alphabetische Zeichen. Dies ist gleich der Verwendung von »/[a-zA-Z]«. Hier sind noch weitere davon: Element entspricht ist gleich ~ \d Ziffer [0-9] \D nicht-ziffrig [^0-9] \x Hexadezimalziffer [0-9a-fA-F] \X nicht hexadezimale Ziffer [^ 0-9a-fA-F] \s Leerraum [ ] ( und ) \S Nichtleeraumzeichen [^ ] (nicht und ) \l Kleinbuchstaben [a-z] \L Nicht-Kleinbuchstaben [^a-z] \u Großbuchstaben [A-Z] \U Nicht-Großbuchstaben [^A-Z] Anmerkung: Die Verwendung dieser vordefinierten Bereiche funktioniert viel schneller als die Zeichenbereiche, für die sie stehen. Diese Elemente können nicht in [] verwendet werden. Somit funktioniert »[\d\l]« NICHT, um mit einer Ziffer oder einem Kleinbuchstaben übereinzustimmen. Verwenden Sie stattdessen »\(\d\|\l\)«. Siehe |/\s| für die gesamte Liste dieser Bereiche. ============================================================================== *27.7* Zeichenklassen Der Zeichenbereich entspricht einer festen Menge von Zeichen. Eine Zeichenklasse ist ähnlich, aber mit einem wesentlichen Unterschied: Die Menge der Zeichen kann neu definiert werden, ohne das Suchmuster zu ändern. Suchen Sie beispielsweise nach diesem Muster: > /\f\+ Die Elemente »\f« stehen für Dateinamen. Somit entspricht dies einer Sequenz von Zeichen, die ein Dateiname sein können. Welche Zeichen Teil eines Dateinamens sein können, hängt von dem System ab, das Sie verwenden. Unter MS-Windows ist der Rückschrägstrich enthalten, unter Unix nicht. Das wird mit der Option 'isfname' angegeben. Der Standardwert für Unix ist: > :set isfname isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,= Bei anderen Systemen unterscheidet sich der Standardwert. So können Sie ein Suchmuster mit »\f« auf einen Dateinamen machen, und es passt sich automatisch an das System an, auf dem Sie es verwenden. Anmerkung: Tatsächlich erlaubt Unix die Verwendung fast aller Zeichen in einem Dateinamen, einschließlich Leerraum. Das Einschließen dieser Zeichen in 'isfname' würde theoretisch korrekt sein. Aber es würde es unmöglich machen, das Ende eines Dateinamens im Text zu finden. Daher ist der Standardwert von 'isfname' ein Kompromiss. Die Zeichenklassen sind: Element entspricht Option ~ \i Bezeichnerzeichen 'isident' \I wie \i ohne Ziffern \k Schlüsselwortzeichen 'iskeyword' \K wie \k ohne Ziffern \p druckbare Zeichen 'isprint' \P wie \p ohne Ziffern \f Dateinamenzeichen 'isfname' \F wie \f ohne Ziffern ============================================================================== *27.8* Einen Zeilenumbruch finden Vim kann ein Muster finden, das einen Zeilenumbruch enthält. Sie müssen angeben, wo der Zeilenumbruch geschieht, weil alle bisher genannten Elemente nicht mit einem Zeilenumbruch übereinstimmen. Verwenden Sie das Element »\n«, um an einer bestimmten Stelle nach einem Zeilenumbruch zu suchen: > /das\nWort Dies stimmt mit einer Zeile überein, die mit »das« endet, und die nächste Zeile beginnt mit »Wort«. Um auch »das Wort« zu finden, müssen Sie ein Leerzeichen oder einen Zeilenumbruch suchen. Das dafür zu verwendende Element ist »\_s«: > /das\_sWort Um beliebig viel Leerraum zuzulassen: > /das\_s\+Wort Dies stimmt auch überein, wenn »das « am Ende einer Zeile und » Wort« am Beginn der nächsten Zeile steht. »\s« entspricht einem Leerzeichen, »\_s« entspricht einem Leerzeichen oder einem Zeilenumbruch. Ähnlich entspricht »\a« einem Buchstaben und »\_a« einem Buchstaben oder einem Zeilenumbruch. Die anderen Zeichenklassen und -bereiche können auf die gleiche Weise durch Einfügen eines »_« geändert werden. Viele andere Elemente können so gemacht werden, dass sie einem Zeilenumbruch entsprechen, indem »\ _« vorangestellt wird. Zum Beispiel entspricht »\_.« einem beliebigen Zeichen oder einem Zeilenumbruch. Anmerkung: »\_.*« stimmt mit allem bis zum Ende der Datei überein. Seien Sie vorsichtig hiermit, dadurch kann ein Suchbefehl sehr langsam werden. Ein weiteres Beispiel ist »\_[]«, ein Zeichenbereich, der einen Zeilenumbruch enthält: > /"\_[^"]*" Dies findet einen Text in doppelten Anführungszeichen, der auf mehrere Zeilen aufgeteilt sein kann. ============================================================================== *27.9* Beispiele Hier sind einige Suchmuster, die Sie nützlich finden mögen. Dies zeigt, wie die oben genannten Elemente kombiniert werden können. FINDEN EINES KALIFORNISCHEN KENNZEICHENS Ein Beispiel für ein Kfz-Kennzeichen ist »1MGU103«. Es hat eine Ziffer, drei Großbuchstaben und drei Ziffern. Dies direkt in ein Suchmuster einfügen: > /\d\u\u\u\d\d\d Eine andere Möglichkeit ist, mit einer Anzahl anzugeben, dass es drei Ziffern und Buchstaben sind: > /\d\u\{3}\d\{3} Stattdessen die Bereiche [] verwenden: > /[0-9][A-Z]\{3}[0-9]\{3} Welches von diesen sollten Sie verwenden? An was auch immer Sie sich erinnern können. Die einfache Art, an die Sie sich erinnern können, ist viel schneller als die ausgefallene, die Sie nicht können. Wenn Sie sich an alle erinnern können, dann vermeiden Sie letzteres, denn es ist des mehr Tippen und langsamer ausführen. EINEN BEZEICHNER FINDEN In C-Programmen (und vielen anderen Computersprachen) beginnt ein Bezeichner mit einem Buchstaben und besteht weiterhin aus Buchstaben und Ziffern. Unterstriche können auch verwendet werden. Dies ist zu finden mit: > /\<\h\w*\> »\<« und »\>« werden verwendet, um nur ganze Wörter zu finden. »\h« steht für »[A-Za-z_]« und »\w« für »[0-9A-Za-z_]«. Anmerkung: »\<« und »\>« hängen von der Option 'iskeyword' ab. Wenn sie beispielsweise »-« enthält, stimmt »ident-« nicht überein. In dieser Situation verwenden Sie: > /\w\@