2016-04-12 11 views
0

Ich habe diese Codezeile aus einem Buch genommen, um HTML-Code in ein Zeichenfolgen-verkettetes Formular für die Verwendung in Javascript in VIM zu formatieren. Ich kann nicht verstehen, was die Zahlen "1" und "2" darstellen und wofür die Fragezeichen am Ende der Regexe stehen. Ich bin es gewöhnt, Auswechslungen wie % s/foo/bar/g zu sehen, so dass die Abwesenheit von Schrägstrichen mich ein wenig verwirrt. Zusammenfassend verstehe ich nicht die '' und '', die Fragezeichen nach dem Dollarzeichen und vor dem Wagenrücklauf, und warum die Schrägstriche nicht verwendet werden.VIM: kann diese Ersetzung nicht vollständig verstehen

vmap <silent> ;q :s?^\(\s*\)\(.*\)\s*$? \1 + '\2'?<CR> 

Antwort

0

Wie es in anderen Antworten gesagt wurde, kann das / Trennzeichen durch ein anderes Zeichen ersetzt werden: Wenn viele Schrägstriche im Befehl verwendet werden, kann es klarer sein; sehen Sie eine Frage darüber, https://stackoverflow.com/a/36568901/3271687.

\1, \2, \n... Spiel des n-ten Unterausdruck in dem Muster verwendet. Ein Unterausdruck ist mit \( und \) definiert. Also in Ihrem Beispiel:

:s?^\(\s*\)\(.*\)\s*$? \1 + '\2'? 
       \s* --> note that this part can't be reached, it's useless 

wird \1 durch die Räume in \(\s*\) gefunden ersetzt und \2 wird von allen Zeichen (der ganze Rest der Zeile) gefunden in \(.*\) ersetzt.

1

Vorwärtsschrägstriche werden typischerweise als Separator verwendet, aber der Ersatz-Befehl verwendet das erste Zeichen nach dem ‚S‘ als Trennzeichen, so dass es zu irgendetwas zu ändern. Es scheint, dass der Autor dachte, dass alle Schrägstriche verwirrend sein könnten, und änderte es in ein "?". Dies ist, wie der Befehl mit dem traditionelleren vorwärts erscheinen würde schlitzt:

:s/^\(\s*\)\(.*\)\s*$/ \1 + '\2'/<CR> 

Also die oben würde bedeuten, Suche nach vorn, finden Linien mit jeder Menge Leerzeichen beginnen, durch eine beliebige Anzahl von beliebigen Zeichen gefolgt, und jede Menge Whitespace, und ersetzen Sie es dann für <space><the first whitespace><space>+<space>'<the other characters>'. Ich denke, dass es beabsichtigte, irgendwelche abschließenden Leerzeichen zu entfernen, aber in meinen Tests tut es das nicht, weil das. * Alles bis zum Ende der Linie zusammenbringt.

+0

Eigentlich habe ich getestet und '?' sucht nicht rückwärts in einem Ersatzbefehl. Es verwendet einfach ein anderes Zeichen als Trennzeichen. Aktualisierung ... – Daniel

+0

Danke. Was machen die \ 1 und \ 2? –

+0

@DarkNawg Die Zeichen zwischen dem \ (und \) bilden eine Gruppe, und was auch immer mit diesem Ausdruck übereinstimmt, kann später in der Ersetzungszeichenfolge verwendet werden. \ 1 und \ 2 werden verwendet, um anzuzeigen, dass es sich um die erste und zweite Gruppe handelt. Also in der ersten Gruppe haben wir was auch immer \ s * (jede Menge Leerzeichen) und in der zweiten haben wir was auch immer. * (Jede Menge eines beliebigen Zeichens). Weitere Details finden Sie hier: http://vimregex.com/#backreferences – Daniel