Ändern des Verhaltens von Vim-Einrückungen nach Dateityp

379

Könnte mir jemand in einfachen Worten erklären, wie man das Einrückungsverhalten von Vim basierend auf dem Dateityp am einfachsten ändert? Wenn ich beispielsweise eine Python-Datei öffne, sollte sie mit 2 Leerzeichen eingerückt werden. Wenn ich jedoch ein Powershell-Skript öffne, sollten 4 Leerzeichen verwendet werden.

EBGreen
quelle
9
BTW - PEP8-Konvention für Python besagt, dass der Tabstop 4 Leerzeichen und die Tabulatoren 4 Leerzeichen sein sollten. ref: stackoverflow.com/questions/120926/…
cgseller

Antworten:

304

Sie können .vimDateien hinzufügen , die ausgeführt werden sollen, wenn vim zu einem bestimmten Dateityp wechselt.

Zum Beispiel habe ich eine Datei ~/.vim/after/ftplugin/html.vim mit folgendem Inhalt:

setlocal shiftwidth=2
setlocal tabstop=2

Dies führt dazu, dass vim Registerkarten mit einer Breite von 2 Zeichen zum Einrücken verwendet (die noexpandtabOption ist an anderer Stelle in meiner Konfiguration global festgelegt).

Dies wird hier beschrieben: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , scrollen Sie nach unten zum Abschnitt über Dateityp-Plugins.

SpoonMeiser
quelle
229
Sie sollten das ~/.vim/after/ftplugin/html.vimstattdessen eingeben. Aber wie andere unten ausgeführt haben, ist es viel schöner, nur autocmd FileType html setlocal shiftwidth=2 tabstop=2zu Ihrem hinzuzufügen .vimrc.
Aristoteles Pagaltzis
10
Hoppla, eigentlich ist das / wo / wo ich diese Datei habe. Ich werde die Antwort korrigieren. Ich bin jedoch anderer Meinung. Ich denke, dass das Aufteilen von Befehlen für verschiedene Dateitypen in separate Dateien alles viel einfacher macht, insbesondere wenn Sie Anforderungen für viele Dateitypen oder viele Optionen für einige Dateitypen haben.
SpoonMeiser
3
Eigentlich gibt es nicht viel Grund, das After-Verzeichnis für ftplugins zu verwenden. Vim lädt alle gefundenen Dateien in Ihren Laufzeitpfad, nicht nur die ersten wie bei Syntaxdateien.
Graywh
36
Zu Ihrer Information: Verwenden Sie js nicht für den Javascript-Dateityp. Verwenden Sie stattdessen Javascript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo
13
Sie müssen auch filetype plugin onzu Ihrem vimrc hinzufügen .
Gatoatigrado
191

Verwenden Sie ftplugins oder automatische Befehle, um Optionen festzulegen.

ftplugin

Im ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

Und vergessen Sie nicht, sie einzuschalten ~/.vimrc:

filetype plugin indent on

( :h ftpluginfür weitere Informationen)

Autocommand

In ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Sie können mit ihren kurzen Versionen jeder der langen Befehle oder Einstellungen ersetzen:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Ich würde auch vorschlagen, den Unterschied zwischen tabstopund zu lernen softtabstop. Viele Leute wissen nichts darüber softtabstop.

greywh
quelle
1
Vielen Dank! Danke auch für das bisschen über 'ts' und 'sts'. Gibt es bestimmte Seiten, die Sie empfehlen würden, um diesen Unterschied zu diskutieren und wie man ihn verwendet?
Jvriesem
11
@jvriesem Es gibt nicht viel zu tun: 'ts' ist, wie Tabulatorzeichen angezeigt werden; 'sts' gibt an, wie viele "Leerzeichen" beim Drücken der Tabulatortaste eingefügt werden sollen. 'sw' gibt an, wie viele "Leerzeichen" pro Einrückungsstufe verwendet werden sollen. 'et' gibt an, ob Leerzeichen oder Tabulatoren verwendet werden sollen. Mit 'sta' können Sie 'sw' "Leerzeichen" einfügen, wenn Sie am Anfang einer Zeile die Tabulatortaste drücken.
Graywh
10
Ich frage mich, ob es aus Gründen der Klarheit besser wäre, die vollständigen Formulare zu verwenden, als den kurzen Satz am Ende.
Eiswasser
23
swist kurz für softwidth, stsist kurz für softtabstop, etist kurz für expandtab, setlist kurz für setlocalund auist kurz für autocmd. Sie können die langen Formulare anstelle der kurzen Formulare verwenden.
Flimm
13
Ich glaube eher swerweitert shiftwidthals softwidth.
Johncip
83

Bearbeiten Sie Ihre ~/.vimrcund fügen Sie verschiedene Dateitypen für verschiedene Einrückungen hinzu, z. B. Ich möchte html/rbEinrückungen für 2 Leerzeichen und js/coffeeEinrückungen von Dateien für 4 Leerzeichen:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

Siehe : Festlegen der Vim-Leerzeicheneinstellungen nach Dateityp

Siwei Shen 申思维
quelle
Kommentar für vimrc ist single ":)
sdkks
@sdkks Das glaube ich nicht. doppeltes Anführungszeichen ist Kommentar, einfaches Anführungszeichen 'gibt Fehler auf allen vim meines Linux. (7.3+, 8.0 ...)
Siwei Shen 申思维
Ja. Mein Kommentar besagt, dass Sie eine einzelne verwenden ", dh nicht mit einer anderen schließen ". Ich bin mir nicht sicher, warum ich das kommentiert habe.
SDKKS
ok, ich habe dich falsch verstanden Ich '""
denke,
60

Fügen Sie autocmd-Befehle basierend auf dem Dateisuffix in Ihr ~ / .vimrc ein

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Die Befehle, nach denen Sie suchen, sind wahrscheinlich ts = und sw =

Paul Tomblin
quelle
18
Was ist der Vorteil davon gegenüber FileType?
Casey Chow
3
Gibt es eine Möglichkeit, das Match umzukehren?
SystemParadox
7
Ich hatte Probleme, Dateitypen mit HTML-Dateien zum Laufen zu bringen (da die HTML-Datei nicht wirklich HTML ist, sondern eine HTML-Vorlagendatei mit einer Vorlagensprache). Dateitypen scheinen es nicht als HTML zu erkennen, aber diese Methode wird es.
Mark Hildreth
3
@digitxp - Der Vorteil besteht darin, dass Ihre verwendete Erweiterung nicht mit einem definierten "Dateityp" übereinstimmt. In meiner Installation bedeutet * .md beispielsweise einen Dateityp von Modula2, während ich ihn für das Markdown verwende. Ich könnte (a) die Standardeinstellungen für den Dateityp ändern (b) die Einstellungen für den Dateityp mit einer benutzerdefinierten Konfiguration ändern oder (c) mithilfe dieser Einstellung in meiner 1 .vimrc-Datei, die ich mit (c) erstellt habe, schnell das erreichen, was ich möchte.
pdwalker
Es sei darauf hingewiesen, dass Sie - vorausgesetzt, mein schnelles Lesen der Dokumente ist korrekt - auf diese Weise mehrere Befehle pro Dateityp hinzufügen können und diese garantiert in der angegebenen Reihenfolge ausgeführt werden.
underscore_d
23

Normalerweise arbeite ich mit expandtabSet, aber das ist schlecht für Makefiles. Ich habe kürzlich hinzugefügt:

:autocmd FileType make set noexpandtab

bis zum Ende meiner .vimrc-Datei und es erkennt Makefile, makefile und * .mk als Makefiles und erweitert keine Registerkarten. Vermutlich können Sie dies erweitern.

Jonathan Leffler
quelle
Die bessere Option ist zu aktivieren: Dateityp-Plugins. Die Standardeinstellung für Vim ist: setl noet, sodass Sie diese aucmd nicht einmal in Ihrem vimrc benötigen.
Graywh
OK. Können Sie die Vorteile erklären und was damit verbunden ist? Warum sind Dateityp-Plugins besser als Autocmd? Wann sollte autocmd verwendet werden? Nicht benutzt?
Jonathan Leffler
5
Die mit Vim gelieferten Dateityp-Plugins können hilfreiche Dinge wie "setlocal noexpandtab" für Makefiles ausführen. Autocommands vs ftplugins für persönliche Dinge wie Shiftwidth spielen keine Rolle - es ist nur so, wie Sie Ihre vim-Konfiguration strukturieren.
Graywh
17

Persönlich verwende ich diese Einstellungen in .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
Nello
quelle
22
Viele Sprachen haben seit langem Konventionen etabliert, ebenso wie bestimmte Unternehmen. Nehmen Sie NodeJS als Beispiel für das erstere. Tabulatoren sollten aus zwei Leerzeichen bestehen. Kopfschmerzen und ziemlich albern, aber wichtig.
Paul Hazen
3
Warum sollten Tabs unter allen Umständen gleich sein müssen? Bei einer Konfigurationsdatei funktionieren 8 Leerzeichen-Registerkarten einwandfrei, bei Code mit vielen Einrückungen ist 2 jedoch viel einfacher zu verwalten. Und dann gibt es feste Konventionen: node.js sollte 2 Leerzeichen haben, und Python ist mit etwas anderem als 4 Leerzeichen syntaktisch ungültig.
Felixphew
1
@felixphew Python ist mit einer beliebigen Anzahl von Leerzeichen (oder sogar Tabulatoren) vollkommen korrekt, solange es den ganzen Weg über gleich bleibt.
James
@DJMcMayhem Du hast recht - ich hätte sagen sollen "dringend empfehlen".
Felixphew
1
+1 nach Nello. Das Tabulatorzeichen hat eine lange Tradition darin, einen Sprung zur nächsten Position mit einem Vielfachen von 8 Zeichen zu bedeuten. Dies liegt nur daran, dass die Benutzer Tabulatoren für "den nächsten Einzug, der in meiner Sprache gut aussieht" verwenden wollten und dass einige Texteditoren nicht den Unterschied zwischen "Hinzufügen eines Tabulatorzeichens" und "Hinzufügen von Leerzeichen zum Einrücken" und Personen machten hat ihren Editor so angepasst, dass es jetzt so ist, dass wir jetzt dieses Durcheinander haben, bei dem Registerkarten niemals die beabsichtigte Art und Weise anzeigen. Der Quellcode ist Text und der Standard für Text sind Registerkarten mit 8 Zeichen.
Florian F
6

Dies mag den meisten von uns bekannt sein, aber trotzdem (ich war das erste Mal verwirrt): Wenn Sie :set et( :setexpandtabs) ausführen, werden die bereits in der Datei vorhandenen Registerkarten nicht geändert :retab. Zum Beispiel:

:set et
:retab

und die Registerkarten in der Datei werden durch genügend Leerzeichen ersetzt. Um Tabs zurück zu haben, gehen Sie einfach wie folgt vor:

:set noet
:retab
Juan Lanus
quelle
4

Heute können Sie editorconfig ausprobieren , es gibt auch ein vim-Plugin dafür. Auf diese Weise können Sie nicht nur die Einrückungsgröße in vim ändern, sondern in vielen anderen Editoren konsistente Codierungsstile beibehalten.

Im Folgenden finden Sie eine einfache Editor-Konfiguration. Wie Sie sehen können, haben die Python-Dateien 4 Leerzeichen zum Einrücken und die Mops-Vorlagendateien nur 2.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2
Chengbo
quelle
3

Während Sie den Einzug von Vim mit dem Einrückungs-Plugin oder manuell mithilfe der Einstellungen konfigurieren können, empfehle ich die Verwendung eines Python-Skripts namens Vindect , das beim Öffnen einer Python-Datei automatisch die relevanten Einstellungen für Sie festlegt. Verwenden Sie diesen Tipp , um die Verwendung von Vindect noch effektiver zu gestalten. Als ich anfing, Python-Dateien zu bearbeiten, die von anderen mit verschiedenen Einrückungsstilen (Tabulator gegen Leerzeichen und Anzahl der Leerzeichen) erstellt wurden, war das unglaublich frustrierend. Aber Vindect zusammen mit dieser Einrückungsdatei

Empfehlen Sie auch:

haridsv
quelle
2

Für Benutzer autocmdist es eine bewährte Methode, diese zu gruppieren. Wenn sich eine Gruppierung auf die Dateityperkennung bezieht, haben Sie möglicherweise Folgendes:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Gruppierungen helfen dabei, die .vimrcOrganisation aufrechtzuerhalten , insbesondere wenn einem Dateityp mehrere Regeln zugeordnet sind. Im obigen Beispiel wird eine Kommentarverknüpfung für .c-Dateien definiert.

Der erste Aufruf von autocmd!weist vim an, alle zuvor definierten Autobefehle in dieser Gruppierung zu löschen. Dies verhindert eine doppelte Definition, wenn .vimrcerneut eine Quelle gefunden wird. Siehe :help augroupfür weitere Informationen.

67 Hz
quelle
1

Ich benutze ein Dienstprogramm, das ich in C geschrieben habe autotab. Er analysiert die ersten paar tausend Zeilen einer Datei , die Sie Werte für die Vim Parameter laden und bestimmt shiftwidth, tabstopund expandtab.

Dies wird zum Beispiel kompiliert mit gcc -O autotab.c -o autotab. Anweisungen zur Integration in Vim finden Sie in der Kommentarüberschrift oben.

Autotab ist ziemlich clever, kann aber von Zeit zu Zeit verwirrt werden, insbesondere dadurch, dass es uneinheitlich mit verschiedenen Einrückungsstilen gepflegt wurde.

Wenn in einer Datei offensichtlich Tabulatoren oder eine Kombination aus Tabulatoren und Leerzeichen zum Einrücken verwendet werden, ermittelt Autotab anhand von Faktoren wie der Ausrichtung interner Elemente über aufeinanderfolgende Zeilen, wie z. B. Kommentare, welche Registerkartengröße verwendet wird.

Es funktioniert für eine Vielzahl von Programmiersprachen und verzeiht "Out-of-Band" -Elemente, die Einrückungsinkrementen nicht entsprechen, wie C-Vorverarbeitungsanweisungen, C-Anweisungsbezeichnungen, ganz zu schweigen von den offensichtlichen Leerzeilen.

Kaz
quelle