Redéfinir l'onglet en 4 espaces

1096

Mon réglage actuel suppose 8 espaces; comment pourrais-je le redéfinir?

Ricky
la source
4
Mieux encore, définissez-le sur quatre espaces et activez le retrait automatique en même temps: Retrait automatique avec une largeur de tabulation définie sur 4 espaces
solid_liq
7
@ heinrich5991 Je ne comprends pas. Je n'ai pas besoin de 8 espaces pour réaliser qu'une ligne est en retrait, et plus que nécessaire, cela signifie limiter les caractères que vous pouvez afficher sur une longue ligne de texte (au moins avant l'habillage). Mais a chacun le sien. :)
weberc2
40
@ heinrich5991 Mon argument est "utilisez le moins possible pour identifier facilement une ligne en retrait". Selon moi, la capacité à identifier facilement une indentation diminue rapidement à <3 espaces, et elle cesse d'augmenter à 4 espaces. Par conséquent, une indentation qui dépasse 4 espaces est un gaspillage, selon mon expérience.
weberc2
7
@ weberc2 Je ne pourrais pas être plus d'accord, mon pote. C'est pourquoi je me sens si foutrement claustrophobe en lisant Ruby ou "Javascript moderne", chacun utilisant 2 espaces pour l'indentation. Cela me donne légitimement une fatigue oculaire lorsque j'essaie de suivre des structures fortement imbriquées. Onglets durs pour la putain de victoire.
Duplication possible de l' onglet Remplacer par des espaces dans VIM
rofrol

Réponses:

1619

Cela dépend de ce que vous voulez dire. Voulez-vous que les caractères de tabulation réels de votre fichier apparaissent sur 4 espaces de large, ou par "tabulation", voulez-vous réellement dire un retrait , généré en appuyant sur la touche de tabulation, ce qui entraînerait le fichier contenant littéralement (jusqu'à) 4 caractères d'espace pour chaque "onglet" que vous tapez?

Selon votre réponse, l'un des ensembles de paramètres suivants devrait vous convenir:

  • Pour les tabulations qui apparaissent sur 4 espaces :

    set tabstop=4
    

    Si vous utilisez un caractère de tabulation réel dans votre code source, vous souhaitez probablement également ces paramètres (ce sont en fait les valeurs par défaut, mais vous pouvez les définir de manière défensive):

    set softtabstop=0 noexpandtab
    

    Enfin, si vous souhaitez qu'un retrait corresponde à un seul onglet, vous devez également utiliser:

    set shiftwidth=4
    
  • Pour les retraits composés de 4 caractères d'espace mais saisis avec la touche de tabulation:

    set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab
    

Pour rendre les paramètres ci-dessus permanents, ajoutez ces lignes à votre vimrc .

Au cas où vous auriez besoin de faire des ajustements, ou voudriez simplement comprendre ce que ces options signifient toutes, voici une ventilation de ce que chaque option signifie:

tabstop

La largeur d'un tabstop dur mesurée en "espaces" - en fait la largeur (maximale) d'un caractère de tabulation réel.

shiftwidth

La taille d'un "retrait". Il est également mesuré en espaces, donc si votre base de code se met en retrait avec des caractères de tabulation, vous voulez shiftwidthégaler le nombre de caractères de tabulation fois tabstop. Ceci est également utilisé par des choses comme les commandes =, >et <.

softtabstop

La définition d'une valeur non nulle autre que tabstopla touche de tabulation (en mode insertion) insérera une combinaison d'espaces (et éventuellement de tabulations) pour simuler les taquets de tabulation à cette largeur.

expandtab

Si vous activez cette option, la touche de tabulation (en mode insertion) insère des espaces au lieu des caractères de tabulation. Cela affecte également le comportement de la retabcommande.

smarttab

Si vous activez cette option, la touche de tabulation (en mode insertion) insère des espaces ou des tabulations pour passer au retrait suivant du tabstop suivant lorsque le curseur est au début d'une ligne (c'est-à-dire que les seuls caractères précédents sont des espaces).

Pour plus de détails sur l'un de ces éléments, voir dans vim (par exemple ):help 'optionname':help 'tabstop'

Laurence Gonsalves
la source
18
Il est également important de s'assurer que les Makefiles utilisent toujours des caractères d'onglet dur, sinon les builds échoueront! J'ai montré comment, sur stackoverflow.com/questions/234564/…
Shervin Emami
30
@Undefined Ce sont les paramètres du système vim. ~/.vimrccorrespond aux paramètres vim de l'utilisateur. La plupart des gens laissent les paramètres système seuls et modifient simplement les paramètres utilisateur. Notez que ~/.vimrccela n'existera pas tant que vous ne l'aurez pas créé sur la plupart des systèmes.
Laurence Gonsalves
4
Les utilisateurs de Vim prennent note de la set softtabstop=4fonctionnalité! Je suis fatigué d'essayer de lire votre code avec less, ou tout autre éditeur sauf vim, seulement pour voir une indentation farfelue parce que vous avez redéfini tab comme un nombre arbitraire d'espaces (même si le reste du système pense le contraire)! :-)
Ogre Psalm33
7
Quelqu'un peut-il m'aider à comprendre pourquoi cette réponse dit d'utiliser tabstop=8pour les retraits composés de 4 espaces? Je n'ai pas pu comprendre la raison après avoir lu les descriptions des différents paramètres. Une autre réponse dit d'utiliser tabstop=4ce qui me semble un peu plus logique.
Kodos Johnson
6
@KodosJohnson L' tabstopoption contrôle la largeur d'un caractère de tabulation rigide. Si vous souhaitez que vos retraits soient constitués de 4 caractères d'espace, plutôt que de caractères de tabulation simples qui sont larges de 4, alors la largeur de votre caractère de tabulation n'a pas d'importance - en quelque sorte . En pratique, vous souhaiterez probablement que la largeur du caractère de tabulation soit différente de la largeur de vos retraits, afin de réduire le risque que les caractères de tabulation se présentent comme des retraits appropriés. ( list+ expandtabpeut également aider ici). En outre, les onglets de 8 caractères sont "la norme" - votre terminal, Python et de nombreux autres outils utilisent par défaut des onglets de 8 caractères.
Laurence Gonsalves
747

Pour définir cela de façon permanente pour l'utilisateur actuel, créez (ou modifiez) le .vimrcfichier:

$ vim ~/.vimrc

Collez ensuite la configuration ci-dessous dans le fichier. Une fois vim redémarré, les paramètres de l'onglet s'appliquent.

set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.

set shiftwidth=4    " Indents will have a width of 4

set softtabstop=4   " Sets the number of columns for a TAB

set expandtab       " Expand TABs to spaces
Alan Haggai Alavi
la source
Si vous n'avez pas ~ / .vimrc, essayez avec / etc / vim / vimrc. Dans mon cas sur Ubuntu 16.04, le fichier de configuration est là. Mais gardez à l'esprit que la modification de ce fichier entraînera une utilisation globale de la configuration.
Todor Todorov
5
Encore une chose, utilisez :retabpour convertir l'existant taben spaces. vim.wikia.com/wiki/Converting_tabs_to_spaces
DawnSong
57

ou raccourci pour vim modeline:

vim :set ts=4 sw=4 sts=4 et :
Zen
la source
28

Il existe peu de paramètres qui définissent s'il faut utiliser des espaces ou des tabulations.

Voici donc des fonctions pratiques qui peuvent être définies dans votre ~/.vimrcfichier:

function! UseTabs()
  set tabstop=4     " Size of a hard tabstop (ts).
  set shiftwidth=4  " Size of an indentation (sw).
  set noexpandtab   " Always uses tabs instead of space characters (noet).
  set autoindent    " Copy indent from current line when starting a new line (ai).
endfunction

function! UseSpaces()
  set tabstop=2     " Size of a hard tabstop (ts).
  set shiftwidth=2  " Size of an indentation (sw).
  set expandtab     " Always uses spaces instead of tab characters (et).
  set softtabstop=0 " Number of spaces a <Tab> counts for. When 0, featuer is off (sts).
  set autoindent    " Copy indent from current line when starting a new line.
  set smarttab      " Inserts blanks on a <Tab> key (as per sw, ts and sts).
endfunction

Usage:

:call UseTabs()
:call UseSpaces()

Pour l'utiliser par extension de fichier, la syntaxe suivante peut être utilisée (ajoutée à .vimrc):

au! BufWrite,FileWritePre *.module,*.install call UseSpaces()

Voir aussi: Conversion d'onglets en espaces .


Voici un autre extrait de Wikia qui peut être utilisé pour basculer entre les tabulations et les espaces :

" virtual tabstops using spaces
set shiftwidth=4
set softtabstop=4
set expandtab
" allow toggling between local and default mode
function TabToggle()
  if &expandtab
    set shiftwidth=8
    set softtabstop=0
    set noexpandtab
  else
    set shiftwidth=4
    set softtabstop=4
    set expandtab
  endif
endfunction
nmap <F9> mz:execute TabToggle()<CR>'z

Il permet d'utiliser 4 espaces pour chaque onglet et un mappage F9pour basculer les paramètres.

kenorb
la source
27

J'ai copié et collé cela dans mon fichier .vimrc:

" size of a hard tabstop
set tabstop=4

" always uses spaces instead of tab characters
set expandtab

" size of an "indent"
set shiftwidth=4

Les 2 premiers paramètres signifient que lorsque j'appuie sur Tab, j'obtiens 4 espaces. Le troisième paramètre signifie que lorsque je le fais V>(c'est-à-dire visuel et retrait), j'obtiens également 4 espaces.

Pas aussi complet que la réponse acceptée, mais cela pourrait aider les personnes qui veulent simplement copier et coller quelque chose.

Snowcrash
la source
14

Mettez vos paramètres souhaités dans le fichier ~ / .vimrc - Voir ci-dessous pour quelques directives et meilleures pratiques.

Il existe quatre façons principales d'utiliser les onglets dans Vim:

  1. Gardez toujours 'tabstop' à 8, réglez 'softtabstop' et 'shiftwidth' sur 4 (ou 3 ou ce que vous préférez) et utilisez 'noexpandtab'. Ensuite, Vim utilisera un mélange d'onglets et d'espaces, mais en tapant et en se comportant comme un onglet apparaît tous les 4 (ou 3) caractères.

    Remarque: la définition de 'tabstop' sur toute autre valeur que 8 peut faire apparaître votre fichier incorrect à de nombreux endroits (par exemple, lors de l'impression).

  2. Réglez «tabstop» et «shiftwidth» sur ce que vous préférez et utilisez «expandtab». De cette façon, vous insérerez toujours des espaces. Le formatage ne sera jamais gâché lorsque «tabstop» est modifié.

  3. Réglez «tabstop» et «shiftwidth» sur ce que vous préférez et utilisez un | modeline | pour définir ces valeurs lors de la modification du fichier. Fonctionne uniquement lorsque vous utilisez Vim pour modifier le fichier.

  4. Définissez toujours 'tabstop' et 'shiftwidth' sur la même valeur, et 'noexpandtab'. Cela devrait alors fonctionner (pour les retraits initiaux uniquement) pour tout paramètre de tabulation utilisé par les utilisateurs. Si vous le faites, il peut être intéressant d'avoir des tabulations après le premier non vide inséré en tant qu'espaces. Sinon, les commentaires alignés seront incorrects lorsque «tabstop» est modifié.

La source:

ElasticThoughts
la source
+1 pour expliquer pourquoi la définition de tabstop! = 8 peut être mauvaise!
Ogre Psalm33
3
C'est très bien, mais vous devez noter que c'est mot pour mot de vimdoc.sourceforge.net/htmldoc/options.html#'tabstop 'ou :help tabstopdans vim.
belacqua
6

Ajouter une ligne
set ts=4
dans le
~/.vimrcfichier par utilisateur
ou un
/etc/vimrcfichier pour l'ensemble du système

Alok Singh Mahor
la source
2

Mon ~ / .vimrc de base avec commentaire:

set number " show line number                                                                                           
set tabstop=2 " set display width of tab; 1 tab = x space with                                                           
set expandtab " transform tab to x space (x is tabstop)                                                               
set autoindent " auto indent; new line with number of space at the beginning same as previous                                                                      
set shiftwidth=2 " number of space append to lines when type >> 
o0omycomputero0o
la source
0

Permanent pour tous les utilisateurs (lorsque vous êtes seul sur le serveur):

# echo "set tabstop=4" >> /etc/vim/vimrc

Normalement sur un nouveau serveur apt-get purge nano mcet tous les autres pour gagner du temps. Sinon, vous redéfinirez l'éditeur dans git, crontabetc.

Vasilii Suricov
la source
1
Si vous définissez EDITOR, la plupart des programmes le respecteront.
D. Ben Knoble
@ D.BenKnoble vous avez raison. J'ai essayé. pour l'instant je préfère économiser mon temps et mes nerfs. ne peut pas vérifier exactement ce qui fonctionne avec F10in nanomais je fais toujours quelques astuces avec save (c'est peut F10- être une solution). ou ça ne marche pas screen? Je ne me souviens pas, je déteste ça)
Vasilii Suricov
quoi qu'il en soit dans le passé ...
Vasilii Suricov