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?

31
demandé sur J0ANMM 2017-01-25 12:34:35

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.

47
répondu Dan Lowe 2017-06-22 22:27:35

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).

Screenshot showing replacement of tabs by spaces

Rechercher dans le tampon courant (avec use regex l'option est activée):

\t

Remplacer dans le tampon courant:

    #that being just four spaces
9
répondu J0ANMM 2017-01-25 17:03:24