Vim est très accommodant en ce qui concerne l'onglet Vs. préférences d'espace. Si je comprends bien, le paramètre tabstop
indique la largeur d'un caractère de tabulation. Le paramètre shiftwidth
spécifie le nombre de colonnes à incrémenter/décrémenter lors de l'utilisation du paramètre << et >> tandis que le paramètre softtabstop
influence la quantité d'espace à insérer lorsque vous appuyez sur la touche Tab clé en mode insertion. Si expandtab
est activé, la touche de tabulation insère softtabstop
nombre de caractères d'espace. Alors que expandtab
est désactivé, appuyez sur la touche Tab insère le plus petit nombre possible de tabulations + espaces correspondant à softtabstop
. (Corrigez-moi si j'ai tort, s'il-vous plait.)
Ce dernier point me fait me demander: existe-t-il un cas pratique où vous ne voudriez pas shiftwidth == tabstop && tabstop == softtabstop
? Je ne peux pas penser à un. En ce qui me concerne, il serait plus pratique si je pouvais définir tous les 3 à la même valeur, en une seule affectation. par exemple. appel:
:set stab=4
ce qui équivaudrait à exécuter:
:set tabstop=4 softtabstop=4 shiftwidth=4
Quelqu'un peut-il suggérer comment cela pourrait être fait?
Merci pour les réponses si loin de trop de php , hobbs et kaiser.se . Plutôt que de répondre à chacun individuellement, je mets à jour la question ici.
J'ai dit ci-dessus qu'avec expandtab désactivé, appuyer sur la touche Tab insère le plus petit nombre possible de tabulations + espaces correspondant à softtabstop
. Je m'en tiens à cela, mais je pense que je dois expliquer ce que je voulais dire. J'essaierai de le faire au moyen de quelques exemples. Pour suivre, exécutez :set list
pour que vous puissiez voir les tabulations.
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
En mode insertion, une pression sur la touche de tabulation insère 2 espaces. Appuyez une deuxième fois sur la touche de tabulation et au lieu d'insérer deux caractères d'espace supplémentaires (pour un total de 4 caractères d'espace), il remplace les 2 espaces précédents par un seul caractère de tabulation. Tabstop est défini sur 4, donc un seul caractère de tabulation a la même largeur que 4 espaces.
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
En mode insertion, une pression sur la touche de tabulation insère 1 caractère de tabulation plus 2 espaces. Le caractère de tabulation a une largeur de 4, donc la largeur totale est de 6, et ceci est réalisé en utilisant 3 caractères. Une deuxième pression sur la touche de tabulation insère deux caractères de tabulation et supprime les deux espaces insérés précédemment. La largeur totale est de 12, et ceci est réalisé en utilisant 3 caractères.
Dans ces deux exemples, Vim insère le nombre minimum possible de tabulations + espaces correspondant à softtabstop.
Si je travaille avec expandtab désactivé, je ne me vois pas vouloir le contrôle granulaire supplémentaire qui peut être obtenu en définissant softtabstop sur une valeur différente de tabstop. Il serait toujours utile pour moi de pouvoir définir tabstop
, softtabstop
et shiftwidth
à la même valeur avec une seule commande.
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
En mode insertion, une pression sur la touche de tabulation insère 4 espaces. Appuyer sur la touche Suppr supprime un seul espace - vous devez donc revenir en arrière 4 fois si vous appuyez sur la touche de tabulation par accident.
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
En mode insertion, une pression sur la touche de tabulation insère 4 espaces. Appuyez sur la touche de retour arrière pour supprimer 4 espaces.
Si je travaille avec expandtab
activé, je préférerais que la touche de suppression supprime la même quantité d'espaces que les touches de tabulation insérées. Donc, dans ce cas également, je pense qu'il serait utile de pouvoir attribuer la même valeur à tabstop
, softtabstop
et shiftwidth
simultanément.
C'est génial que Vim offre autant de flexibilité, mais je ne me vois pas en avoir besoin. Je veux juste pouvoir choisir la largeur d'un onglet, et si c'est un onglet "dur" (en utilisant un caractère de tabulation) ou un onglet "doux" (composé d'espaces). Le basculement entre les onglets durs et doux est assez simple (:set expandtab!
), mais j'aurais aimé qu'il soit plus simple de régler la largeur de la tabulation, sans avoir à jouer avec 3 paramètres différents.
Donc, ma suggestion proposée pour quelque chose comme :set stab=4
me semble toujours bon.
Créer une option stab
dans Vim lui-même ne serait pas facile, mais j'ai concocté cette commande/fonction que vous pouvez déposer dans votre .vimrc
(ou un fichier de plugin si vous êtes super organisé). Utilisation :Stab
et vous serez invité à indiquer un niveau de retrait et à utiliser ou non expandtab
. Si vous appuyez sur Entrée sans lui donner un nouveau niveau de retrait, il imprimera simplement les paramètres actuels.
"mettez tout cela dans votre .vimrc ou un fichier de plugin commande! -nargs = * Stab appelez la fonction Stab () ! Stab () laissez l : tabstop = 1 * input ('set shiftwidth =') if l: tabstop> 0 "voulons-nous également expandtab? let l: expandtab = confirm ('set expandtab?', "& Yes\n & No\n & Cancel") if l: expandtab == 3 "abort? return endif let & l: sts = l: tabstop let & l: ts = l: tabstop let & l: sw = l: tabstop si l: expandtab == 1 setlocal expandtab else setlocal noexpandtab endif endif "afficher les options sélectionnées essayer echohl ModeMsg echon 'set tabstop =' echohl Question echon & l: ts echohl ModeMsg echon 'shiftwidth =' echohl Question echon & l: sw echohl ModeMsg echon's ts = ' echohl Question echon & l: sts. ''. (& l: et? '': 'non') echohl ModeMsg echon 'expandtab' enfin echohl Aucun endtry endfunction
Ceci est ma première tentative d'écriture de VimScript, mais voici:
function! Stab(value)
let &shiftwidth = a:value
let &softtabstop = a:value
let &tabstop = a:value
endfunc
Si je mets cela dans mon fichier .vimrc, je peux l'appeler en exécutant :call Stab(X)
, où X est la largeur de tabulation souhaitée. C'est une solution adéquate pour le moment, mais si quelqu'un peut suggérer un moyen de faciliter l'appel, je vous en serais reconnaissant.
J'ai également créé une fonction qui résume rapidement les paramètres actuels, que j'ai mappés sur ctrl-Tab:
nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
echo "tabstop: ".&tabstop
echo "shiftwidth: ".&shiftwidth
echo "softtabstop: ".&softtabstop
endfunc
Eh bien, j'ai mis en place une prime de 100 points pour cette réponse, et maintenant je l'ai à moitié résolu moi-même. Je ne sais pas si je peux accepter ma propre réponse ...
Vous pouvez également utiliser en mode édition Ctrl-T mettre en retrait et Ctrl-D pour désindenter au niveau de retrait suivant défini par shiftwidth
, quels que soient les paramètres tabstop
, softtabstop
ou expandtab
. Vim ajoutera/supprimera automatiquement des espaces ou des tabulations pour vous amener à la colonne de droite.
Si vous utilisez ces commandes pour contrôler l'indentation au lieu de Tab/Backspace vous n'avez pas à vous soucier de tous ces paramètres d'onglet s'emboîtant et obtenez toujours le niveau d'indentation correct.
Si expandtab
est alors défini (comme le souligne trop de php), softtabstop
devient redondant. La seule raison pour laquelle vous pourriez définir shiftwidth
différemment de tabstop
serait de répondre à une habitude étrange; par exemple, vous utilisez des retraits à quatre espaces mais vous préférez tab pour insérer huit espaces.
Si expandtab
n'est pas défini, les choses deviennent plus floues. Si vous voulez que votre code soit identique avec cat
et les éditeurs non-vim comme il le fait dans vim, alors tabstop
doit toujours être défini sur 8; dans ce cas, vous devez définir softtabstop
et shiftwidth
sur votre niveau de retrait préféré. Si vous préférez que chaque "onglet physique" du fichier représente un niveau de retrait, vous devez définir tabstop
et shiftwidth
à votre niveau de retrait préféré et laisser softtabstop
à zéro ( le mettre égal à tabstop
est équivalent, sauf que si vous changez tabstop
, il sera désynchronisé, tandis que zéro signifie simplement "ignorez ceci s'il vous plaît").
Modifiez-vous vos paramètres d'espace blanc si souvent que vous avez vraiment besoin d'une fonction pour gérer cela? Si vous jouez beaucoup avec tabstop et que vous définissez également expandtab, vous allez probablement avoir un gâchis au fil du temps lorsque vous modifiez des fichiers avec des valeurs différentes passées à stab
. Aujourd'hui j'utilise :call stab (4)
, demain c'est :call stab (2)
et la semaine dernière c'était :call stab (8)
. On dirait que même si vous l'écrivez, vous allez bientôt cesser de l'utiliser.
Si vous prévoyez de toujours passer la même valeur pour stab, pourquoi ne pas simplement modifier vos paramètres globaux? En vim:
:e $MYVIMRC
et ajoutez ce qui suit:
set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces
Voici comment mon .vimrc est configuré.
Une option utile est softtabstop=-1
qui lui donnera la valeur de shiftwidth
.
Vous pouvez également définir shiftwidth
sur 0, auquel cas la valeur tabstop
sera utilisée.