Frage Ändern Sie den Abstand von 2 Leerzeichen zu 4 Leerzeichen in vim


Ich habe einige Codes aus dem Internet kopiert, die 2-Leerzeichen-Einzug haben, und ich möchte es in 4-Leerzeichen-Einzug ändern. Ich frage mich, ob es eine kurze vim-Routine gibt, um die Aufgabe zu erledigen, ohne vim-Skript schreiben zu müssen? Hier ist, wie ich es gerade mit einer HTML-Datei mache:

  • Zeichne ein Makro auf
  • Gehe zum Anfang einer Zeile
  • Visuelle Auswahl aller Leerzeichen bis zum ersten Auftreten von "<"
  • Yankee 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 diese Lösung auf Nicht-HTML-Dateien erweitert werden kann.


75
2018-06-03 00:37


Ursprung


Antworten:


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

Fügen Sie Ihre Datei in einen leeren Puffer ein, dann:

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

Dies ändert alle 2 Leerzeichen zu einem TAB-Zeichen, dann:

:set ts=4 sts=4 et
:retab

Dies ändert jeden TAB zu 4 Leerzeichen.

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


145
2018-06-03 07:42



Es ist möglich mit :set shiftwidth=4 und gg=G.


48
2018-06-03 00:46



Was ich tue ist sehr ähnlich zu esneider und cforbish Ansätze, aber ein bisschen schneller zu tippen:

:%s/^\s*/&&

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


23
2017-09-24 03:24



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

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

2
2018-06-03 01:00



Ähnlich (aber etwas einfacher) zu Cforbishs Antwort wird diese Regex die führenden Leerzeichen duplizieren

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

Oder Sie können diese andere Regex 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 Plätze ⇢ 4 Plätze
  • 3 Plätze ⇢ 5 Plätze
  • 4 Plätze ⇢ 8 Plätze

1
2018-06-04 04:11



Dies ist eine Variante der regexbasierten Antworten.

Ich habe ein Bash-Skript in meinem lokalen bin-Verzeichnis, das die Menge an Leerzeichen am Anfang einer Zeile verdoppelt. 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 benutze dies innerhalb von vim, indem ich visuell eine Zeile auswähle und den folgenden Befehl ausspreche:

:'<,'>!dblsp

Dies erspart mir die Notwendigkeit, die Regex einzugeben (oder sich daran zu erinnern).

Ich verwende es auch in Karten wie dem folgenden:

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

was es auf einen Block von kürzlich eingefügtem Text anwenden wird. Normalerweise verwende ich die folgende Map zum Einfügen statt :set paste

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

Mein gewohnter Workflow ist:

  • Code - Snippet auswählen (z. B. die Beispielcode Auf dieser Seite sind 2 Leerzeichen, aber ich möchte 4)
  • Code-Snippet einfügen (, p)
  • Abstand ändern (,])

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


0
2018-03-28 02:40



Dies ist eine sehr alte Frage, aber alle Antworten sind ... falsch ... Vim hat eine sehr einfache Möglichkeit, die gesamte Datei zu reindent. Ich habe dies nach dem Schreiben meiner eigenen Funktion gelernt, also bin ich im selben Ignoranzboot;)

Art

gg=G

Dies setzt voraus, dass Sie Ihr Tabstop auf das eingestellt haben, was Ihnen gefällt (für das OP wäre das ts = 4).

Ich habe das von gelernt http://vim.wikia.com/wiki/Fix_indentierung , die erwähnt

Im normalen Modus wird durch Eingabe von gg = G die gesamte Datei neu eingefügt. Dies ist ein besonderer Fall. = ist ein Operator. Genau wie d oder y wirkt es auf jeden Text, den Sie mit einem Cursorbewegungsbefehl bewegen. In diesem Fall positioniert gg den Cursor auf die erste Zeile, dann = G springt von der aktuellen Cursorposition bis zum Ende des Puffers zurück.


-1
2018-02-18 02:12