Atom dispose d'un outil intégré pour cela
Activez la palette de commande ( ShiftCmdP sur Mac, CtrlShiftP sur Windows/Linux) et recherchez "convert space" ou "convert tab". Vous devriez constater que ces trois commandes sont disponibles :
- Espaces blancs : Convertir les espaces en tabulations
- Whitespace : Convertir les tabulations en espaces
- Espace blanc : Convertir toutes les tabulations en espaces
Convertir les onglets vs. Convertir tous les onglets
Dans les commentaires, vous avez fait remarquer que l'utilisation de "Convert Tabs to Spaces" (convertir les tabulations en espaces) casse l'indentation dans Python, mais que "Convert Tous Tabs to Spaces" a fonctionné correctement. Vous avez demandé quelle était la différence entre les deux.
Je ne connaissais pas la réponse, alors j'ai cherché. Elle est définie dans le paquet "whitespace", dont la source se trouve sur Github à l'adresse suivante atome/espace blanc .
Regarder à l'intérieur lib/whitespace.js j'ai trouvé ça :
'whitespace:convert-tabs-to-spaces': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
this.convertTabsToSpaces(editor)
}
},
'whitespace:convert-spaces-to-tabs': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertSpacesToTabs(editor)
}
},
'whitespace:convert-all-tabs-to-spaces': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertTabsToSpaces(editor, true)
}
}
Comme vous pouvez le voir, la fonction pertinente ici est convertTabsToSpaces
. Dans la variante "convertir tout", la seule différence est qu'un deuxième argument (facultatif) est passé, et défini comme suit true
.
return this.convertTabsToSpaces(editor, true)
En regardant la définition de convertTabsToSpaces
La différence est que l'expression est modifiée en fonction de l'état de cet argument booléen.
convertTabsToSpaces (editor, convertAllTabs) {
let buffer = editor.getBuffer()
let spacesText = new Array(editor.getTabLength() + 1).join(' ')
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
buffer.transact(function () {
return buffer.scan(regex, function ({replace}) {
return replace(spacesText)
})
})
return editor.setSoftTabs(true)
}
La ligne pertinente ici est :
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
Ainsi, dans la variante "convertir tout", la regex ne se soucie pas d'être ancrée au début de la ligne ( ^
n'est pas utilisé), et chaque tabulation est son propre remplacement (plutôt que les groupes de caractères de tabulation soient traités comme un seul remplacement -- \t
vs. \t+
).
Pourquoi il a cassé l'indentation Python
Je ne sais pas quel fichier vous avez utilisé, mais j'ai utilisé un fichier de test assez simple comme celui-ci, complètement indenté avec des caractères de tabulation.
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
Après avoir utilisé "Convert Tabs to Spaces", cela ressemblait à ceci :
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
Woah ! C'est maintenant un SyntaxError
. Essayez à nouveau avec "Convertir Tous Tabs to Spaces" :
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
Cela se produit parce que dans le premier cas, les groupes d'onglets sur la marge gauche sont, comme une collection réduit à une indentation basée sur l'espace. Puisque la regex est ^\t+
il importe peu que la ligne soit indentée avec 1, 2, 8, 24 tabulations... elles sont toutes remplacées par un seul niveau d'indentation, mais constitué d'espaces.
Honnêtement, je ne sais pas quel est l'intérêt de cela... cela ressemble à un bug.
Dans le second cas, chaque tabulation est convertie à la largeur équivalente basée sur l'espace (c'est-à-dire que chaque tabulation est convertie en 4 espaces, même si elle est adjacente à un autre caractère de tabulation).
C'est donc celui-là que vous voulez probablement.
Un bémol : elle n'est plus limitée à la marge de gauche (il n'y a pas de ^
anchor), donc si vous avez des caractères de tabulation intégrés ailleurs, ils seront également convertis. D'après mon expérience, ce n'est pas une pratique normale dans le code, mais pour votre information, au cas où cela aurait de l'importance pour vous.
1 votes
C'est également la réponse à la question "Comment convertir automatiquement toutes les tabulations de mon fichier Python en espaces". résout en quelque sorte l'erreur d'indentation