Est-il possible de convertir des tabulations en espaces tout en maintenant l'alignement du texte?
Simplement remplacer ne fonctionne que utilement quand il n'y a pas de personnages principaux.
Est-il possible de convertir des tabulations en espaces tout en maintenant l'alignement du texte?
Simplement remplacer ne fonctionne que utilement quand il n'y a pas de personnages principaux.
Réponses:
Vous pouvez utiliser la :retab
commande. De
:help :retab
Remplacez toutes les séquences d'espaces contenant un
<Tab>
avec de nouvelles chaînes d'espaces en utilisant la nouvelle valeur de tabulation donnée. Si vous ne spécifiez pas de nouvelle taille de tabulation ou si elle est égale à zéro, Vim utilise la valeur actuelle de'tabstop'
. [...] Avec'expandtab'
on, Vim remplace tous les onglets avec le nombre d'espaces approprié.
Notez que la commande accepte une plage, vous pouvez donc effectuer une sélection visuelle et uniquement :retab
les lignes sélectionnées.
Vous pouvez utiliser :retab
, comme indiqué, cependant, cela changera tous les onglets en espaces, et pas seulement les onglets au début de la ligne.
Donc ceci (où ⇥
est un caractère de tabulation):
if :; do
⇥echo "⇥hello"
end
se change en (où ␣
est un espace):
if :; do
␣␣echo "␣␣hello"
end
Cela peut produire des effets secondaires inattendus dans certains scénarios, et c'est encore plus un problème lorsque vous modifiez des espaces en onglets!
J'ai donc écrit une petite fonction pour ne changer que les tabulations / espaces au début de la ligne:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Avec cette version, vous devez spécifier manuellement expandtab
dans l'appel de fonction (c'est- :call Retab(1)
à- dire pour changer les tabulations en espaces), mais vous pouvez également le modifier pour qu'il prenne la valeur actuelle de &expandtab
(comme il le fait déjà avec &tabstop
) comme :retab
tout le monde. (Je préfère préférer le spécifier manuellement).
a
en if a:expandtab
moyenne?
set expandtab
dans votre fichier .vimrc, puis autocmd BufWritePre * :call Retab(&expandtab)
- l'indentation sera modifiée en onglets, au lieu d'espaces.
Vim fournit une !retab
commande qui remplacera toutes les séquences de <Tab>
nouvelles chaînes par des espaces en utilisant la nouvelle valeur de tabstop (par exemple :set tabstop=2
) donnée, mais tous les onglets à l'intérieur des chaînes peuvent être modifiés (par exemple, dans un programme C, vous devez utiliser \t
pour éviter cela)!
Donc, vous pouvez également changer tous les onglets en espaces en utilisant la commande suivante:
:%s/\t/ /g
ou comme suggéré par @Shahbaz :
:%s/^\t\+/ g
Ainsi, seuls les onglets utilisés dans l'indentation sont convertis.
Explication:
%
représente l'intégralité du tampon / fichier ( :help :%
)s
signifie substitute ( :help sub-replace-special
)\t
, ou ^I
représente un onglet
- utilisez autant d'espaces que nécessaire par ongletg
- signifie global et convertira plusieurs occurrences d'onglets dans la même ligneEnsuite , pour corriger indentation du fichier entier, vous pouvez essayer: gg=G. Vérifiez: Réindentez le code mal mis en retrait pour plus de détails.
Pour utiliser des espaces par défaut au lieu d'onglets, vous devez ajouter les paramètres suivants dans votre .vimrc
fichier:
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
La solution alternative consiste à utiliser tidy
Apparenté, relié, connexe:
%s/^\t\+/ g
sorte que seuls les onglets utilisés dans l'indentation soient convertis. En outre, gg=G
pourrait être catastrophique avec des langages comme Python.
Essayez d'utiliser:
expand -t 4 input_filename output_filename
expand
est un outil de ligne de commande permettant de convertir des tabulations en espaces que vous pouvez exécuter à partir d'un shell ou avec :!expand
.
Il est dans POSIX , il devrait donc être disponible sur la plupart des systèmes. unexpand
va faire l'inverse, au fait.
expand
?
:%!expand -t 4
intérieur de vim. Mieux encore, vous pouvez également utiliser l'option de largeur de décalage actuelle: :exe '%!expand -t ' . &shiftwidth
Par souci d'exhaustivité, vous =
pouvez également utiliser cette option après avoir spécifié que les tabulations sont remplacées par des espaces. En mode normal, vous pouvez le faire en tapant :set expandtab
. Ensuite, =
pourrait être utilisé de deux manières:
=
corrige les indentations des blocs de code sélectionnés.gg=G
corrige le fichier entier, gg
déplace le curseur au début du fichier, =
est ensuite appliqué et G
déplace le curseur à la fin du fichier.Référence: lien
:h vim-faq
et effectuer une recherche/tab characters
. Le tag difficile à mémoriser est:h faq-14.16
.