1440 votes

Touche Tab == 4 espaces et retour automatique après les accolades dans Vim

Comment puis-je faire vi - Vim n'utilise jamais de tabulations (conversion d'espaces en tabulations, mauvais !), rend la touche de tabulation == 4 espaces, et indente automatiquement le code après des blocs d'accolades comme Emacs fait ?

En outre, comment puis-je enregistrer ces paramètres pour ne plus avoir à les saisir à nouveau ?

J'ai vu d'autres questions liées à ce sujet, mais elles semblent toujours un peu éloignées de ce que je veux.

3 votes

2161voto

Ken Points 23619

Comme cela a été indiqué dans quelques autres réponses, la méthode préférée aujourd'hui n'est PAS d'utiliser le smartindent, mais plutôt d'utiliser ce qui suit (dans votre fichier de configuration) .vimrc ) :

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

~~Dans votre fichier [.vimrc :][1] :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Il faut un peu de temps pour s'habituer aux fichiers d'aide, mais plus vous lisez, plus Vim s'améliore :

:help smartindent

Mieux encore, vous pouvez intégrer ces paramètres dans votre source pour en assurer la portabilité :

:help auto-setting

Pour voir vos paramètres actuels :

:set all

Comme graywh fait remarquer dans les commentaires, le smartindent a été remplacé par le cindent qui "fonctionne de manière plus intelligente", même s'il reste principalement destiné aux langages dont la syntaxe est proche de celle du C :

:help C-indenting~~

0 votes

Merci - le nom smartindent était nouveau pour moi. Je n'avais pas réussi à trouver quelle option faisait l'affaire sous MacOS X.

0 votes

Même avec ces paramètres appliqués, si j'appuie sur 'o' dans une ligne indentée avec des espaces, la nouvelle ligne est indentée avec des tabulations :-( Comment puis-je changer ce comportement ?

4 votes

Si vous avez activé le paramètre expandtab, il devrait utiliser des espaces. Avez-vous également activé "set compatible" ? Cela a plusieurs effets secondaires, y compris la réinitialisation de l'indicateur d'expansion à sa valeur par défaut, "off".

283voto

netjeff Points 3633

Dans le même ordre d'idée, si vous ouvrez un fichier qui utilise à la fois des tabulations et des espaces, en supposant que vous ayez

set expandtab ts=4 sw=4 ai

Vous pouvez remplacer toutes les tabulations par des espaces dans le fichier entier avec

:%retab

11 votes

Pour info, si vous ne voulez pas que votre tabulation soit remplacée par des espaces, supprimez la ligne expandtab.

7 votes

Les tabulations ne sont-elles pas des espaces blancs ? ;-)

13 votes

@Rob-Wells : J'ai changé "whitespace" en "spaces". Tu es content maintenant ? ;-)

93voto

graywh Points 4425

La meilleure façon d'obtenir une indentation spécifique à un type de fichier est d'utiliser la fonction filetype plugin indent on dans votre vimrc. Vous pouvez alors spécifier des choses comme set sw=4 sts=4 et dans .vim/ftplugin/c.vim, par exemple, sans qu'il soit nécessaire de les rendre globales pour tous les fichiers en cours d'édition, et les autres syntaxes de type non-C seront également indentées correctement. (même si elle zozote) .

10 votes

IMHO, mieux que la réponse qui a été marquée correcte. filetype indent on supersedes cindent et smartindent.

76voto

Shervin Emami Points 1505

Pour avoir des tabulations à 4 espaces dans la plupart des fichiers, une véritable tabulation à 8 espaces dans les Makefiles, et une indentation automatique dans divers fichiers, y compris C/C++, mettez ceci dans votre fichier ~/.vimrc fichier :

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.

1 votes

Pourquoi n'avez-vous pas besoin d'un else ? Il me semble que les dernières lignes écrasent le fichier spécifique au makefile dans tous les cas.

8 votes

Bonjour @lucidbrot, l'instruction "autocmd FileType make" indique à vim certains paramètres à utiliser lorsqu'il ouvre un Makefile. Alors que les lignes en dessous définissent les valeurs par défaut. En d'autres termes, les paramètres "tabstop=8 ..." sont appliqués plus tard lorsque le fichier est ouvert, et écraseront les paramètres "tabstop=4 ..." qui s'appliquent à l'initialisation.

37voto

Chaudhry Junaid Points 36

La méthode recommandée est d'utiliser l'indentation basée sur le type de fichier et d'utiliser smartindent et cindent uniquement si cela ne suffit pas.

Ajoutez ce qui suit à votre fichier .vimrc

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

J'espère que cela vous aidera à trouver une réponse différente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X