2017-03-20 3 views

Antwort

3

Ich habe einen Weg gefunden, aber es sieht ein bisschen verrückt:

set statusline=%{substitute(line('$')\,'\\d\\zs\\ze\\%(\\d\\d\\d\\)\\+$'\,'\,'\,'g')} 

Die erste Runde des Schrägstrichs ist nur für set (I , und \ selbst zu entkommen).

Was ich Einstellung tatsächlich die Möglichkeit, diese Zeichenfolge ist:

%{substitute(line('$'),'\d\zs\ze\%(\d\d\d\)\+$',',','g')} 

Als Format-String, diese Zeile enthält ein Formatierungscode, der %{...} ist. Alles in ... wird als ein Ausdruck ausgewertet und das Ergebnis wird zurück in.

Der Ausdruck, den ich evaluiere, ist (Leerzeichen hinzugefügt (wenn ich sie zum echten Code hinzugefügt hätte, hätte ich sie für set entkommen) wieder und zwingt noch mehr Schrägstriche)):

substitute(line('$'), '\d\zs\ze\%(\d\d\d\)\+$', ',', 'g') 

Dies ist ein Aufruf an die substitute Funktion ist. Die Argumente sind die Quellzeichenfolge, die Regex, die Ersetzungszeichenfolge und eine Liste von Flags.

Die Zeichenfolge, mit der wir beginnen, ist line('$'). Dieser Aufruf gibt die Anzahl der Zeilen im aktuellen Puffer (bzw. die Nummer der letzten Zeile im Puffer) zurück. Dies zeigt normalerweise %L.

Das Suchmuster, das wir suchen, ist \d(\d\d\d)+$ (spezielle vim Verrücktheit entfernt), d. H. Eine Ziffer, gefolgt von 1 oder mehr Gruppen von 3 Ziffern, gefolgt von dem Ende der Zeichenfolge. Gruppierung wird \%(\) in vim geschrieben, und "1 oder mehr" ist \+, die uns \d\%(\d\d\d\)\+$ gibt. Das letzte bisschen Magie ist \zs\ze. \zs legt den Anfang der übereinstimmenden Zeichenfolge fest; \ze setzt das Ende. Das funktioniert so, als ob alles vor \zs ein Look-Behind-Muster wäre und alles nach \ze ein Look-Ahead-Muster wäre.

Worauf das hinausläuft: Wir suchen nach jeder Position in der Quellzeichenfolge, der eine Ziffer vorangestellt ist, gefolgt von genau N Ziffern (wobei N ein Vielfaches von 3 ist). Das funktioniert so, als würde man von rechts nach links gehen und dabei jeweils 3 Ziffern überspringen. Dies sind die Positionen, an denen wir ein Komma einfügen müssen.

Das ist die Ersatzzeichenfolge: ',' (ein Komma). Da wir eine Zeichenkette der Länge 0 abgleichen, fügen wir effektiv in die Quellzeichenfolge ein (indem wir '' durch ',' ersetzen).

Schließlich sagt die g Flag, dies mit allen Übereinstimmungen zu tun, nicht nur die erste.

TL; DR:

  • line('$') gibt uns die Anzahl der Zeilen
  • substitute(..., '\d\zs\ze\%(\d\d\d\)\+$', ',', 'g') Komma fügt hinzu, wo wir sie wollen
  • %{} lässt uns
+0

„beliebige Ausdrücke in statusline einbetten aber es sieht ein bisschen verrückt aus "? Es ist eine Schönheit :-). Zwei Anmerkungen: (1) Wenn das Trennzeichen geändert werden muss, ist es das vorletzte "\". (2) Wenn das Trennzeichen ein einfaches Zitat sein soll, muss es verdoppelt werden: "\ '\'". –

Verwandte Themen