Es gibt (mindestens) drei Substitutionstechniken relevant für diesen Fall.
Die erste nutzt den Vorteil der vorherigen Atom-Matching-Syntax zu natürlich einen Schritt der Einrückung zu definieren. Gemäß der Frageanweisung ist ein Einrückungsschritt ein Paar benachbarter Leerzeichen, denen nichts vorangestellt ist, sondern Leerzeichen vom Anfang der Zeile. Nach dieser Definition kann man das tatsächliche Substitutionsmuster von rechts nach links konstruieren.
:%s/\%(^ *\)\@<= /\t/g
Tatsächlich bezeichnet das Muster, das ein Auftreten von zwei literal Leerzeichen nach einem Null-Breite \@<=
Spiel des vorangehenden Atom, das das Muster ^ *
in Klammern Gruppierung gewickelten \%(
/\)
. Diese nicht einfangenden Klammern werden anstelle der üblichen einfangenden Klammern verwendet, \(
/\)
, da dort keine weitere Bezugnahme auf die übereinstimmenden führenden Leerzeichen erforderlich ist. Aufgrund des Flags g
läuft der obige Befehl :substitute
durch das führende Leerzeichenpaar nach und ersetzt jedes einzelne durch ein einzelnes Tabulatorzeichen.
Die zweite Technik hat einen anderen Ansatz.Anstatt separate Einrückungsebenen zu finden, kann man jede der Zeilen, beginnend mit den Leerzeichen , in zwei Zeilen zerlegen: eine enthält die Einrückungsräume der ursprünglichen Zeile, eine andere, die den Rest enthält. Danach ist es einfach, alle Paare von Leerzeichen in der ersten Zeile zu ersetzen und die Zeilen zusammen miteinander zu verketten.
:g/^ /s/^ \+/&\r/|-s/ /\t/g|j!
Die dritte Idee ist, die führenden Leerzeichen durch Vim scripting Sprache zu verarbeiten. Ein praktischer Weg, dies zu tun, besteht darin, den Ersatz mit einer Ausdruckseigenschaft des Befehls :substitute
zu verwenden (siehe :help sub-replace-\=
). Startet die Ersatzzeichenfolge des Befehls mit \=
, ermöglicht die Übereinstimmungen eines Musters mit Ergebnissen der Auswertung des Ausdrucks , der nach \=
angegeben wird, zu ersetzen.
:%s#^ \+#\=repeat("\t",len(submatch(0))/2)
Funktioniert das nicht? ':% s// \ t/g'? –
Sie können auch den Befehl ': retab' verwenden. Sage ': setze ts = 2 noet' und dann': retab! '. Setzen Sie dann den Tabstop auf den Wert zurück, den Sie verwenden möchten, z. ': set ts = 4' – glts
@glgts: Ich würde diesen Kommentar als Antwort eingeben, um rep (weil das ist genau das, was das OP will)! – eckes