Ich habe einige aus dem Internet kopierte Codes mit 2-Leerzeichen-Einrückung und möchte sie in 4-Leerzeichen-Einrückung ändern. Ich frage mich, ob es eine kurze vim-Routine gibt, um die Aufgabe zu erledigen, ohne ein vim-Skript schreiben zu müssen. So mache ich es derzeit mit einer HTML-Datei:
- Zeichnen Sie ein Makro auf
- Gehen Sie zum Anfang einer Zeile
- Wählen Sie alle Leerzeichen bis zum ersten Auftreten von "<" visuell aus.
- Ziehen Sie alle Leerzeichen heraus und fügen Sie sie ein (im Grunde genommen, um sie zu verdoppeln).
- Wiederholen Sie das Makro bis zum Ende der Datei
Zusamenfassend qa0vt<yp<esc>jq
Tücken:
Das Makro schlägt für eine leere Zeile oder eine Zeile fehl, die nicht mit "<" beginnt. Und ich habe keine Ahnung, wie ich diese Lösung auf Nicht-HTML-Dateien erweitern kann.
ts
=tabstop
,sts
: =softtabstop
und[no]et
: =[no]expandtab
.retab
das Argument nützlich und warum können wir es nicht für diese Aufgabe verwenden?:set sts=2 noet
und:retab! 2
so wäre es ein bisschen kürzer sein (wenn auch vielleicht weniger lesbar) auf diese Weise.:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!
und verwenden Sie sie dann@:
in verschiedenen Dateien, um schnell dieselbe Aktion anzuwenden.Es kann mit
:set shiftwidth=4
und möglich seingg=G
.quelle
gg=G
bedeutet genau? Ich verstehe, dassgg
dies "zu 1,1 verschieben" undG
"zur letzten Zeile verschieben" bedeutet.=
nicht einrücken, so dass er nur Mittel zum Einzug von Anfang bis Ende des Textes%retab
, wodurch Leerzeichen, die in String-Literale eingebettet waren, falsch konvertiert wurden.Was ich mache, ist den Ansätzen von esneider und cforbish sehr ähnlich, aber etwas schneller zu tippen:
Ersetzt einfach das führende Leerzeichen (Leerzeichen oder Tabulatoren) durch doppelt so viel führendes Leerzeichen (
&
wird durch den übereinstimmenden Ausdruck ersetzt).quelle
%
.sed
und auf alle Dateien in einem VerzeichnisDies ist eine sehr alte Frage, aber alle Antworten sind ... falsch ... Vim hat eine sehr einfache Möglichkeit, die gesamte Datei neu zu indentieren. Ich habe das gelernt, nachdem ich meine eigene Funktion dazu geschrieben habe, also bin ich im selben Boot der Unwissenheit;)
Art
Dies setzt voraus, dass Sie Ihren Tabstop auf das eingestellt haben, was Sie möchten (für das OP wäre es also ts = 4).
Ich habe dies von http://vim.wikia.com/wiki/Fix_indentation gelernt , in dem erwähnt wird
quelle
Ich habe diesen regulären Ausdruck verwendet (er verdoppelt die Anzahl der führenden Leerzeichen):
quelle
%s/\s\+/&&/
das gleiche? Übrigens denke ich, dass dieg
Flagge unnötig ist (zum einen würde es nur 1 Übereinstimmung mit^pattern
in jeder Zeile geben, nein?)%s/^\s\+/&&/g
näher ist.Ähnlich (aber etwas einfacher) wie die Antwort von cforbish dupliziert dieser Regex die führenden Leerzeichen
Oder Sie können diesen anderen regulären Ausdruck verwenden, um 2-Leerzeichen in 4-Leerzeichen umzuwandeln, wobei einzelne Leerzeichen (und ungerade Beträge im Allgemeinen) erhalten bleiben.
Das ist,
quelle
Dies ist eine Variante der Regex-basierten Antworten.
Ich habe ein Bash-Skript in meinem lokalen bin-Verzeichnis, das die Anzahl der Leerzeichen am Zeilenanfang verdoppelt. Die Eingabe kann stdin oder eine Datei sein:
Ich verwende dies in vim, indem ich eine Zeile visuell auswähle und den folgenden Befehl gebe:
Dies erspart mir die Notwendigkeit, den regulären Ausdruck einzugeben (oder sich daran zu erinnern).
Ich benutze es auch in Karten wie den folgenden:
Dadurch wird es auf einen Block kürzlich eingefügten Textes angewendet. Normalerweise verwende ich die folgende Karte zum Einfügen anstatt
:set paste
Mein üblicher Workflow ist:
oder einfach den Einzug auf gezogenen Blöcken ändern, die aus einem anderen Puffer eingefügt wurden.
quelle
Zusätzlich zu der Antwort von @ spro habe ich dies in meine
.vimrc
Geben Sie einfach ein
:Format
.Bei der visuellen Auswahl werden nur die ausgewählten Linien formatiert.
Ohne visuelle Auswahl wird die gesamte Datei formatiert.
quelle