web-dev-qa-db-fra.com

Onglet Préférences d'espace dans Vim

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?


[~ # ~] mise à jour [~ # ~]

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.

Softtabstop avec expandtab désactivé

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.

Expandtab rend-il redondant softtabstop?

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.

Un raccourci serait toujours utile

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.

86
nelstrom

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 
55
too much php

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 ...

9
nelstrom

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.

7
sth

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").

3
hobbs

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é.

2
DaveParillo

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.

1
pauloue