web-dev-qa-db-fra.com

Comment remplacer des tabulations par des espaces dans Atom?

Quand j'ai commencé à travailler avec l'éditeur de texte Atom), j'ai utilisé tab-indentation mais je souhaite passer à 4-space-indentation.

J'ai plusieurs fichiers qui doivent être mis à jour en conséquence

Quel serait le moyen le plus simple de le faire?

43
J0ANMM

Atom a un outil intégré pour cela

Activer la palette de commandes (ShiftCmdP sur Mac, CtrlShiftP sous Windows/Linux) et recherchez "convert space" ou "convert tab". Vous devriez trouver ces trois commandes sont disponibles:

  • Espace blanc: convertir des espaces en onglets
  • Espace blanc: convertir des onglets en espaces
  • Espace blanc: convertir tous les onglets en espaces

Convertir les onglets et convertir tous les onglets

Dans les commentaires, vous avez constaté que l'utilisation de "Convertir des onglets en espaces" romprait l'indentation en Python, mais que "Convertir tous les onglets en espaces" fonctionnait correctement. Vous avez demandé quelle est la différence entre les deux.

Je ne connaissais pas la réponse, alors je suis allée chercher. Ceci est défini dans le paquet "whitespace", dont la source peut être trouvée sur Github à atom/whitespace .

En regardant dans lib/whitespace.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 constater, 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 sur true.

return this.convertTabsToSpaces(editor, true)

En regardant la définition de convertTabsToSpaces, la différence est que la regex 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)

Donc, dans la variante "convert all", l'expression régulière ne se soucie pas d'être ancrée 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 de tabulation traités comme un seul remplacement - \t contre. \t+).

Pourquoi il a cassé Python indentation

Je ne sais pas quel fichier vous avez utilisé, mais j'ai utilisé un fichier de test assez simple comme celui-ci, complètement mis en retrait 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é "Convertir les onglets en espaces", voici à quoi ça ressemble:

import foo

class Foo():
    def __init__(self):
    self.foo = True

    def bar(self, a, b):
    return a + b

Woah! C'est maintenant un SyntaxError. Réessayez avec "Convertir Tous les onglets ":

import foo

class Foo():
    def __init__(self):
        self.foo = True

    def bar(self, a, b):
        return a + b

Cela se produit car, dans le premier cas, les groupes d’onglets de la marge de gauche sont, en tant que collection, réduits à un retrait basé sur l’espace. Puisque la regex est ^\t+ _, peu importe que la ligne soit indentée avec 1, 2, 8, 24 tabulations ... elles sont toutes remplacées par un seul niveau d’indentation, mais composé d’espaces.

Honnêtement, je ne sais pas à quoi ça sert ... ça a l'air d'un bug.

Dans le second cas, chaque onglet est converti à la largeur équivalente basée sur l’espace (c’est-à-dire que chaque onglet est converti en 4 espaces, même s’il est adjacent à un autre caractère de tabulation).

C'est donc celle que vous voulez probablement.

Une mise en garde: il n'est plus limité à la marge gauche (il n'y a pas de ^ _ ancre), donc, si vous avez incorporé des caractères de tabulation ailleurs, ceux-ci seront également convertis. D'après mon expérience, ce n'est pas une pratique courante dans le code, mais à titre d'information, au cas où cela vous importerait.

69
Dan Lowe

Une solution simple que j'ai trouvée après quelques recherches utilise l'outil "Remplacer tout".

Ouvrez simplement chaque fichier, puis ouvrez le panneau de recherche (cmdF sous Mac).

Screenshot showing replacement of tabs by spaces

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

\t

Remplacer dans le tampon actuel:

    #that being just four spaces
13
J0ANMM