J'ai examiné plusieurs questions sur Stack Overflow pour savoir comment convertir des espaces en onglets sans trouver ce dont j'ai besoin. Il semble y avoir plus de questions sur la façon de convertir les onglets en espaces, mais j'essaie de faire le contraire.
Dans Vim
j'ai essayé :retab
et :retab!
sans chance, mais je pense que ce sont en fait pour passer des onglets aux espaces de toute façon.
J'ai essayé les deux expand
et unexpand
à l'invite de commande sans aucune chance.
Voici le fichier en question:
Comment puis-je convertir les espaces de début en onglets en utilisant l'un Vim
ou l' autre ou le shell?
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.find
,awk
et blackjack (trop long pour le laisser dans les commentaires, cependant)Réponses:
En utilisant Vim pour étendre tous les espaces de début (plus larges que
'tabstop'
), vous aviez raison d'utiliser,retab
mais assurez'expandtab'
- vous d'abord qu'il est réinitialisé (:verbose set ts? et?
est votre ami).retab
prend une plage , donc je spécifie généralement%
pour signifier "le fichier entier".Avant de faire quelque chose comme ça (en particulier avec les fichiers Python!), Je règle généralement
'list'
, de sorte que je puisse voir les espaces et changer.J'ai le mappage suivant dans mon
.vimrc
pour cela:la source
:set noet
,:set tabstop=2
,:retab!
,:%retab!
,:set tabstop=1
,:retab!
,:%retab!
%
. Le mappage F2 est exactement tel qu'il est typé .:set noet ts=2 |%retab!
:%retab!
marche toujours. J'étais confus avec==
, etc qui ne respecte le paramètre preserveindent.:set tabstop=4
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:
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 deretab
.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: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:
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
.la source
ex command
, car ce serait ce qui se trouve à l'intérieur de la fonction. Et non, ce n'est pas rare. Vous avez juste besoin d'avoir des chaînes avec des espaces pour avoir un désordre. Pas rare du tout. J'y suis. Merci d'avoir commenté.^
symbole, pour lancer la recherche depuis le début de la ligne, vous risquez de changer les espaces à l'intérieur des chaînes. Avec le^
vous garantissez que vous ne modifiez que les espaces et les tabulations depuis le début de la ligne, donc l'indentation. En plus de cela, si vous êtes sûr de pouvoir tout faire en même temps, supprimez le^
et exécutez une seule fois avec::%s/\(^I*\)␣␣␣␣/\1^I/g
Traduction: recherchez chaque instance de 4 espaces consécutifs (après le caractère =), mais uniquement si la ligne entière jusqu'à ce point est un espace blanc (cela utilise l'assertion de regard derrière de largeur nulle
\@<=
). Remplacez chaque instance trouvée par un caractère de tabulation.la source
:%s/\(^\s*\)\@<= /\t/g
- mettez le nombre approprié d'espaces (pour convertir 4 espaces en 1 onglet, mettez 4 espaces) juste après le<=
Remplace tous les espaces par tabulation:% s / \ s / \ t / g
la source
Linux: avec
unexpand
(etexpand
)Voici une très bonne solution: https://stackoverflow.com/a/11094620/1115187 , principalement parce qu'elle utilise * nix-utilities:
Linux: script personnalisé
Ma réponse originale
Extrait de code Bash pour remplacer l' indentation de 4 espaces (il y a deux
{4}
dans le script) par des onglets dans tous les.py
fichiers du./app
dossier (récursivement):Il ne modifie pas les 4 espaces au milieu ou à la fin.
A été testé sous Ubuntu 16.0x et Linux Mint 18
la source
Dans mon cas, j'avais plusieurs espaces (les champs étaient séparés par un ou plusieurs espaces) que je voulais remplacer par une tabulation. Ce qui suit l'a fait:
la source
Si vous avez installé GNU coreutils, considérez
%!unexpand --first-only
ou pour les onglets à 4 espaces, considérez%!unexpand -t 4 --first-only
(--first-only
est présent juste au cas où vous invoqueriez accidentellementunexpand
avec--all
).Notez que cela ne remplacera que les espaces précédant les taquets de tabulation prescrits, pas les espaces qui les suivent; vous ne verrez aucune différence visuelle dans vim à moins d'afficher les onglets plus littéralement; par exemple, mon
~/.vimrc
contientset list listchars=tab:▸┈
(je suppose que c'est la raison pour laquelle vous pensiezunexpand
ne pas fonctionner).la source
Pour utiliser Vim pour retaper un ensemble de fichiers (par exemple tous les fichiers * .ts dans une hiérarchie de répertoires) de 2 à 4 espaces, disons, vous pouvez essayer ceci à partir de la ligne de commande:
Ce que cela fait, c'est utiliser
find
pour transmettre tous les fichiers correspondants àxargs
(l'option -print0 sur find fonctionne avec l'option -0 à xargs afin de gérer les fichiers avec des espaces dans le nom).xargs exécute vim en mode ex (
-e
) sur chaque fichier en exécutant la commande ex donnée qui est en fait plusieurs commandes, pour changer les espaces de début existants en tabulations, réinitialiser le taquet de tabulation et changer les onglets en espaces et enfin enregistrer et quitter.L'exécution en mode ex empêche ceci:
Vim: Warning: Input is not from a terminal
pour chaque fichier.la source
Script Python simple:
la source