Alors voilà, vous vous êtes mis à Sublime Text 2 (http:// www. sublimetext.com/2), parce que c’est un éditeur de texte topissimissime.
Vous prévoyez de vous en servir pour un ensemble de projets et de fichiers de code existants, ayant des conventions différentes concernant les indentations en tabulations/espace. Pour diverses raisons, (justifiées ou non), vous n’avez pas envie de tout homogénéiser à grands coups de replace, alors vous avez gardé cette configuration :
"translate_tabs_to_spaces": false,
Le problème
Vous vous attelez à un projet indenté avec des espaces, vous y créez un nouveau fichier de code (mettons que ce soit du python). Dès la première définition de fonction, vous tapez manuellement les 4 espaces d’indentation, afin de bien indiquer à Sublime Text que c’est ça que vous voulez. Lorsque vous passez à la ligne suivante, c’est bien des espaces qui sont automatiquement ajoutés.
Ensuite, c’est la merde.
Pour reculer d’une indentation, vous êtes obligé d’appuyer 4 fois sur backspace. Et chaque fois que vous écrivez un if, un while ou autre, le niveau d’indentation automatiquement ajouté est écrit avec une tabulation.
Vous vous retrouvez donc avec de la cagassade comme ça :
ce qui ne manque pas de faire hurler l’interpréteur python.
Vous êtes constamment obligé de remettre manuellement des espaces. Vous ne comprenez pas pourquoi cet abruti de Sublime Text ne comprend pas la convention de ce fichier en particulier, alors que celui-ci contient déjà trouzemille lignes de code indentées bien comme il faut.
L’interrogation existentielle
La configuration de Sublime Text est définie dans différents fichiers, qui se recouvrent les uns à la suite des autres (config globale, config d’un package, d’un projet, …). Ce n’est pas toujours évident de déduire les valeurs utilisées au final. Heureusement, il est possible de les vérifier.
Vous ouvrez la console, via l’option du Menu principal « View -> Show Console », puis vous tapez fébrilement les commandes suivantes :
view.settings().get("translate_tabs_to_spaces") False view.settings().get("tab_size") 4 view.settings().get("detect_indentation") True view.settings().get("auto_indent") True view.settings().get("smart_indent") True
Tout semble normal.
Alors, vous décidez que Sublime Text n’est pas si génial que ce qu’on en dit, et vous reprenez ce bon vieux Notepad (pas Notepad++, Notepad tout court). C’est de la chiottasse, mais au moins, c’est de la chiottasse maîtrisée.
La solution
Sublime Text est capable de simplifier les ajouts et retraits d’indentation, qu’ils soient en tab ou en espace. Mais pour y parvenir, il doit préalablement déduire la convention du fichier à partir de son contenu actuel. Cette déduction n’est déclenchée qu’à l’ouverture. Comme il s’agit d’un fichier que vous aviez créé, rien n’a été déduit puisqu’il était vide au départ.
Il suffit de fermer puis réouvrir le fichier, et tout va mieux. (Pas la peine de redémarrer Sublime Text, juste l’onglet du fichier concerné). Il existe par ailleurs une commande pour relancer la déduction, mais je ne sais plus où elle est, et osef.
Il faut un nombre suffisant de lignes indentées (une dizaine) pour que cette déduction soit garantie. Naturellement, il faut qu’elles soient toutes homogènes, et si c’est des espaces, il en faut le même nombre à chaque fois.
La sodomie drosophilienne
(Ça veut dire « enculage de mouche »)
La déduction d’indentation est également déclenchée lorsqu’on copie-colle une quantité conséquente de texte dans un fichier vide. On va jouer un peu avec ça.
Créer un nouveau fichier (File -> New File, ou raccourci Ctrl+N). Copier-collez le texte suivant dedans :
def truc(): 1 2 3 4 5 6 7 8 9 0
(Il y a 10 lignes indentées, chacune avec 4 espaces).
Placez votre curseur juste après le « 0 » de la dernière ligne.
Appuyez sur « Entrée ». Une ligne indentée s’ajoute. Elle comporte 4 espaces.
Appuyez sur Backspace.
Les 4 espaces sont retirés en une seule fois et le curseur revient au début de la ligne. Sublime Text a compris que l’indentation de ce fichier est sous forme de 4 espaces. Il n’est même pas nécessaire de préciser que la syntaxe est du python. (D’ailleurs c’en est pas vraiment, car écrire des lignes ne comportant qu’un chiffre n’a que peu de sens).
Recréez ensuite un nouveau fichier. Ne repartez pas du fichier précédent, car Sublime Text lui a déjà attribué une convention.
Copier-collez le même texte mais sans la dernière ligne.
Placez votre curseur juste après le « 9 ».
Appuyez sur « Entrée ». Une ligne indentée s’ajoute. Elle comporte 4 espaces.
Appuyez sur Backspace.
Seul un espace est retiré. Sublime Text n’a pas compris que l’indentation de ce fichier est sous forme d’espaces. Il garde le comportement par défaut, qui est une indentation indéterminée.
Pour info, j’utilise Sublime Text version 2.0.2, Build 2221.
Toute cette drosophilophilie pour dire qu’avec la dernière génération d’éditeurs de texte (Sublime, Atom, …), on n’a plus vraiment besoin de se soucier du choix tabulations/espaces. J’ai récemment créé un nouveau projet python + django, j’ai passé 3 jours dessus avant de m’apercevoir que certains fichiers étaient indentés avec des espaces et d’autres avec des tabulations !
Ça ne dérange ni python, ni Sublime Text, ni la personne qui code d’avoir des fichiers mixés. Cependant, il est toujours nécessaire d’appliquer la même convention au sein d’un même fichier, et il vaut mieux comprendre avec précision le comportement et l’intelligence de ces nouveaux éditeurs de texte.
Malgré ces petites gênes qui subsistent, il semble donc que la rivalité millénaire entre les tabulistes et les espaciens s’estompe progressivement, ce qui est à mon avis une bonne chose.
Le réconfort
Maintenant que vous connaissez cette subtilité, à vos claviers, mesdames les codeuses et messieurs les codeurs !