web-dev-qa-db-fra.com

Onglets et espaces dans vim

Comment empêcher vim de remplacer des espaces par des tabulations lorsque l'indentation automatique est activée?

Un exemple: si j'ai deux tabulations et 7 espaces au début de la ligne, et tabstop=3, et j'appuie sur Entrée, la ligne suivante a quatre tabulations et 1 espace au début, mais je ne veux pas ça ...

71
RQ

C'est peut-être une bonne idée de ne pas utiliser d'onglets du tout.

:set expandtab

Si vous souhaitez remplacer tous les onglets de votre fichier par 3 espaces (qui ressembleront assez à tabstop=3):

:%s/^I/   /

(où ^I est le TAB personnage)

À partir de l'aide en ligne VIM:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be Nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.
78
user11211

Vous pouvez convertir tous les TAB en SPACE

:set et
:ret!

ou convertissez tous les SPACE en TAB

:set et!
:ret!
42
kev

tout ce que je veux, c'est que la ligne autoindentée ait exactement les mêmes caractères d'indentation que la ligne précédente.

:help copyindent

'copyindent''ci'booléen (par défaut désactivé); local à tampon; {pas à Vi}

Copiez la structure du retrait des lignes existantes lors de l'indentation automatique d'une nouvelle ligne. Normalement, le nouveau retrait est reconstruit par une série d'onglets suivis d'espaces selon les besoins (sauf si 'expandtab' est activé, auquel cas seuls les espaces sont utilisés). L'activation de cette option fait que la nouvelle ligne copie les caractères utilisés pour le retrait sur la ligne existante. Si le nouveau retrait est plus grand que sur la ligne existante, l'espace restant est rempli de manière normale.

REMARQUE: 'copyindent' est réinitialisé lorsque 'compatible' est défini.
Voir aussi 'preserveindent' .

:help preserveindent

'preserveindent''pi'booléen (par défaut désactivé); local à tampon; {pas à Vi}

Lorsque vous modifiez le retrait de la ligne actuelle, conservez autant que possible la structure de retrait. Normalement, le retrait est remplacé par une série d'onglets suivis d'espaces selon les besoins (sauf si 'expandtab' est activé, auquel cas seuls les espaces sont utilisés). L'activation de cette option signifie que le retrait conservera autant de caractères existants que possible pour le retrait, et n'ajoutera que des tabulations ou des espaces supplémentaires si nécessaire.

REMARQUE: lorsque vous utilisez ">>" plusieurs fois, le retrait résultant est un mélange de tabulations et d'espaces. Vous pourriez ne pas aimer ça.
REMARQUE: 'preserveindent' est réinitialisé lorsque 'compatible' est défini.
Voir aussi 'copyindent' .
Utilisez: retab pour nettoyer les espaces blancs.

41
Aristotle Pagaltzis

Voici une partie de mon .vimrc:

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

Cela fonctionne bien pour moi car je ne veux absolument pas d'onglets dans mon code source. Il semble d'après votre question que vous souhaitez conserver deux tabulations et sept espaces sur la ligne suivante, et je ne suis pas sûr qu'il existe un moyen d'apprendre à Vim à s'adapter à ce style.

25
Greg Hewgill

Peut-être que le fond de cela peut vous aider?

Standard vi interprète la touche tabulation littéralement, mais il existe des alternatives dérivées de vi populaires qui sont plus intelligentes, comme vim. Pour que vim interprète tab comme une commande `` indentation '' au lieu d'une commande d'insertion d'un onglet, procédez comme suit:

set softtabstop=2
1
svrist

Si vous souhaitez remplacer tous les onglets par des espaces en fonction du paramètre "ts", vous pouvez utiliser: retab. Il peut également faire l'inverse.

1
graywh