Remplacer les onglets par des espaces dans vim
Question
Je voudrais convertir l'onglet 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 est insérée (j'ai essayé d'utiliser la touche h pour compter les espaces par la suite).
Je ne suis pas sûr de savoir quoi faire pour que gVim convertisse les tabs en espaces?
La solution
IIRC, quelque chose comme:
set tabstop=2 shiftwidth=2 expandtab
devrait faire l'affaire. Si vous avez déjà des onglets, effectuez un suivi avec une belle RE globale pour les remplacer par des doubles espaces.
Autres conseils
Une fois que vous avez développé la boîte de dialogue selon les réponses, le moyen extrêmement pratique de convertir les fichiers existants en fonction de vos nouveaux paramètres est le suivant:
:retab
Cela fonctionnera sur le tampon actuel.
Essayez
set expandtab
pour les onglets programmables.
Pour corriger les onglets préexistants:
:%s/\t/ /g
J'ai utilisé deux espaces car vous avez déjà défini votre tabstop sur 2 espaces.
Cela a fonctionné pour moi:
vous pouvez voir les onglets en commençant par ceci:
:set list
puis pour permettre de remplacer les onglets, procédez comme suit:
: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
gg=G
réindente la totalité du fichier et supprime la plupart, sinon tous les onglets que j’obtiens dans les fichiers de collègues.
Ajoutez les lignes suivantes à votre fichier .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 onglets seront convertis en 4 espaces et le fichier sera automatiquement enregistré.
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>
appui, mais les <=> réels dans votre code seront toujours vus comme 8 caractères.
commencez par rechercher les onglets de votre fichier: / ^ I : set expandtab : retab
fonctionnera.
expand
est un utilitaire Unix permettant de convertir des tabulations en espaces. Si vous ne voulez set
rien dans vim, vous pouvez utiliser une commande shell de vim:
:!% expand -t8
Cela a fonctionné pour moi:
:set tabstop=2 shiftwidth=2 expandtab | retab
Cet article contient un excellent script vimrc pour la gestion des tabulations + espaces et la conversion entre eux.
Ces commandes sont fournies:
Espace2Tab : convertissez les espaces en onglets, uniquement en retrait.
Tab2Space Convertissez les onglets en espaces uniquement en retrait.
RetabIndent Exécutez Space2Tab (si 'expandtab' est défini) ou Tab2Space (sinon).
Chaque commande accepte un argument spécifiant le nombre d'espaces dans une colonne à 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 fournies lorsque j'ai commencé à rechercher une solution.