Modification du comportement d'indentation de Vim par type de fichier

379

Quelqu'un pourrait-il m'expliquer en termes simples la manière la plus simple de modifier le comportement d'indentation de Vim en fonction du type de fichier? Par exemple, si j'ouvre un fichier Python, il doit indenter avec 2 espaces, mais si j'ouvre un script Powershell, il doit utiliser 4 espaces.

EBGreen
la source
9
BTW - La convention PEP8 pour Python dit que le tabstop doit être de 4 espaces et les tabulations doivent être de 4 espaces. ref: stackoverflow.com/questions/120926/…
cgseller

Réponses:

304

Vous pouvez ajouter des .vimfichiers à exécuter chaque fois que vim bascule vers un type de fichier particulier.

Par exemple, j'ai un fichier ~/.vim/after/ftplugin/html.vim avec ce contenu:

setlocal shiftwidth=2
setlocal tabstop=2

Ce qui fait que vim utilise des onglets d'une largeur de 2 caractères pour l'indentation (l' noexpandtaboption est définie globalement ailleurs dans ma configuration).

Ceci est décrit ici: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , faites défiler jusqu'à la section sur les plugins de type de fichier.

SpoonMeiser
la source
229
Vous devriez mettre cela à la ~/.vim/after/ftplugin/html.vimplace. Mais comme d'autres l'ont souligné ci-dessous, il est beaucoup plus agréable d'ajouter simplement autocmd FileType html setlocal shiftwidth=2 tabstop=2à votre .vimrc.
Aristote Pagaltzis
10
Oups, en fait, c'est / est / où j'ai ce fichier. Je vais fixer la réponse. Je ne suis pas d'accord cependant, je pense que séparer les commandes de différents types de fichiers en fichiers séparés rend tout beaucoup plus facile, surtout si vous avez des exigences pour de nombreux types de fichiers, ou beaucoup d'options pour certains types de fichiers.
SpoonMeiser
3
En fait, il n'y a pas beaucoup de raisons d'utiliser le répertoire after pour ftplugins. Vim les chargera tous dans votre runtimepath, pas seulement les premiers comme pour les fichiers de syntaxe.
graywh
36
Pour info: n'utilisez pas js pour le type de fichier javascript. Utilisez plutôt javascript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo
13
Vous devez également ajouter filetype plugin onà votre vimrc.
gatoatigrado
191

Utilisez des plugins ou des autocommandes pour définir les options.

ftplugin

Dans ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

Et n'oubliez pas de les activer en ~/.vimrc:

filetype plugin indent on

( :h ftpluginpour plus d'informations)

autocommande

Dans ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Vous pouvez remplacer l' une des longues commandes ou réglages avec leurs versions courtes:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Je suggère également d'apprendre la différence entre tabstopet softtabstop. Beaucoup de gens ne le savent pas softtabstop.

graywh
la source
1
Merci! Merci aussi pour ce petit bout de "ts" et "sts". Y a-t-il des pages particulières que vous recommanderiez pour discuter de cette différence et comment l'utiliser?
jvriesem
11
@jvriesem Il n'y a pas grand-chose: «ts» est la façon dont les caractères de tabulation sont affichés; 'sts' est le nombre d '"espaces" à insérer lorsque vous appuyez sur la touche de tabulation; 'sw' est le nombre d '"espaces" à utiliser par niveau de retrait; «et» indique s'il faut utiliser des espaces ou des tabulations; 'sta' vous permet d'insérer des 'espaces' sw 'lorsque vous appuyez sur tab au début d'une ligne.
graywh
10
Je me demande si les formes complètes seraient mieux utilisées, pour plus de clarté, plutôt que la phrase brève à la fin.
icedwater
23
swest l'abréviation de softwidth, l' stsabréviation de softtabstop, l' etabréviation de expandtab, l' setlabréviation de setlocalet l' auabréviation de autocmd. Vous pouvez utiliser les formulaires longs au lieu des formulaires courts.
Flimm
13
Je crois que se swdéveloppe shiftwidthplutôt que softwidth.
johncip
83

éditez votre ~/.vimrc, et ajoutez différents types de fichiers pour différents retraits, par exemple, je veux un html/rbretrait pour 2 espaces et des js/coffeefichiers en retrait pour 4 espaces:

" 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

voir: Définition des préférences d'espaces Vim par type de fichier

Siwei Shen 申思维
la source
Le commentaire pour vimrc est unique ":)
sdkks
@sdkks Je ne pense pas. le guillemet double est un commentaire, le guillemet simple 'donne une erreur sur tous les vim de mon Linux. (7.3+, 8.0 ...)
Siwei Shen 申思维
Ouais. Mon commentaire dit d'utiliser un seul ", ce qui signifie de ne pas le fermer avec un autre ". Je ne sais pas pourquoi j'ai commenté cela cependant.
sdkks
ok, je vous ai mal compris. Je pense que les guillemets simples signifient 'mais pas gauche "sans droite " @. @
Siwei Shen 申思维
60

Mettez les commandes autocmd basées sur le suffixe du fichier dans votre ~ / .vimrc

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

Les commandes que vous recherchez sont probablement ts = et sw =

Paul Tomblin
la source
18
Quel est l'avantage de cela FileType?
Casey Chow
3
Y a-t-il un moyen d'inverser le match?
SystemParadox
7
J'ai eu des problèmes pour que les types de fichiers fonctionnent avec les fichiers html (car le fichier .html n'est pas vraiment HTML, mais un fichier HTML de modèle avec un langage de template). Les types de fichiers ne semblent pas le reconnaître en html, mais cette méthode le fera.
Mark Hildreth
3
@digitxp - l'avantage est lorsque votre extension utilisée ne correspond pas à un "FileType" défini. Par exemple, dans mon installation, * .md signifie un type de fichier de Modula2 alors que je l'utilise pour le démarquage. Je pourrais (a) modifier les paramètres FileType par défaut (b) modifier les paramètres de type de fichier avec une configuration personnalisée ou (c) obtenir rapidement ce que je veux en utilisant ce paramètre dans mon fichier 1 .vimrc avec lequel je suis allé (c).
pdwalker
Il vaut la peine de souligner que - en supposant que ma lecture rapide des documents est correcte - vous pouvez ajouter plusieurs commandes par type de fichier (s) de cette façon, et elles sont garanties d'être exécutées dans l'ordre donné.
underscore_d
23

Je travaille généralement avec expandtabset, mais c'est mauvais pour les makefiles. J'ai récemment ajouté:

:autocmd FileType make set noexpandtab

à la fin de mon fichier .vimrc et il reconnaît Makefile, makefile et * .mk comme makefiles et ne développe pas les onglets. Vraisemblablement, vous pouvez prolonger cela.

Jonathan Leffler
la source
La meilleure option est d'activer: les plugins de type de fichier. Le paramètre par défaut pour Vim comprend: setl noet, vous n'avez donc même pas besoin de cet aucmd dans votre vimrc.
graywh
D'ACCORD. Pouvez-vous expliquer les avantages de cela et ce que cela implique? Pourquoi les plugins de type de fichier sont-ils meilleurs qu'autocmd? Quand faut-il utiliser autocmd? Non utilisé?
Jonathan Leffler
5
Les plugins de type de fichier fournis avec Vim feront des choses utiles comme "setlocal noexpandtab" pour les makefiles, par exemple. Les autocommandes vs ftplugins pour des choses personnelles comme shiftwidth n'ont pas d'importance - c'est juste la façon dont vous choisissez de structurer votre configuration vim.
graywh
17

Personnellement, j'utilise ces paramètres dans .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
Nello
la source
22
De nombreuses langues ont depuis longtemps établi des conventions, tout comme certaines entreprises. Prenez NodeJS comme exemple du premier. Les tabulations doivent comporter deux espaces. Maux de tête, et assez stupide, mais important.
Paul Hazen
3
Pourquoi les onglets devraient-ils être identiques en toutes circonstances? Pour un fichier de configuration, 8 onglets d'espace fonctionnent correctement, mais pour le code avec de nombreux retraits, 2 sont beaucoup plus faciles à gérer. Et puis il y a des conventions fixes: node.js devrait avoir 2 onglets d'espace, et python est en fait syntaxiquement invalide avec autre chose que 4 onglets d'espace.
felixphew
1
@felixphew Python est parfaitement correct avec n'importe quel nombre d'espaces (ou même d'onglets) tant qu'il reste le même tout au long.
James
@DJMcMayhem Vous avez raison - j'aurais dû dire "recommande fortement".
felixphew
1
+1 à Nello. Le caractère de tabulation a une longue tradition de signifier un saut à la position suivante à un multiple de 8 caractères. C'est seulement parce que les gens voulaient utiliser tab pour "le prochain retrait qui semble bon dans ma langue" et parce que certains éditeurs de texte ne se donnaient pas la peine de faire la différence entre "ajouter un caractère de tabulation" et "ajouter des espaces pour le retrait", et les gens ajusté leur éditeur pour l'avoir à leur façon, que nous avons maintenant ce gâchis où les onglets ne montrent jamais la manière voulue. Le code source est du texte et la norme pour le texte est des tabulations à 8 caractères.
Florian F
6

Cela peut être connu de la plupart d'entre nous, mais de toute façon (j'ai été perplexe ma première fois): Faire :set et( :setexpandtabs) ne change pas les onglets déjà existants dans le fichier, il faut le faire :retab. Par exemple:

:set et
:retab

et les tabulations du fichier sont remplacées par suffisamment d'espaces. Pour récupérer les onglets, faites simplement:

:set noet
:retab
Juan Lanus
la source
4

Aujourd'hui, vous pouvez essayer editorconfig , il existe également un plugin vim pour cela. Avec cela, vous pouvez non seulement modifier la taille de l'indentation dans vim, mais dans de nombreux autres éditeurs, conserver des styles de codage cohérents.

Vous trouverez ci-dessous une simple configuration de l'éditeur, comme vous pouvez le voir, les fichiers python auront 4 espaces pour l'indentation et les fichiers de modèle de pug n'en auront que 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
la source
3

Bien que vous puissiez très bien configurer l'indentation de Vim à l'aide du plug-in d'indentation ou manuellement à l'aide des paramètres, je recommande d'utiliser un script python appelé Vindect qui définit automatiquement les paramètres pertinents pour vous lorsque vous ouvrez un fichier python. Utilisez cette astuce pour rendre l'utilisation de Vindect encore plus efficace. Quand j'ai commencé à éditer des fichiers python créés par d'autres avec différents styles d'indentation (tabulation vs espace et nombre d'espaces), c'était incroyablement frustrant. Mais Vindect avec ce fichier d'indentation

Recommande également:

haridsv
la source
2

Pour ceux qui utilisent autocmd, il est préférable de les regrouper. Si un regroupement est lié à la détection de type de fichier, vous pourriez avoir quelque chose comme ceci:

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

Les regroupements aident à conserver l' .vimrcorganisation, en particulier lorsqu'un type de fichier est associé à plusieurs règles. Dans l'exemple ci-dessus, un raccourci de commentaire spécifique aux fichiers .c est défini.

L'appel initial à autocmd!indique à vim de supprimer toutes les commandes automatiques précédemment définies dans ledit groupement. Cela empêchera la définition en double si elle .vimrcprovient à nouveau. Voir le :help augrouppour plus d'informations.

67hz
la source
1

J'utilise un utilitaire que j'ai écrit en C appelé autotab. Il analyse les quelques milliers de premières lignes d'un fichier que vous chargez et détermine les valeurs des paramètres Vim shiftwidth, tabstopet expandtab.

Ceci est compilé en utilisant, par exemple, gcc -O autotab.c -o autotab. Les instructions pour l'intégration avec Vim sont dans l'en-tête de commentaire en haut.

Autotab est assez intelligent, mais peut être confus de temps en temps, en particulier par le fait qu'il a été maintenu de manière incohérente en utilisant différents styles d'indentation.

Si un fichier utilise évidemment des tabulations, ou une combinaison de tabulations et d'espaces, pour l'indentation, Autotab déterminera quelle taille de tabulation est utilisée en considérant des facteurs comme l'alignement des éléments internes sur des lignes successives, tels que les commentaires.

Il fonctionne pour une variété de langages de programmation et pardonne les éléments "hors bande" qui n'obéissent pas aux incréments d'indentation, tels que les directives de prétraitement C, les étiquettes d'instructions C, sans parler des lignes vides évidentes.

Kaz
la source