Question
Comment empêcher vim de remplacer les espaces par des tabulations lorsque l'autoindent est activé?
Un exemple: si j'ai deux onglets et 7 espaces au début de la ligne et tabstop = 3
et que j'appuie sur Entrée, la ligne suivante comporte quatre onglets et 1 espace au début , mais je ne veux pas que ...
La solution
C’est peut-être une bonne idée de ne pas utiliser d’onglet du tout.
:set expandtab
Si vous souhaitez remplacer tous les onglets de votre fichier par 3 espaces (ce qui ressemblera beaucoup à tabstop = 3
):
:%s/^I/ /
(où ^ I
est le caractère TAB )
À partir de l'aide en ligne de 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.
Autres conseils
Tout ce que je veux, c’est que la ligne auto-identifiée ait exactement les mêmes caractères d’indentation que la ligne précédente.
: help copyindent
'copyindent' 'ci' boolean (désactivé par défaut); local à tampon; {absent de Vi}
Copiez la structure des lignes existantes avec retrait lors de l'indentation automatique d'un nouvelle ligne. Normalement, le nouveau tiret est reconstruit par une série de des tabulations suivies d'espaces si nécessaire (sauf si 'expandtab' est activé, dans ce cas, seuls les espaces sont utilisés). Activer cette option rend le nouvelle ligne copie quels que soient les caractères utilisés pour indenter sur le ligne existante. Si le nouveau retrait est supérieur à celui existant la ligne, l’espace restant est rempli de la manière habituelle.
REMARQUE: la 'copyindent' est réinitialisée lorsque 'compatible' est défini.
Voir également 'preserveindent' .
: help preserveindent
'preserveindent' 'pi' boolean (désactivé par défaut); local à tampon; {absent de Vi}
Lorsque vous modifiez le retrait de la ligne actuelle, conservez autant de structure de retrait que possible. Normalement, le retrait est remplacé par un série d'onglets suivis d'espaces si nécessaire (sauf si 'expandtab' est activé, auquel cas seuls des espaces sont utilisés). Activer cette option signifie que le retrait préservera autant de caractères existants que possible pour mettre en retrait et ajouter uniquement des tabulations ou des espaces supplémentaires selon les besoins.
REMARQUE: Lorsque vous utilisez " > > " plusieurs fois le retrait résultant est un mélange de onglets et espaces. Vous pourriez ne pas aimer cela.
REMARQUE: 'preserveindent' est réinitialisé lorsque 'compatible' est défini.
Voir également 'copyindent' .
Utilisez: retab pour nettoyer les espaces blancs.
Vous pouvez convertir tous les TAB
en SPACE
:set et
:ret!
ou convertir tout SPACE
en TAB
:set et!
:ret!
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 de tabulations dans mon code source. D'après votre question, il semble que vous souhaitiez conserver deux tabulations et sept espaces sur la ligne suivante, et je ne suis pas sûr qu'il y ait un moyen d'enseigner à vim de s'adapter à ce style.
Peut-être que le fond de ceci peut vous aider?
Standard vi interprète littéralement la touche de tabulation, mais il existe des alternatives populaires basées sur vi qui sont plus intelligentes, comme vim. Pour que vim interprète tab comme une commande «indent» au lieu d'une commande insert-a-tab, procédez comme suit:
set softtabstop=2
Si vous souhaitez remplacer tous les onglets par des espaces basés sur le paramètre "ts", vous pouvez utiliser: retab. Il peut aussi faire l'inverse.