2015-03-23 16 views
7

Ich habe bereits eine Reihe von Fragen und Antworten lesen:Vim: Einrücken mit Tabulatoren, richten mit Leerzeichen

Aber keiner von ihnen bietet eine Lösung für mich.

Ich möchte wirklich das "Indent with tabs, align with spaces" -Prinzip anwenden, aber wenn es um die automatische Einrückung geht, konnte ich Vim nicht beibringen, wie man das richtig macht.

den Code Betrachten wir unter der Annahme tabstops == 3, shiftwidth == 3

(>-- bedeutet Registerkarte und . (ein Punkt) bedeutet Raum):

{ 
>--long a = 1, 
>-->--..b = 2, 
>-->--..c = 3; 
} 

Also, es mit Tabs so viel wie möglich Einzüge und füllt dann den Rest mit Leerzeichen. Aber es ist tatsächlich ein sehr schlechter Ansatz: Wenn jemand diesen Code mit anderen Tab-Größe lesen wird, wird der Code durcheinander gebracht. Hier, wie es mit Tab-Größe gleich 8 Zeichen aussehen wird:

{ 
>-------long a = 1, 
>------->-------..b = 2, 
>------->-------..c = 3; 
} 

Es ist schrecklich. Das Problem ist, dass Vim nicht zwischen Einrückung und Ausrichtung unterscheidet.

Um es richtig aussehen mit dem, was der Registerkarte Größe ist, sollte der Code auf diese Weise eingerückt werden:

{ 
>--long a = 1, 
>--.....b = 2, 
>--.....c = 3; 
} 

Dann wird dieser Code schön aussehen, was die Registerkarte Größe. Zum Beispiel 8 Zeichen:

{ 
>-------long a = 1, 
>-------.....b = 2, 
>-------.....c = 3; 
} 

Wie erreicht man dies?

+0

Vielleicht würde das Plugin Tabular geben Sie, was Sie suchen? https://github.com/godlygeek/tabular – Zach

Antwort

3

Die beste Möglichkeit, das Einrücken in Vim zu beeinflussen, ist über 'indentexpr'. Aus :help:

Der Ausdruck muss die Anzahl der Leerzeichen im Einzug zurückgeben. Es kann "-1" zurückgeben, um den aktuellen Einzug beizubehalten (das bedeutet, dass "autoindent" für den Einzug verwendet wird).

Da dies gibt die Zahl von Räumen, nicht den gerenderte Einzug selbst und Vim nur so weit unterstützt tab-, platz- oder Maximalanzahl-Tab-gefolgt-by-Räume (genannt softtabstop), dies ist nicht möglich.

Also, wenn Sie wirklich diese Einrückungsmethode verwenden möchten (ich persönlich mag es für seine Reinheit und Eleganz auch! (Aber ich verwende es nicht)), müssen Sie die automatische Einrückung und automatische formatieren und die ganzen Sachen manuell selber machen, leider.

+0

Ah, es ist schade. Vielen Dank. Wahrscheinlich werde ich versuchen, in die Mailingliste von Vim zu schreiben und mich mit NeoVim-Entwicklern in Verbindung zu setzen. Wahrscheinlich wird diese Funktion in Zukunft erscheinen. –

+0

Wenn Sie nicht einen vollständigen Patch entwickeln und einreichen, müssen Sie sehr geduldig sein, um Vim zu bekommen ; Die Todo-Liste ist leider endlos lang. –

0

Wie bereits erwähnt, kann vim nicht unterscheiden, ob Sie die Tabulatortaste drücken oder Text abgleichen möchten. Es ist also nicht möglich, das gewünschte Verhalten zu automatisieren.

Nächstes, was Sie tun können, ist zu versuchen, mit softtabstop und unterschiedlichen Werten für tabstop zu spielen, aber diese Weise können Sie das Gegenteil von dem, was Sie gefragt: eine Lasche gedrückt wird, so viele Räume possibile einzufügen, bevor Sie eine Registerkarte.

Wenn Sie möchten, dass Ihr Code immer wie gewünscht aussieht, können Sie versuchen, expandtab direkt zu setzen.

Spaces sehen immer gleich, so

{ 
.........long a = 1, 
..............b = 2, 
..............c = 3; 
} 

ist, wie Ihr Code wird immer angezeigt.

+0

Es geht nicht um "Drücken Tab", es ist über ** Auto ** - Einzug. Es gibt eindeutig ** eine Möglichkeit, zwischen Ausrichtung und Einrückung zu unterscheiden, aber Vim macht das nicht. Zum softtabstop, danke für den Vorschlag, aber ich mag diesen Ansatz nicht. –

+0

Wie zu erweitern, es macht Vim nie Tabs verwenden (nur Leerzeichen einfügen). Dies ist der Ansatz, den ich heutzutage in meinen Projekten verwende, aber das ist nicht das, was ich in meiner Frage erreichen möchte. –

+0

Ich habe es nur für den Fall herausgestellt, da das, wonach Sie gefragt haben, nicht erreicht werden kann und Leerzeichen ein einfacher Weg sind, den Code unabhängig von Einrückung und Ausrichtung zu behalten, und dies war eines Ihrer Hauptanliegen. –

Verwandte Themen