Remplacer les tabulations par des espaces dans vim

358

Je voudrais convertir tab en espaces dans gVim. J'ai ajouté la ligne suivante à mon _vimrc:

set tabstop=2

Cela fonctionne pour s'arrêter à deux espaces mais il semble toujours qu'une touche de tabulation soit insérée (j'ai essayé d'utiliser la touche h pour compter les espaces par la suite).

Je ne sais pas quoi faire pour que gVim convertisse les tabulations en espaces?

David.Chu.ca
la source
1
Personnellement, je trouverais tabstop = 2 un retrait trop petit; J'utilise ts = 4, et je comprends pourquoi les gens (comme l'équipe du noyau Linux) utilisent ts = 8 (et ils n'utilisent pas expandtab - je le fais).
Jonathan Leffler
4
Existe-t-il un moyen de convertir des espaces en tabulations dans vim?
cwd
2
@cwd remplacer les espaces par des caractères de tabulation ( ^Iqui viennent Ctrl-vensuite Tab) fonctionnerait, par exemple si vos tabulations actuelles sont de 4 espaces::%s/ /^I/g
Indra Ginanjar

Réponses:

381

IIRC, quelque chose comme:

set tabstop=2 shiftwidth=2 expandtab

devrait faire l'affaire. Si vous avez déjà des onglets, suivez-le avec une belle RE globale pour les remplacer par des espaces doubles.

D.Shawley
la source
25
Oups, c'est ":%! Expand -t2"
Paul Tomblin
369
ou vous pouvez simplement utiliser: retab
rampion
que faire si je veux l'enregistrer avec des espaces? en ce moment quand je: wq et ouvre à nouveau le fichier je suis de retour aux onglets
Gorkem Yurtseven
1
@Gorkem a mis ces commandes dans votre .vimrc, afin que vim utilise ces paramètres à chaque session
Krakkos
5
Ce que tout cela signifie, est bien expliqué sur le wiki Vim .
Serge Stroobandt
825

Une fois que vous avez développé expandtab selon les autres réponses, le moyen extrêmement pratique de convertir des fichiers existants en fonction de vos nouveaux paramètres est le suivant:

:retab

Cela fonctionnera sur le tampon actuel.

ʞɔıu
la source
mais comment pouvons-nous demander à retab de confirmer chaque occurrence de TAB?
Oculus Dexter
8
Et étant Vim, cela fonctionne aussi sur les régions sélectionnées visuellement :)
Andy
2
Merci de m'apprendre une nouvelle chose. J'utilise l'ennuyeux :%s/\t/ /gdepuis des années avant de voir votre commentaire.
Tai Le
Vous pouvez même faire :args retab | wpour tous les fichiers ouverts sur la ligne de commande, par exemple vim *.txt.
JakeD
Est-ce que quelqu'un sait quelle version de vim a: retab? Mon 7.3.322 ne fonctionne pas.
bitmaker
114

Essayer

set expandtab

pour les onglets souples.

Pour corriger des onglets préexistants:

:%s/\t/  /g

J'ai utilisé deux espaces puisque vous avez déjà défini votre tabstop sur 2 espaces.

Hank Gay
la source
5
Cette correction insérera deux espaces où un seul est requis.
Jonathan Leffler
8
au lieu de faire la substitution, vous pouvez faire ce que Nick a suggéré ci-dessus - à savoir retab. Cela va retab tous vos onglets existants comme le nombre d'espaces définis dans votre tabstop.
Gowri
Astuce génial! Vim m'a montré un fichier parfaitement identifié pendant que cat (linux cmd) a montré une identification irrégulière. Je viens de changer les 2 espaces en 4 que j'utilise dans Vim set ts = 4.
karlphillip
60

Cela a fonctionné pour moi:

vous pouvez voir les onglets en faisant d'abord ceci:

:set list

puis pour permettre de remplacer les onglets alors faites ceci:

:set expandtab

puis

:retab

maintenant tous les onglets ont été remplacés par des espaces, vous pouvez ensuite revenir à l'affichage normal comme ceci:

:set nolist
serup
la source
1
:set listest tout simplement magnifique.
Amir A. Shabani
44

gg=G va réindenter le fichier entier et supprime la plupart sinon tous les onglets que j'obtiens dans les fichiers de collègues.

Vendeurs Jake
la source
1
remplace-t-il les tabulations par des espaces?
likejudo
1
Impressionnant! A également fonctionné pour moi.
Nawaz
1
Pouvez-vous expliquer ce que gg = G fait? cela a fait exactement ce que je cherchais. J'ai du html sur sublime et quand je l'ai collé dans vim, il était follement indenté. Cela semble maintenant propre.
jes516
3
@ jes516 ggdéplace votre curseur au début du tampon. =est format et prend une commande de mouvement. Gdéplace votre curseur à la fin du tampon, de sorte qu'il indique à vim de formater du début à la fin de votre tampon actuel.
Jake Sellers
40

Ajoutez les lignes suivantes à votre .vimrc

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Ouvrez un fichier dans vim et appuyez sur F2 Les tabulations seront converties en 4 espaces et le fichier sera enregistré automatiquement.

anish
la source
Il convient probablement de noter que le q va également fermer le tampon actuel du fichier. Cela peut être souhaité ou non.
Willem van Ketwich du
14

Si vous souhaitez conserver votre \tégal à 8 espaces, envisagez de définir:

   set softtabstop=2 tabstop=8 shiftwidth=2

Cela vous donnera deux espaces par <TAB>pression, mais réel \tdans votre code sera toujours affiché comme 8 caractères.

pk.
la source
Merci d'avoir mentionné softtabstop, l'une des caractéristiques tueuses, je pense.
Martin Ueding
6

Cela m'a permis de travailler:

:set tabstop=2 shiftwidth=2 expandtab | retab
Willem van Ketwich
la source
4

recherchez d'abord les onglets dans votre fichier: / ^ I: set expandtab: retab

marchera.

Shekar
la source
la première partie pourriez-vous s'il vous plaît expliquer que
serup
3

Cet article a un excellent script vimrc pour gérer les tabulations + espaces et les convertir entre eux.

Ces commandes sont fournies:

Space2Tab Convertit les espaces en tabulations, uniquement en retrait.

Tab2Space Convertit les tabulations en espaces, uniquement en retrait.

RetabIndent Execute Space2Tab (si 'expandtab' est défini), ou Tab2Space (sinon).

Chaque commande accepte un argument qui spécifie le nombre d'espaces dans une colonne d'onglets. Par défaut, le paramètre 'tabstop' est utilisé.

Source: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Cela m'a aidé un peu plus que les réponses ici quand j'ai commencé à chercher une solution.

Adam Eberlin
la source
3

expandest un utilitaire Unix pour convertir des tabulations en espaces. Si vous ne voulez setrien dans vim, vous pouvez utiliser une commande shell de vim:

:!% expand -t8
qwr
la source
1
si vous souhaitez simplement développer une partie du code: sélectionnez d'abord cette partie en mode visuel, puis appuyez sur :. Maintenant, la ligne de commande vim s'affiche :'<,'>. Entrez ensuite !expand -t4pour tabulation à 4 espaces. (La ligne de commande résultante est comme :'<,'>!expand -t4)
Penghe Geng