88 votes

Onglet espace Vs préférences dans Vim

Vim est très pratique quand il s'agit de l'onglet Vs. l'espace des préférences. Si je comprends bien, l' tabstop paramètre indique la largeur d'un caractère de tabulation. L' shiftwidth paramètre spécifie le nombre de colonnes pour incrémenter/décrémenter lors de l'utilisation de la << et >> les commandes, tandis que l' softtabstop paramètre a une incidence sur la quantité d'espaces à insérer lorsque vous appuyez sur l' Onglet de la clé en mode insertion. Si expandtab est sur, la touche de tabulation insère softtabstop nombre de caractères d'espacement. Alors qu'avec expandtab éteint, en appuyant sur l' Onglet clés insère un nombre le plus petit possible d'onglet+espace de caractères qui correspond softtabstop. (Corrigez-moi si je me trompe.)

Ce dernier point me fait me demander: est-il un cas pratique où vous ne voulez pas être shiftwidth == tabstop && tabstop == softtabstop? Je ne peux pas penser à un. Pour autant que je suis concerné, il serait plus pratique si je pouvais tous les 3 de ces à la même valeur, en une seule mission. par exemple, en appelant:

:set stab=4

ce qui serait équivalent à l'exécution:

: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 suis à jour de la question.

Softtabstop avec expandtab éteint

Je l'ai dit ci-dessus qu'avec expandtab éteint, en appuyant sur la touche de Tabulation insère un nombre le plus petit possible d'onglet+espace de caractères qui correspond softtabstop. Je m'en tiens à ça, mais je pense que j'ai besoin d'expliquer ce que je voulais dire. Je vais tenter de le faire par le moyen de quelques exemples. Pour suivre, exécutez :set list , de sorte que vous pouvez voir les caractères de tabulation.

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

En mode insertion, en appuyant sur la touche de tabulation des inserts de 2 caractères d'espace. Appuyez sur la touche tab une deuxième fois, et au lieu d'insérer deux plusieurs caractères espace (pour un total de 4 caractères d'espace), il remplace le précédent 2 places avec un caractère de tabulation. Tabstop est fixé à 4, de sorte qu'un seul caractère de tabulation a la même largeur que 4 espaces.

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

En mode insertion, en appuyant sur la touche de tabulation insère 1 caractère de tabulation plus de 2 espaces. Le caractère de tabulation a une largeur de 4, de sorte que la largeur totale est de 6, et ceci est réalisé à l'aide de 3 caractères. En appuyant sur la touche tab une deuxième fois insère deux caractères de tabulation, et supprime les deux espaces qui ont été insérées précédemment. La largeur totale est de 12, et ceci est réalisé à l'aide de 3 caractères.

Dans ces deux exemples, Vim insère le nombre minimum de tab+espace de caractères qui correspond à softtabstop.

Si je travaille avec expandtab éteint, je ne me vois pas vouloir l'extra-granulaire de contrôle qui peut être atteint par la création de softtabstop à une valeur différente de tabulation. Il serait toujours utile pour moi d'être en mesure de fixer tabstop, softtabstop et shiftwidth à la même valeur avec une seule commande.

Ne expandtab faire softtabstop redondant?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

En mode insertion, en appuyant sur la touche de tabulation des inserts de 4 espaces. En appuyant sur la touche suppr supprime un espace unique - donc, pour 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, en appuyant sur la touche de tabulation des inserts de 4 espaces. En appuyant sur la touche retour arrière efface les 4 espaces.

Si je travaille avec des expandtab allumé, je préfère la touche suppr pour supprimer la même quantité d'espace que la touche tab inserts. Donc dans ce cas, aussi, je pense qu'il serait utile d'être en mesure d'attribuer la même valeur à tabstop, softtabstop et shiftwidth simultanément.

Un raccourci serait toujours utile

C'est génial que Vim offre beaucoup de flexibilité, mais je ne peux pas voir moi-même qui en ont besoin. Je veux juste être en mesure de choisir la largeur d'un onglet, et si c'est un " dur "de l'onglet (à l'aide d'un caractère de tabulation) ou un "soft" de l'onglet (faite d'espaces). Le basculement entre hard et soft tabs est assez facile (:set expandtab!), mais je voudrais qu'il était plus simple de définir la largeur de l'onglet, sans avoir à jouer avec 3 différents paramètres.

Donc, ma suggestion pour quelque chose comme :set stab=4 sonne toujours bon pour moi.

57voto

too much php Points 27983

La création d'un stab option dans Vim lui-même ne serait pas facile, mais j'ai fouetté jusqu'cette commande/fonction que vous pouvez déposer dans votre .vimrc (ou un fichier de plugin si vous êtes un super-organisés). Utiliser :Stab et vous serez invité à fournir un niveau de retrait et de savoir si ou de ne pas utiliser expandtab. Si vous appuyez sur entrée sans lui donner un nouveau niveau de retrait, il vous suffit d'imprimer les paramètres actuels.

"de mettre tout cela dans votre .vimrc ou un fichier de plugin
commande! -nargs=* Stab appel Stab()
la fonction! Stab()
 laissez l:tabstop = 1 * input('ensemble shiftwidth=')

 si l:tabstop > 0
 "voulons-nous expandtab ainsi?
 laissez l:expandtab = confirm('set expandtab?', "Et oui\n&N\n&Annuler")
 si l:expandtab == 3
 "abort?
de retour
endif

 laissez &l:sts = l:tabstop
 laissez &l:ts = l:tabstop
 laissez &l:sw = l:tabstop

 si l:expandtab == 1
 setlocal expandtab
d'autre
 setlocal noexpandtab
endif
endif

 "afficher les options sélectionnées
essayez
 echohl ModeMsg
 echon 'set tabstop='
 echohl Question
 echon &l:ts
 echohl ModeMsg
 echon ' shiftwidth='
 echohl Question
 echon &l:sw
 echohl ModeMsg
 echon ' sts='
 echohl Question
 echon &l:sts . '' . (&l:et ? '' : 'non')
 echohl ModeMsg
 echon 'expandtab'
enfin
 echohl Aucun
endtry
endfunction

9voto

nelstrom Points 5996

C'est ma première tentative d'écriture VimScript, mais va ici:

function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc

Si j'ai mis cela dans mon .fichiers vimrc, je peux l'appeler en exécutant :call Stab(X), où X est l'onglet désiré largeur. C'est une solution adéquate pour l'instant, mais si quelqu'un peut suggérer une manière de rendre plus facile de les appeler, je vous serais reconnaissant.

J'ai également créé une fonction qui résume rapidement les paramètres actuels, que j'ai mappé sur ctrl-Tab:

nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc

Eh bien, je vais mettre un bounty de 100 points pour cette réponse, et maintenant, j'ai à moitié résolu moi-même. Vous ne savez pas si je peux accepter ma propre réponse...

7voto

sth Points 91594

Vous pouvez dans le mode edit également utiliser Ctrl-T pour le retrait et Ctrl-D pour deindent à la prochaine niveau de retrait fixé par shiftwidth, indépendamment de l' tabstop, softtabstop ou expandtab paramètres. Vim va automatiquement ajouter/supprimer des espaces ou des tabulations pour vous apporter à la colonne de droite.

Si vous utilisez ces commandes pour contrôler l'indentation au lieu de l'Onglet/retour arrière vous n'avez pas à vous soucier de tous ces paramètres de l'onglet qui s'emboîtent et toujours obtenir le niveau d'indentation.

3voto

hobbs Points 71946

Si expandtab est définie, alors (comme trop de php points), en softtabstop devient redondant. La seule raison pour laquelle vous pourriez shiftwidth différemment tabstop serait de répondre à une étrange habitude; par exemple, vous utilisez quatre-espace tirets, mais vous préférez onglet insérer huit espaces.

Si expandtab n'est pas définie alors les choses deviennent plus difficile à cerner. Si vous voulez que votre code de regarder la même chose avec cat et non-vim éditeurs comme il le fait dans vim, puis tabstop doit toujours être fixé à 8; dans ce cas, vous définissez softtabstop et shiftwidth à la fois pour votre préféré niveau de retrait. Si, au contraire, vous préférez que tous les "physique onglet" dans le fichier représente un niveau de retrait, vous définissez tabstop et shiftwidth pour votre préféré niveau de retrait et de quitter softtabstop à zéro (réglage égal à tabstop est équivalent sauf que si vous modifiez tabstop il va sortir de la synchronisation, alors que nul signifie simplement "ignorer cette s'il vous plaît").

2voto

too much php Points 27983

Votre compréhension de l' softtabstop et expandtab , à tort donc, l' stab option vous suggérons de ne pas être très utile.

expandtab est pour lorsque vous souhaitez utiliser des espaces à la place des onglets pour tout. Si vous définissez expandtab, alors Vim ignore l' softtabstop option et utilise tabstop et shiftwidth pour le travail combien d'espaces à insérer.

softtabstop est uniquement pour lorsque vous souhaitez utiliser un mélange de tabulations et des espaces, vous permettant de tiret avec un contrôle précis (2 ou 4 places), tout en gardant la largeur d'un onglet à une valeur plus élevée (généralement 8), de sorte que le texte s'affiche dans les autres applications. Paramètre softtabstop=tabstop n'est pas accomplir quoi que ce soit car Vim va toujours utiliser les tabulations pour l'indentation.

Mise à jour: Comme kaizer.se a souligné, si vous utilisez expandtab, alors vous devez encore définir des softtabstop si vous voulez Vim pour revenir en arrière de plusieurs espaces comme si ils sont un onglet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X