1 - Si vous avez des espaces et souhaitez des tabulations.
Tout d'abord, vous devez décider combien d'espaces auront un seul onglet. Cela dit, supposons que vous ayez des lignes avec 4 espaces en tête, ou 8 ... Ensuite, vous réalisez que vous voulez probablement qu'une tabulation soit 4 espaces. Maintenant, avec cette information, vous faites:
:set ts=4
:set noet
:%retab!
Il y a un problème ici! Cette séquence de commandes recherchera tout votre texte, pas seulement les espaces au début de la ligne. Cela signifie une chaîne comme: "Hey,␣this␣␣␣␣is␣4␣spaces"
deviendra "Hey,␣this⇥is␣4␣spaces"
, mais ce n'est pas le cas! c'est un onglet !.
Pour régler ce petit problème, je recommande un search
, au lieu de retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
Cette recherche recherchera dans tout le fichier toutes les lignes commençant par le nombre d'onglets, suivi de 4 espaces, et la remplacera par le nombre d'onglets qu'il a trouvés plus un.
Ceci, malheureusement, ne fonctionnera pas à la fois!
Au début, le fichier aura des lignes commençant par des espaces. La recherche convertira alors seulement les 4 premiers espaces en tabulation, et laissera ce qui suit ...
Vous devez répéter la commande. Combien de fois? Jusqu'à ce que vous obteniez un pattern not found
. Je ne vois pas encore de moyen d'automatiser le processus. Mais si vous faites:
`10@:`
Vous avez probablement terminé. Cette commande répète la dernière recherche / remplacement 10 fois. Il est peu probable que votre programme ait autant de retraits. Si c'est le cas, répétez simplement @@
.
Maintenant, juste pour compléter la réponse. Je sais que vous avez demandé le contraire, mais vous ne savez jamais quand vous devez annuler des choses.
2 - Vous avez des onglets et souhaitez des espaces.
Tout d'abord, décidez du nombre d'espaces dans lesquels vous souhaitez convertir vos onglets. Disons que vous voulez que chaque onglet soit composé de 2 espaces. Vous faites alors:
:set ts=2
:set et
:%retab!
Cela aurait le même problème avec les chaînes. Mais comme son meilleur style de programmation est de ne pas utiliser d'onglets durs dans les chaînes, vous faites en fait une bonne chose ici. Si vous avez vraiment besoin d'une tabulation dans une chaîne, utilisez \t
.
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) semble convertir tous les espaces, pas seulement les espaces de début . Dans le deuxième exemple (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
), il remplace uniquement le premier espace de chaque ligne par une tabulation et laisse le reste.