215 votes

Comment puis-je convertir les espaces à onglets dans Vim ou Linux ?

J'ai regardé sur plusieurs questions sur un Débordement de Pile pour savoir comment convertir les espaces en tabulations, sans trouver ce dont j'ai besoin. Il semble y avoir plus de questions sur la façon de convertir les tabulations en espaces, mais je suis en train de faire le contraire.

En Vim j'ai essayé d' :retab et :retab! sans la chance, mais je crois que ceux qui sont fait pour aller de tabulations en 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:

http://gdata-python-client.googlecode.com/hg-history/a9ed9edefd61a0ba0e18c43e448472051821003a/samples/docs/docs_v3_example.py

Comment puis-je convertir des principaux espaces en tabulations à l'aide soit d' Vim ou de l'environnement?

362voto

Johnsyweb Points 45395

À l'aide de Vim pour développer tous les principaux espaces (plus large qu' 'tabstop'), vous avez droit d'utiliser retab mais d'abord, assurez - 'expandtab' est réinitialisé (:verbose set ts? et? est votre ami). retab prend une gamme, de sorte que j'ai l'habitude de spécifier % à-dire "l'ensemble du dossier".

:set tabstop=2      " To match the sample file
:set noexpandtab    " Use tabs, not spaces
:%retab!            " Retabulate the whole file

Avant de faire quelque chose comme ceci (en particulier avec des fichiers Python!), J'ai l'habitude de définir 'list', de sorte que je peux voir l'espace et le changement.

J'ai le mappage suivant dans mon .vimrc pour ce:

nnoremap    <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>

46voto

Dr Beco Points 1668

1 - Si vous avez des espaces et souhaitez onglets.

Tout d'abord, vous devez décider combien d'espaces aura un seul onglet. Cela dit, supposons que vous avez les lignes avec de grands espaces 4, ou 8... Que vous vous rendez compte que vous voulez probablement un onglet à 4 places. Maintenant, avec cette info, vous n':

:set ts=4
:set noet
:%retab!

Il y a un problème ici! Cette séquence de commandes va chercher tous votre texte, non seulement les espaces en début de ligne. Que signifie une chaîne de caractères comme: "Hey,␣this␣␣␣␣is␣4␣spaces" deviendra "Hey,␣this⇥is␣4␣spaces", mais ne l'est pas! ses une tab!.

Pour régler ce petit problème je vous conseille un search, au lieu de retab.

:%s/^\(^I*\)␣␣␣␣/\1^I/g

Cette recherche va rechercher dans tout le fichier pour toutes les lignes commençant par quel que soit le nombre d'onglets, suivi de 4 espaces, et de la remplacer pour que le nombre d'onglets il a trouvé plus un.

Cela, malheureusement, ne sera pas exécuté à la fois!

Au premier abord, le fichier aura lignes commençant par des espaces. La recherche va ensuite convertir seulement les 4 premières places sur un onglet, et de laisser les suivantes...

Vous devez répéter la commande. Combien de fois? Jusqu'à ce que vous obtenez une pattern not found. Je ne peux pas penser à un moyen d'automatiser le processus encore. Mais si vous le faites:

`10@:`

Vous êtes probablement fait. Cette commande répète la dernière recherche/remplacer pour 10 fois. Ses pas probable que votre programme sera donc de nombreux tirets. Si elle a, il suffit de répéter à nouveau @@.

Maintenant, juste pour compléter la réponse. Je sais que vous avez demandé pour le contraire, mais vous ne savez jamais quand vous avez besoin de défaire les choses.

2 - Vous avez des onglets et souhaitez espaces.

Tout d'abord, décidez du nombre de places que vous voulez que vos onglets pour être converti. Permet de dire que vous voulez que chaque onglet de 2 espaces. Vous effectuez alors:

:set ts=2
:set et
:%retab!

Cela aurait le même problème avec des chaînes. Mais comme son meilleur style de programmation à ne pas utiliser des onglets à l'intérieur de chaînes, vous êtes réellement faire une bonne chose ici. Si vous avez vraiment besoin d'un onglet à l'intérieur d'une chaîne, utilisez \t.

1voto

ncmathsadist Points 1208

Tabulation incompatible est la malédiction de l’enfer pour les programmeurs Python. Je recommande que ce placent dans leur fichier vimrc :

Tous les onglets deviennent quatre espaces. Vous pouvez convertir les tabulations en espaces à vi en mode commande en tapant

Il y a quatre espaces ici. Vous pouvez également sélectionner la région à réaliser et mode visuel cette substitution de limiter son champ d’application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X