Vim: Tabulatoren in Leerzeichen ändern

2

Ich weiß, dass diese Frage oft gestellt wurde, aber ich finde keine Lösung für mein Problem, hauptsächlich, weil ich das Problem nicht einmal wirklich identifizieren kann.

Hier ist die Zeitleiste der Ereignisse:

  • öffne alte python datei (geschrieben mit python2.7) - alles ist in ordnung
  • Ändern Sie die Tastenkombinationen, um .py-Dateien mit python3 anstelle von python2.7 auszuführen - wie erwartet, viele IndentErrors, aber die Datei hat immer noch die gleiche Struktur / das gleiche Layout / die gleiche Anzahl von Leerzeichen / Tabulatoren
  • expandtabzu meiner .vimrc-Datei hinzugefügt - jetzt gibt es keine Probleme mehr IndentErrormit Inkonsistenzen, sondern IndentErrorüberall neue, da die Struktur meines Quellcodes jetzt völlig durcheinander ist.
  • Ich entferne expandtabaus meiner .vimrc und bekomme immer noch das Gleiche aus der Quelle heraus, auch wenn ich die Sitzung töte, ganz iTerm, ziehe die Quelle frisch aus Github ... WARUM !?

Um ganz klar zu sein, es gibt nur ZWEI Dinge, die in meinem Vimrc in den letzten Monaten geändert wurden, und beide Änderungen wurden heute Morgen vorgenommen. Das erste war die Neuzuordnung <F9>eines Shell-Befehls für python3 anstelle von 2.7, der sich NICHT auf die Struktur meines Quellcodes auswirkte. Die zweite Änderung war das Hinzufügen, expandtabwodurch alles durcheinander gebracht wurde. Durch das Entfernen expandtabwird meine VIM-Erfahrung nicht wieder so wie vor dem Hinzufügen.

Die strukturellen Änderungen an meiner Quelle sind halbgleichmäßig. Lassen Sie mich also versuchen, zu erklären, was tatsächlich passiert.

Was früher aussah:

class GUI():
    def __init__(self):
        suite of code

sieht jetzt so aus:

class GUI():
    def __init__(self):
    suite of code

und es ist auf der ganzen Linie so für alles, was wie alle verschachtelten Codesuiten aussieht ... mit anderen Worten, die erste Erweiterung von Tabulatoren in 4 Leerzeichen funktioniert einwandfrei, aber anstatt Tabulatoren zu erweitern, die weiter innerhalb des ersten Tabulators verschachtelt sind, sieht es so aus löscht stattdessen nur die Registerkarte.

Es sind noch andere seltsame Dinge im Gange, aber ich kann ein Muster nicht wirklich erkennen.

Irgendwelche Ideen, was los ist?

aweeeezy
quelle
Es sieht so aus, als ob Ihr erster Gedankenstrich vier Leerzeichen und Ihr zweiter Gedankenstrich ein Tabulator war, wobei der Code für eine tabstop8 geschrieben wurde. Vim wird entweder angezeigt oder erweitert, mit der Annahme, dass tabstop=4. Haben Sie die Originalquelle von, bevor Sie die Dateien mit den falschen VIM-Einstellungen bearbeitet haben?
Random832
Hier ist die Quelle: github.com/Aweeeezy/Simulator/blob/master/GUI.py Es ist nicht möglich, dass der Code für a geschrieben wurde, tabstop=8da ich die gleiche .vimrc (with tabstop=4) hatte, bevor ich Python überhaupt kannte.
Aweeeezy
Der Code ist definitiv tabstop=8, ich kann die einzelnen Tabulatoren in den 8-stelligen Einzügen auswählen. Und Python im gemischten Einrückungsmodus behandelt Tabulatoren als acht Leerzeichen. Ich weiß nicht, wie Ihre vim-Konfiguration funktioniert hat, um es vorher zu zeigen.
Random832
Interessant ... Ich muss zwischendurch Tabstop hinzugefügt haben, obwohl ich mich nicht daran erinnere. Trotzdem danke, dass du das Problem eingegrenzt hast. Irgendwelche Ratschläge zur nachträglichen Anpassung des Quellcodes, als ob er tabstop=4stattdessen mit geschrieben worden wäre ? edit: oder soll ich einfach tabstopwieder auf 8 wechseln ?
Aweeeezy
%s/\t/(eight spaces)/g. Sie sollten keine Tabulatoren im Python-Code haben.
Random832

Antworten:

4

Dieses Erscheinungsbild ist normalerweise (und scheint in Ihrem Code der Fall zu sein) ein Symptom für das Betrachten von Code mit 4 Leerzeichen pro Einzug, aber 8-Leerzeichen-Tabulatoren in jeder anderen Zeile (z. B. 4s). 1t, 1t4s, 2t) mit einer tabstopEinstellung von 4.

Für Python-Code sollten Sie einfach alle Tabulatoren im Code durch acht Leerzeichen ersetzen, da der Interpreter dies so behandelte. In der Regel kann man mit Situationen wie dieser umgehen , indem die Verwendung von :retabBefehl nach Einstellung tabstopder Quellcode auf den Wert ursprünglich mit geschrieben wurde, so zB

:set ts=8
:retab 4

Wenn expandtabgesetzt, werden Tabulatoren durch Leerzeichen ersetzt.

Random832
quelle
Perfekt! Vor deiner Bearbeitung habe ich versucht, :set tabstop=8gefolgt von :retab!und das hat die Magie. Nun zur nächsten Ausgabe des Versuchs, meine Pakete von meiner alten Version von Python in die neue zu integrieren: / Ich hätte den Hinweis "Immer mit einer virtuellen Umgebung installieren" vor langer Zeit beachten müssen. Ich verstehe immer noch nicht wirklich, wie das funktioniert.
Aweeeezy