Comment remplacer les onglets par des espaces dans Atom?
lorsque j'ai commencé à travailler avec Atom text editor, j'ai utilisé tab-indentation mais je veux passer à 4-space-indentation.
j'ai plusieurs fichiers qui doivent être mis à jour en conséquence
Quelle serait la meilleure façon de le faire?
2 réponses
Atom a un outil intégré pour cela
activez la palette de commandes (Maj Cmd P sur Mac, CtrlMaj P sous Windows / Linux) et rechercher "convert space" ou "convert tab". Vous devriez trouver ces trois commandes sont disponibles:
- Espace: Convertir les Espaces en Tabulations
- Espace: Convertir les Tabulations en Espaces
- Espace: Convertir tous les onglets en espaces
Convertir les Tabulations vs Convertir Tous les Onglets
dans les commentaires, vous avez observé que L'utilisation de "Convert Tabs to Spaces" briserait l'indentation en Python, mais " Convert Tabs aux espaces " fonctionnait correctement. Vous avez demandé quelle était la différence entre les deux est.
Je ne connaissais pas la réponse, alors j'ai cherché. Ceci est défini dans le paquet" whitespace", dont la source peut être trouvée sur Github à atom/espaces.
lib/espace.js, j'ai trouvé ceci:
'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 correspondante est ici convertTabsToSpaces
. Dans la variante "convert all", la seule différence est qu'un second argument (optionnel) est passé, et placé à true
.
return this.convertTabsToSpaces(editor, true)
en Regardant la définition de convertTabsToSpaces
, la différence est que le regex est modifié en fonction de l'état de ce booléen argument.
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 la suivante:
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
donc dans la variante "convert all", Le regex ne se soucie pas d'être ancré au début de la ligne (^
n'est pas utilisé) , et chaque onglet est son propre remplacement (plutôt que des groupes de caractères d'onglet étant traités comme un remplacement simple -- \t
vs. \t+
).
pourquoi il a cassé l'indentation Python
Je ne sais pas quel fichier vous avez utilisé, mais j'ai utilisé un assez simple un fichier test comme celui-ci, complètement indenté avec des caractères tabulaires.
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" il 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 " Convert les Tabulations en Espaces":
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 de gauche sont, comme une collection, réduit à un tiret basé sur l'espace. Puisque le regex est ^\t+
, peu importe si la ligne est en retrait avec 1, 2, 8, 24 onglets... ils sont tous remplacés par un seul niveau de retrait, mais dont les espaces.
honnêtement, Je ne sais pas à quoi ça sert... ça semble être un bug.
dans le second cas, chaque onglet est converti en largeur équivalente basée sur l'espace (c.-à-d. chaque onglet est converti en 4 espaces, même s'il est adjacent à un autre caractère d'onglet).
donc c'est celui que vous voulez probablement.
une mise en garde: ce n'est pas plus limitée à la marge de gauche (il n'y a pas de ^
anchor), donc si vous avez intégré des caractères tab ailleurs, ceux-ci seront aussi convertis. Ce n'est pas une pratique normale en code d'après mon expérience, mais pour info, au cas où cela vous importe.
une solution simple que j'ai trouvée après quelques recherches est d'utiliser l'outil "Replace All".
il suffit d'ouvrir chaque fichier, puis ouvrir le Panneau de recherche ( cmd F En Mac).
Rechercher dans le tampon courant (avec use regex
l'option est activée):
\t
Remplacer dans le tampon courant:
#that being just four spaces