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?
3 Antworten
/
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).
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 ( -
).
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
Neue Fragen
vim
Vim ist ein kostenloser und quelloffener modaler Texteditor, der für die meisten wichtigen Plattformen verfügbar ist. Es ermöglicht eine hohe Effizienz bei vielen Textbearbeitungsaufgaben, weist jedoch eine steile Lernkurve auf. Führen Sie ": help vimtutor" aus, um die Grundlagen zu erlernen. Bei Fragen außerhalb der Programmierung verwenden Sie stattdessen https://vi.stackexchange.com/.