it-swarm.com.de

Ändern Sie in vim den Einzug mit 2 Leerzeichen in den Einzug mit 4 Leerzeichen

Ich habe einige Codes aus dem Internet kopiert, die einen Einzug mit zwei Leerzeichen haben, und ich möchte ihn in einen Einzug mit vier Leerzeichen ä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
  • An den Anfang einer Zeile springen
  • Visuelle Auswahl aller Leerzeichen bis zum ersten Auftreten von "<"
  • Ziehe und füge alle Leerzeichen ein (im Grunde um sie zu verdoppeln)
  • Wiederholen Sie das Makro bis zum Ende der Datei

Zusamenfassend qa0vt<yp<esc>jq

Fallstricke:

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 ausweiten soll.

83
Lim H.

Eine allgemeine Möglichkeit, den Einzug zu ändern, besteht darin, den Tabulator zu ändern:

Fügen Sie Ihre Datei in einen leeren Puffer ein.

:set ts=2 sts=2 noet
:retab!

Dies ändert sich alle 2 Leerzeichen in ein TAB-Zeichen, dann:

:set ts=4 sts=4 et
:retab

Das ändert jedes TAB in 4 Leerzeichen.

Der Vorteil dieser Methode ist, dass Sie sie auch umgekehrt verwenden können, um beispielsweise von 4 auf 2 Leerzeichen umzurechnen.

159
Daan Bakker

Es kann möglich sein, mit :set shiftwidth=4 und gg=G.

54
perreal

Was ich tue, ist sehr ähnlich zu den Ansätzen von Esneider und Cforbish, aber etwas schneller zu tippen:

:%s/^\s*/&&

Ersetzt einfach das führende Leerzeichen (Leerzeichen oder Tabulatoren) durch doppelt so viel führendes Leerzeichen (& wird durch den übereinstimmenden Ausdruck ersetzt).

27
spro

Ich habe diesen regulären Ausdruck verwendet (er verdoppelt die Anzahl der führenden Leerzeichen):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g
2
cforbish

Ähnlich (aber etwas einfacher) wie die Antwort von cforbish dupliziert diese Regex die führenden Leerzeichen

:%s/^\( \+\)/\1\1

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.

:%s/^\(\(  \)\+\)/\1\1

Das ist,

  • 1 Leerzeichen ⇢ 1 Leerzeichen
  • 2 Leerzeichen ⇢ 4 Leerzeichen
  • 3 Leerzeichen ⇢ 5 Leerzeichen
  • 4 Leerzeichen ⇢ 8 Leerzeichen
1
esneider

Dies ist eine sehr alte Frage, aber alle Antworten sind ... falsch ... Vim hat eine sehr einfache Möglichkeit, die gesamte Datei erneut einzuspeisen. Ich habe das gelernt, nachdem ich meine eigene Funktion dazu geschrieben habe, also bin ich im selben Unwissenheitsboot;)

art

gg=G

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, das erwähnt

Wenn Sie im normalen Modus gg = G eingeben, wird die gesamte Datei erneut eingeblendet. Dies ist ein Sonderfall. = ist ein Operator. Genau wie d oder y wird es auf jeden Text angewendet, über den Sie mit einem Cursorbewegungsbefehl fahren. In diesem Fall positioniert gg den Cursor in der ersten Zeile und dann rückt = G von der aktuellen Cursorposition bis zum Ende des Puffers ein.

1
Chase Vasic

Zusätzlich zu der Antwort von @ spro habe ich dies in mein .vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

Tipp einfach :Format.

Bei der visuellen Auswahl werden nur die ausgewählten Zeilen formatiert.

Ohne visuelle Auswahl formatiert dies die gesamte Datei.

0
Eli

Dies ist eine Variante der auf Regex basierenden Antworten.

Ich habe ein Bash-Skript in meinem lokalen bin-Verzeichnis, das die Menge an Leerzeichen am Anfang einer Zeile verdoppelt. Die Eingabe kann stdin oder eine Datei sein:

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

Ich verwende dies in vim, indem ich visuell eine Zeile auswähle und den folgenden Befehl ausgebe:

:'<,'>!dblsp

Dies erspart mir die Notwendigkeit, den regulären Ausdruck einzugeben (oder sich daran zu erinnern).

Ich benutze es auch in Karten wie den folgenden:

nnoremap <leader>] `[V`]!dblsp<CR>

dies wird auf einen Block mit kürzlich eingefügtem Text angewendet. Ich benutze normalerweise die folgende Karte zum Einfügen anstatt :set paste

nnoremap <leader>p :r !xclip -o<CR>

Mein üblicher Workflow ist:

  • code-Schnipsel auswählen (zB Beispielcode auf dieser Seite sind 2 Leerzeichen, aber ich möchte 4)
  • code-Snippet einfügen (, p)
  • abstand ändern (,])

oder ändern Sie einfach den Einzug bei gezerrten Blöcken, die aus einem anderen Puffer eingefügt wurden.

0
htaccess