Angenommen, ich habe eine kurze CSS-Datei (Code unten) mit 2 Selektoren.

.selector1 {
    margin: 0;
    padding: 2px 3px;
    background-color: #ffe0e0;
}

.selector2 {
    cursor: pointer;
    text-decoration: underline;
}

Mein Ziel ist es, alle Regeln im nächsten Selektor auszudrucken. Der Cursor befindet sich ganz am Anfang der Datei (1. Zeichen der 1. Zeile). Also versuche ich:

:/\V{/+1,/\V}/-1 print

Was ich bekomme ist: Backward range given.

Ich habe die Gründe dafür untersucht und es ist so, dass der Suchbefehl /, wenn er als Bereich verwendet wird, in der nächsten Zeile der aktuellen Zeile nachschaut. Das erste gefundene { befindet sich also in selector2, während sich das erste gefundene } noch in selector1 befindet. Ich gehe davon aus, dass Ex-Befehle auf Zeilen (anstelle von Zeichen) wirken, während das Verhalten von / standardmäßig darin besteht, das nächste Zeichen (in diesem Fall die nächste Zeile) zu suchen.

Für selector2 würde der Befehl funktionieren, wenn der Cursor eine Zeile über selector2 gesetzt würde, aber selector1 in der ersten Zeile steht und daher das Platzieren der Cursorzeile darüber unmöglich ist.

Was ist der einfachste Weg, um das Ziel zu erreichen - drucken Sie die Regeln aus der nächsten Auswahl? Auch wenn sich der Cursor in der ersten Zeile befindet.

Gibt es eine Möglichkeit, das Standardverhalten von / beim Starten der Suche in der nächsten Zeile der aktuellen Zeile irgendwie zu unterdrücken / zu überwinden?

vim
1
Robert Kusznier 28 Dez. 2015 im 18:24

3 Antworten

Beste Antwort

/ in Bereichen stimmt tatsächlich mit der nächsten Zeile überein, die das Muster enthält. Von :h :/:

/{pattern}[/]   the next line where {pattern} matches

Sie können jedoch ein count an / übergeben, um anzugeben, von wo aus mit der Suche begonnen werden soll. Standbild aus dem :help:

The "/" and "?" may be preceded with another address. The search starts from there. 
(...)
The {number} must be between 0 and the number of lines in the file.
(...)
Some commands interpret the zero as "before the first line" (:read, search pattern, etc).

In Ihrem Fall könnten Sie verwenden

:0/\V{/+1,/\V}/-1 print

Um von "vor der ersten Zeile" zu suchen, dh auch abzugleichen.

Eine allgemeinere Methode zum Abgleichen der aktuellen Zeile wäre :.-/<pattern>, was bedeutet: "Die Zeile vor der aktuellen Zeile" (funktioniert auch, wenn die aktuelle Zeile die erste ist).

1
Marth 28 Dez. 2015 im 16:07

Sie brauchen nur einen vorbereitenden Schritt:

:/}/;?{?+,-p

Hier bewegen Sie den Cursor zuerst (mit /}/) zur nächsten schließenden Klammer und dann (;) Ihren Bereich mit einer Rückwärtssuche (?{?+) und der Zeile über der aktuellen Zeile ( -).

1
romainl 28 Dez. 2015 im 15:56

Wenn Ihre Frage lautet, wie der Bereich /foo/,/bar/ von der aktuellen Zeile aus gestartet werden kann, können Sie Folgendes tun:

exec search("{")+1.';/\V}/-1 print'

Das search() sucht von der Cursorposition aus.

Für Ihr konkretes Problem können Sie zuerst nach } und dann nach { suchen:

/\V}/-1,?\V{?+1 print

Passen Sie -1 +1 für unterschiedliche Anforderungen an -n +n an.

Oder mach das:

/{<cr>
vi{
:print
1
Kent 28 Dez. 2015 im 15:58