64 votes

Comment remplacer les tabulations par des espaces dans Atom ?

Lorsque j'ai commencé à travailler avec l'éditeur de texte Atom, j'utilisais l'indentation par tabulation mais je souhaite passer à l'indentation par 4 espaces.

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

Quel serait le moyen le plus simple de le faire ?

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

96voto

Dan Lowe Points 21696

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

Très simple ! Juste une remarque : Whitespace: Convert Tabs to Spaces supprime toutes les indentations, au moins pour les éléments suivants python des fichiers. Whitespace: Convert Spaces to Tabs et Whitespace: Convert All Tabs to Spaces sont ceux qui fonctionnent comme prévu pour moi.

0 votes

@J0ANMM Wow, vous avez raison... pour moi, il n'a pas supprimé tous les retraits dans un fichier d'exemple, mais il a fait rupture le niveau d'indentation. Cela ressemble vraiment à un bug. Je pourrais déposer un bug Atom, si j'arrive à comprendre quel est le comportement sous-jacent...

0 votes

Oui, c'est ce que je voulais dire. Je ne l'ai pas décrit correctement. Quelle est censée être la différence entre Convert Tabs et Convert All Tabs ?

14voto

J0ANMM Points 2047

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

Il suffit d'ouvrir chaque fichier, puis d'ouvrir le panneau de recherche ( cmdF en Mac).

Screenshot showing replacement of tabs by spaces

Trouver dans le tampon actuel (avec use regex option activée) :

\t

Remplacer dans le tampon actuel :

    #that being just four spaces

4 votes

' \t ne trouve aucun onglet, même lorsque l'option "utiliser l'expression rationnelle" est cochée, alors que le document contient clairement des onglets.

0voto

Weapon X Points 69

Si vous voulez remplacer les tabulations correctes, vous devez spécifier la longueur, sinon il correspondra également aux espaces simples entre les mots.

Appuyez sur ctrl+F et saisissez [ \t ]{4} sur la première ligne et 4 espaces sur la deuxième ligne ctrl-f

Ensuite, je recommanderai également d'installer le paquet python-indent pour gérer l'indentation en fonction de PEP8

0voto

Burak Points 1353

Packages -> Espace blanc -> Convertir toutes les tabulations en espaces

0voto

Packages -> Espace blanc -> Convertir toutes les tabulations en espaces

0 votes

N'ajoutez pas d'éléments tels que "cette réponse me convient" en tant que réponses distinctes.

0 votes

N'ajoutez pas "merci" en guise de réponse. Une fois que vous avez suffisamment de réputation Vous serez en mesure de vote haut questions et réponses que vous avez trouvée utile. - De la revue

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