it-swarm.com.de

Wie kann ich Leerzeichen in Tabs in Vim oder Linux konvertieren?

Ich habe einige Fragen zum Stack-Überlauf behandelt, um zu sehen, wie Leerzeichen in Tabulatoren umgewandelt werden, ohne das zu finden, was ich brauche. Es scheint mehr Fragen zu geben, wie man Tabulatoren in Leerzeichen umwandelt, aber ich versuche das Gegenteil.

In Vim habe ich :retab und :retab! ohne Glück ausprobiert, aber ich glaube, diese sind eigentlich für das Wechseln von Tabs zu Leerzeichen.

Ich habe sowohl expand als auch unexpand an der Eingabeaufforderung ohne Erfolg ausprobiert.

Hier ist die betreffende Datei:

http://gdata-python-client.googlecode.com/hg-history/a9ed9edefd61a0ba0e18c43e448472051821003a/samples/docs/docs_v3_example.py

Wie kann ich leading Leerzeichen in Tabulatoren konvertieren, indem Sie entweder Vim oder die Shell verwenden?

156
cwd

Wenn Sie Vim verwenden, um alle führenden Leerzeichen (breiter als 'tabstop' ) zu erweitern, haben Sie zu Recht retab verwendet. aber stelle zuerst sicher, dass 'expandtab' zurückgesetzt wird (_:verbose set ts? et?_ ist dein Freund). retab nimmt einen Bereich an, daher gebe ich normalerweise % an, um "die gesamte Datei" zu bedeuten.

_:set tabstop=2      " To match the sample file
:set noexpandtab    " Use tabs, not spaces
:%retab!            " Retabulate the whole file
_

Bevor ich so etwas mache (besonders mit Python Dateien!), Setze ich normalerweise 'list' , damit ich sehen kann das Leerzeichen und ändern.

Ich habe das folgende Mapping in mein _.vimrc_ dafür:

_nnoremap    <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>
_
281
Johnsyweb

1 - Wenn Sie Leerzeichen haben und Registerkarten wünschen.

Zunächst müssen Sie entscheiden, wie viele Leerzeichen eine einzige Registerkarte haben soll. Angenommen, Sie haben Zeilen mit führenden 4 Leerzeichen oder 8 ... Dann erkennen Sie, dass ein Tab wahrscheinlich 4 Leerzeichen sein soll. Jetzt mit dieser Info machst du:

:set ts=4
:set noet
:%retab!

Hier gibt es ein Problem! Diese Befehlsfolge sucht nach Ihrem gesamten Text und nicht nur nach Leerzeichen am Zeilenanfang. Das bedeutet eine Zeichenfolge wie: "Hey,␣this␣␣␣␣is␣4␣spaces" wird "Hey,␣this⇥is␣4␣spaces", aber es ist nicht! Es ist ein Tab !.

Um dieses kleine Problem zu lösen, empfehle ich eine search anstelle von retab.

:%s/^\(^I*\)␣␣␣␣/\1^I/g

Bei dieser Suche wird in der gesamten Datei nach allen Zeilen gesucht, die mit der Anzahl der Tabulatoren beginnen, gefolgt von 4 Leerzeichen, und sie durch jede Tabulatortaste plus eine ersetzen.

Das wird leider nicht sofort laufen!

Zuerst enthält die Datei Zeilen, die mit Leerzeichen beginnen. Die Suche wandelt dann nur die ersten 4 Leerzeichen in einen Tabulator um und lässt folgendes ...

Sie müssen den Befehl wiederholen. Wie oft? Bis Sie einen pattern not found erhalten. Ich kann mir noch keinen Weg vorstellen, den Prozess zu automatisieren. Aber wenn Sie es tun:

`[email protected]:`

Sie sind wahrscheinlich fertig. Dieser Befehl wiederholt die letzte Suche/Ersetzung zehnmal. Es ist nicht wahrscheinlich, dass Ihr Programm so viele Einrückungen hat. Wenn ja, wiederholen Sie einfach noch einmal @@.

Nun, nur um die Antwort zu vervollständigen. Ich weiß, dass Sie nach dem Gegenteil gefragt haben, aber Sie wissen nie, wann Sie Dinge ungeschehen machen müssen.

2 - Sie haben Registerkarten und möchten Leerzeichen.

Entscheiden Sie zunächst, in wie viele Leerzeichen Ihre Registerkarten konvertiert werden sollen. Nehmen wir an, Sie möchten, dass jeder Tab 2 Leerzeichen enthält. Sie machen dann:

:set ts=2
:set et
:%retab!

Dies hätte das gleiche Problem mit Strings. Da es jedoch ein besserer Programmierstil ist, keine harten Tabs innerhalb von Strings zu verwenden, tun Sie hier wirklich eine gute Sache. Wenn Sie wirklich einen Tab innerhalb eines Strings benötigen, verwenden Sie \t.

28
Dr Beco
:%s/\(^\s*\)\@<=    /\t/g

Übersetzung: Suchen Sie nach jeder Instanz von 4 aufeinanderfolgenden Leerzeichen (nach dem = -Zeichen), jedoch nur, wenn die gesamte Zeile bis zu diesem Punkt Leerraum ist (dies verwendet die Look-Behind-Assertion mit der Breite \@<=). Ersetzen Sie jede gefundene Instanz durch ein Tabulatorzeichen.

11

Ändert alle Leerzeichen in tab:%s/\s/\t/g

3
murat budak

Wenn Sie GNU coreutils installiert haben, ziehen Sie %!unexpand --first-only in Betracht oder berücksichtigen Sie bei Tabulatoren mit 4 Leerzeichen %!unexpand -t 4 --first-only (--first-only ist nur für den Fall vorhanden, dass Sie versehentlich unexpand mit --all aufgerufen haben).

Beachten Sie, dass hierdurch nur die Leerzeichen vor den vorgeschriebenen Tabulatoren ersetzt werden. nicht die darauf folgenden Leerzeichen; Sie werden in vim keinen visuellen Unterschied feststellen, es sei denn, Sie zeigen Tabulatoren wörtlicher an. Zum Beispiel enthält mein ~/.vimrcset list listchars=tab:▸┈ (Ich vermute, aus diesem Grund haben Sie gedacht, dass unexpand nicht funktioniert hat).

0
Adam Katz

Bash-Snippet zum Ersetzen von 4 - Leerzeichen (es gibt zwei {4} im Skript) mit Registerkarten in allen .py-Dateien im Ordner ./app (rekursiv)

find ./app -iname '*.py' -type f \
    -exec awk -i inplace \
    '{ match($0, /^(( {4})*)(.*?)$/, arr); gsub(/ {4}/, "\t", arr[1]) }; { print arr[1] arr[3] }' {} \; 

Ändert keine 4 Felder in der Mitte oder am Ende.

Wurde unter Ubuntu 16.0x und Linux Mint 18 getestet

0
maxkoryukov

In meinem Fall hatte ich mehrere Leerzeichen (Felder wurden durch ein oder mehrere Leerzeichen getrennt), die ich durch eine Registerkarte ersetzen wollte. Folgendes hat es getan: 

:% s/\s\+/\t/g
0
zee