Ist es möglich, Tabulatoren unter Beibehaltung der Textausrichtung in Leerzeichen umzuwandeln?
Einfach zu ersetzen funktioniert nur dann sinnvoll, wenn keine führenden Zeichen vorhanden sind.
Ist es möglich, Tabulatoren unter Beibehaltung der Textausrichtung in Leerzeichen umzuwandeln?
Einfach zu ersetzen funktioniert nur dann sinnvoll, wenn keine führenden Zeichen vorhanden sind.
Antworten:
Sie können den :retab
Befehl verwenden. Von
:help :retab
Ersetzen Sie alle Sequenzen des Leerraums, die a enthalten,
<Tab>
durch neue Zeichenfolgen des Leerraums, indem Sie den neuen angegebenen Tabulatorwert verwenden. Wenn Sie keine neue Tabstop-Größe angeben oder diese Null ist, verwendet Vim den aktuellen Wert von'tabstop'
. [...]'expandtab'
Wenn diese Option aktiviert ist, ersetzt Vim alle Registerkarten durch die entsprechende Anzahl von Leerzeichen.
Beachten Sie, dass der Befehl einen Bereich akzeptiert, sodass Sie eine visuelle Auswahl treffen können und dann nur :retab
die ausgewählten Linien.
Sie können jedoch :retab
wie angegeben alle Tabulatoren in Leerzeichen ändern und nicht nur die Tabulatoren am Zeilenanfang
Also das (wo ⇥
ist ein Tabulatorzeichen):
if :; do
⇥echo "⇥hello"
end
wird geändert in (wo ␣
ist ein Leerzeichen):
if :; do
␣␣echo "␣␣hello"
end
Dies kann in einigen Szenarien zu unerwarteten Nebenwirkungen führen, und es ist noch problematischer, wenn Leerzeichen in Tabulatoren geändert werden!
Also schrieb ich eine kleine Funktion ändern nur tabs / Leerzeichen am Anfang der Zeile:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Bei dieser Version müssen Sie expandtab
den Funktionsaufruf manuell angeben (dh :call Retab(1)
Tabulatoren in Leerzeichen ändern), Sie können ihn jedoch auch so ändern, dass er den aktuellen Wert von &expandtab
(wie bereits bei &tabstop
) annimmt, wie dies der :retab
Fall ist. (Ich bevorzuge es, es manuell anzugeben).
a
in if a:expandtab
bedeuten?
set expandtab
in Ihrer .vimrc und dann haben autocmd BufWritePre * :call Retab(&expandtab)
- Einrückung wird zu Tabulatoren anstelle von Leerzeichen geändert.
Vim stellt einen !retab
Befehl zur Verfügung, der alle Sequenzen von <Tab>
durch neue Leerzeichenfolgen ersetzt, wobei der neue Tabulatorwert (z. B. :set tabstop=2
) verwendet wird. Alle Tabulatoren in Zeichenfolgen können jedoch geändert werden (z. B. in einem C-Programm sollten Sie \t
dies vermeiden).
Alternativ können Sie alle Tabulatoren mit dem folgenden Befehl in Leerzeichen ändern:
:%s/\t/ /g
oder wie von @Shahbaz vorgeschlagen :
:%s/^\t\+/ g
Es werden also nur die im Einzug verwendeten Tabulatoren konvertiert.
Erläuterung:
%
repräsentiert den gesamten Puffer / die gesamte Datei ( :help :%
)s
steht für substitute ( :help sub-replace-special
)\t
, oder ^I
steht für tab
- Verwenden Sie so viele Leerzeichen, wie Sie für eine Registerkarte benötigeng
- steht für global und konvertiert mehrere Tabulatoren in derselben ZeileDann Vertiefung der gesamten Datei zu korrigieren, können Sie versuchen: gg=G. Überprüfen Sie: Weitere Informationen zum erneuten Einrücken von schlecht eingerücktem Code .
Um standardmäßig Leerzeichen anstelle von Tabulatoren zu verwenden, müssen Sie Ihrer .vimrc
Datei die folgenden Einstellungen hinzufügen :
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
Alternative Lösung ist zu verwenden tidy
Verbunden:
%s/^\t\+/ g
so vorgehen, dass nur die Tabulatoren konvertiert werden, die beim Einrücken verwendet werden. Auch gg=G
könnte mit Sprachen wie Python katastrophal sein.
Versuchen Sie es mit:
expand -t 4 input_filename output_filename
expand
ist ein Befehlszeilenprogramm zum Konvertieren von Tabulatoren in Leerzeichen, die Sie aus einer Shell oder mit ausführen können :!expand
.
Es ist in POSIX , sollte also auf den meisten Systemen verfügbar sein. unexpand
wird übrigens das Gegenteil tun.
expand
?
:%!expand -t 4
innerhalb von vim tun . Besser noch, Sie könnten auch die aktuelle Option für die Verschiebebreite verwenden: :exe '%!expand -t ' . &shiftwidth
Der Vollständigkeit =
halber können Sie auch Einrückungen korrigieren, nachdem Sie angegeben haben, dass Tabulatoren durch Leerzeichen ersetzt werden. Im normalen Modus können Sie dies durch Eingabe tun :set expandtab
. Dann =
könnte auf zwei Arten verwendet werden:
=
würde ein einzelnes Einrücken ausgewählter Codeblöcke korrigieren.gg=G
die gesamte Datei repariert, wobei gg
der Cursor an den Anfang der Datei bewegt wird , dann =
angewendet wird und G
der Cursor an das Ende der Datei bewegt wird.Verweis: Link
:h vim-faq
und suchen/tab characters
. Das schwer zu merkende Tag ist:h faq-14.16
.