Tabulation == 4 espaces et retrait automatique après les accolades dans Vim

1266

Comment faire pour que vi - Vim n'utilise jamais de tabulations (conversion d'espaces en tabulations, mauvais!), Crée la touche tabulation == 4 espaces et indente automatiquement le code après les blocs d'accolade comme Emacs ?

De plus, comment puis-je enregistrer ces paramètres afin de ne jamais avoir à les saisir à nouveau?

J'ai vu d'autres questions à ce sujet, mais cela semble toujours un peu différent de ce que je veux.

mmcdole
la source

Réponses:

1883

Comme cela a été souligné dans quelques réponses ci-dessous, la méthode préférée n'est désormais PAS d'utiliser smartindent, mais plutôt d'utiliser ce qui suit (dans votre .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 :

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

Les fichiers d'aide prennent un peu de temps à s'habituer, mais plus vous lisez, mieux Vim obtient:

:help smartindent

Encore mieux, vous pouvez intégrer ces paramètres dans votre source pour la portabilité:

:help auto-setting

Pour voir vos paramètres actuels:

:set all

Comme le souligne graywh dans les commentaires, smartindent a été remplacé par cindent qui "fonctionne plus intelligemment", bien que toujours principalement pour les langages avec une syntaxe de type C:

:help C-indenting

Ken
la source
4
Si vous avez défini expandtab, il doit utiliser des espaces. Avez-vous également "défini compatible"? Cela a divers effets secondaires, y compris la réinitialisation de expandtab à sa valeur par défaut "off"
Ken
60
Désolé, mais smartindent a été remplacé par cindent, qui lui-même n'est approprié que pour la syntaxe de style C. L'activation de l'un ou l'autre dans votre vimrc peut être un problème lorsque vous travaillez avec d'autres langues. Utilisez simplement "filetype indent on" à la place.
graywh
2
Eh bien, smartindent est également uniquement pour la syntaxe de style C et est essentiellement obsolète.
graywh
4
si j'active expandtab, existe-t-il de toute façon un moyen de saisir le caractère de tabulation dans le texte?
Daniele Segato
3
@DanieleSegato <ctrl v> <tab> devrait fonctionner en mode insertion: stackoverflow.com/questions/4781070/…
Ken
236

Associé, si vous ouvrez un fichier qui utilise à la fois des tabulations et des espaces, en supposant que vous avez

set expandtab ts=4 sw=4 ai

Vous pouvez remplacer tous les onglets par des espaces dans l'ensemble du fichier par

:%retab
netjeff
la source
10
Pour info, si vous ne voulez pas que votre tabulation soit remplacée par des espaces, supprimez la ligne expandtab.
Eno
6
Les onglets ne sont-ils pas des espaces? ;-)
Rob Wells
11
@ Rob-Wells: J'ai changé "espaces blancs" en "espaces". Es-tu content maintenant? ;-)
netjeff
Pourriez-vous expliquer ce que signifie cette première ligne?
Fund Monica's Lawsuit
2
expandtab détermine si les tabulations sont développées en espaces. ts = tabstop = Nombre d'espaces qu'un <Tab> dans le fichier compte. sw = shiftwidth = Nombre d'espaces à utiliser pour chaque étape de retrait (auto). ai = autoindent = Copier le retrait de la ligne actuelle lors du démarrage d'une nouvelle ligne.
mcmacerson
89

La meilleure façon d'obtenir une indentation spécifique au type filetype plugin indent onde fichier est d'utiliser dans votre vimrc. Ensuite, vous pouvez spécifier des choses comme set sw=4 sts=4 etdans .vim / ftplugin / c.vim, par exemple, sans avoir à les rendre globales pour tous les fichiers en cours de modification et les autres syntaxes de type non-C seront également indentées correctement (même les lisps) .

graywh
la source
9
À mon humble avis, mieux que la réponse qui a été marquée comme correcte. filetype indent sur remplace cindent et smartindent.
0fnt le
62

Pour avoir des onglets à 4 espaces dans la plupart des fichiers, un véritable onglet de 8 caractères dans Makefiles et un retrait automatique dans divers fichiers, y compris C / C ++, mettez ceci dans votre ~/.vimrcfichier:

" 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.
Shervin Emami
la source
Pourquoi n'en avez-vous pas besoin else? Il me semble que les dernières lignes écrasent le makefile spécifique dans tous les cas
lucidbrot
6
Salut @lucidbrot, l'instruction "autocmd FileType make" indique essentiellement à vim certains paramètres à utiliser chaque fois qu'il ouvre un Makefile. Tandis 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 à l'ouverture du fichier et écraseront les paramètres "tabstop = 4 ..." qui s'appliquent lors de l'initialisation.
Shervin Emami
56

Sur de nombreux systèmes Linux, comme Ubuntu, le .vimrcfichier n'existe pas par défaut, il est donc recommandé de le créer d'abord.

N'utilisez pas le .viminfofichier qui existe dans le répertoire personnel. Il est utilisé dans un but différent.

Étape 1: accédez à votre répertoire personnel

cd ~

Étape 2: créer le fichier

vim .vimrc

Étape 3: ajoutez la configuration indiquée ci-dessus

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Étape 3: Enregistrez le fichier en appuyant sur Shift+ ZZ.

Erick
la source
11
Ne l'utilisez Shift + ZZpas pour créer un fichier .swp. utiliser wq.
shas
6
@shas: "ZZ" est équivalent à ": x" , qui est identique à ": wq", sauf qu'il ne sauvegarde que si le fichier a été modifié ... ( Ctrl-Zc'est une autre histoire ...)
Gert van den Berg
1
@shas C'est tout simplement faux. Si vous ne voulez pas de fichier d'échange pour une session d'édition, vous devez exécuter vim -n <file>. Un fichier d'échange n'est pas quelque chose qui est généré au moment de la sauvegarde; cela irait à l'encontre de son objectif, car les fichiers d'échange deviennent utiles pour récupérer des sessions d'édition interrompues brutalement.
Kaz
32

La méthode recommandée consiste à utiliser l'indentation basée sur le type de fichier et à n'utiliser smartindent et cindent que si cela ne suffit pas.

Ajoutez ce qui suit à votre .vimrc

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

J'espère que cela aide car c'est une réponse différente.

Chaudhry Junaid
la source
12

éditez votre ~ / .vimrc

$ vim ~/.vimrc

ajoutez les lignes suivantes:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
Yusuf Ibrahim
la source
10

Depuis le wiki VIM :

:set tabstop=4
:set shiftwidth=4
:set expandtab
Utilisateur
la source
6

Le retrait automatique est basé sur le mode de syntaxe actuel. Je sais que si vous modifiez Foo.java, puis entrez un {et appuyez sur le Enterretrait de la ligne suivante.

Quant aux onglets, il existe deux paramètres. Dans Vim, tapez deux points, puis "set tabstop = 4", ce qui définira les onglets à afficher comme quatre espaces. Appuyez à nouveau sur deux points et tapez "set expandtab" qui insérera des espaces pour les tabulations.

Vous pouvez placer ces paramètres dans un .vimrc (ou _vimrc sous Windows) dans votre répertoire personnel, vous n'avez donc à les taper qu'une seule fois.

Joey Gibson
la source
0

Tout d'abord, n'utilisez pas la Tabclé dans Vim pour une indentation manuelle. Vim dispose d'une paire de commandes en mode insertion pour augmenter ou diminuer manuellement la quantité d'indentation. Ces commandes sont Ctrl-Tet Ctrl-D. Ces commandes respectent les valeurs de tabstop, shiftwidthet expandtab, et à maintenir le mélange correct des espaces et des pattes (nombre maximal de languettes suivie d'un nombre quelconque d'espaces nécessaires).

Deuxièmement, ces touches de mise en retrait manuelle ne doivent de toute façon pas être très utilisées si vous utilisez la mise en retrait automatique.

Si Ctrl-Tau lieu de Tabvous déranger, vous pouvez le remapper:

:imap <Tab> ^T

Vous pouvez également remapper Shift-Tabpour faire le Ctrl-Ddéindent:

:imap <S-Tab> ^D

Ici, ^ T et ^ D sont des caractères de contrôle littéraux qui peuvent être insérés en tant que Ctrl-VCtrl-T.

Avec ce mappage en place, vous pouvez toujours taper Tab littéral dans le tampon en utilisant Ctrl-VTab. Notez que si vous faites cela, même s'il :set expandtabest activé, vous obtenez un caractère de tabulation non développé.

Un effet similaire à la <Tab>carte est obtenu à l'aide de :set smarttab, ce qui entraîne également un retour en arrière intelligent à l'avant d'une ligne.

En smarttabmode, lorsqu'il Tabn'est pas utilisé en début de ligne, il n'a pas de signification particulière. C'est différent de ma carte ci - dessus Tabà Ctrl-T, parce que Ctrl-Tpartout utilisé dans une ligne (en mode d'insertion) augmentera l'empreinte de cette ligne.

D'autres mappages utiles peuvent être:

:map <Tab> >
:map <S-Tab> <

Maintenant, nous pouvons faire des choses comme sélectionner certaines lignes et appuyer Tabpour les mettre en retrait. Ou appuyez Tabdeux fois sur une ligne (en mode commande) pour augmenter son retrait.

Si vous utilisez les commandes appropriées de gestion de retrait, alors tout est contrôlé par les trois paramètres: shiftwidth, tabstopet expandtab.

Le shiftwidthparamètre contrôle votre taille d'indentation; si vous voulez quatre retraits d'espace, utilisez :set shiftwidth=4ou l'abréviation :set sw=4.

Si seulement cela est fait, une indentation sera créée en utilisant un mélange d'espaces et de tabulations, car noexpandtabc'est la valeur par défaut. Utilisez :set expandtab. Cela provoque les caractères de tabulation que vous saisissez dans le tampon à se développer dans des espaces et à l'indentation gérée par Vim d'utiliser uniquement des espaces.

Quand expandtabest activé, et si vous gérez votre indentation à travers tous les mécanismes Vim appropriés, la valeur de tabstopdevient non pertinente. Il contrôle l'apparence des onglets s'ils se produisent dans le fichier. Si vous avez set tabstop=8 expandtabpuis glissez un onglet dur dans le fichier en utilisant Ctrl-VTab, cela produira un alignement sur la position de tabulation à 8 colonnes suivante, comme d'habitude.

Kaz
la source
Tous vos mappages doivent utiliser les variantes non récursives. Mapping go <C-t>peut utiliser cette syntaxe plutôt que des littéraux. Enfin, le mappage <Tab>en mode normal mappera également <C-i>(ce sont le même personnage), donc je ne le recommande pas (vous perdez une fonctionnalité astucieuse de Vim
D. Ben Knoble
@ D.BenKnoble Je ne recommande rien de tout cela; J'utilise Ctrl-T, Ctrl-D et <> moi-même. Cela utilise Vim comme prévu. Les gens qui utilisaient Tab dans d'autres éditeurs pourraient ne pas aimer ça, c'est tout.
Kaz