Sublime Text : détection des indentations tab/space

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 :

screenshot_space_tab_02,

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

sublime_text_console

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.

Notepad à l'apogée de son utilisation

Notepad à l’apogée de son utilisation

 

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

copypast_ok

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.

copypast_fail

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.

Strips-Indentation-600-final

 

Le réconfort

Maintenant que vous connaissez cette subtilité, à vos claviers, mesdames les codeuses et messieurs les codeurs !

moretomeasure_by_fatty_lover-d5stsk4

Tondre un yak

Qu’est-ce donc que cela ?

En voici un exemple :

Il y a deux mois, j’ai voulu retirer des bitcoins pour faire des dons, ce qui a provoqué les problèmes que vous connaissez. J’ai alors créé mon propre service personnel de monétisation de liens (et plop). Ce service est hébergé sur pythonanywhere, lieu où officie également mon expressionotron. Cet ancien projet m’est revenu à l’esprit. Je me suis rappelé que j’avais promis une seconde version avec un panel de phrases élargi dans le cas où j’aurais suffisamment de followers sur le compte twitter associé. Je suis allé vérifier et il se trouve que j’ai récemment gagné le surcroît nécessaire à cette mise à jour. Youpi. Donc là je suis en train de bosser sur l’expressionotron, alors que l’action de départ consistait simplement à transférer des sous.

Et c’est pas fini, parce que pendant que je me penchais d’arrache-pied sur cet expressionotron, je me suis pris la tête avec la notion de package en python, et je me suis dit que ça mériterait un petit article ici ou sur le blog de Sam et Max, article auquel je m’attellerais ultérieurement, voire plus tard.

C’est ça la tonte de yak. On veut faire un tout petit truc au départ, censé prendre « juste 2 minutes ». Mais on s’aperçoit qu’il faut faire un autre petit truc avant, au sujet duquel on s’aperçoit qu’il faut faire un autre-autre truc avant, et ainsi de suite. On finit par devoir réaliser un truc pharaonique n’ayant aucun rapport avec le truc initial, et en général, ce truc, c’est tondre un yak.

La vie est faite d’enchaînement de ce genre. Mais j’ai l’impression que les activités liées à l’informatique sont encore plus sujettes à ça. Ça mériterait une réflexion plus approfondie, dans laquelle je ne me lancerais pas, sinon c’est pas un yak que je vais tondre, mais le troupeau entier.

milos-yak-heifer-grunniens-_med

J’ai découvert ce concept dans un commentaire de commitStrip (http:// www. commitstrip.com/fr/2013/09/24/yen-a-pour-2-minutes/?setLocale=1).

Son origine se trouve (à priori) ici (http:// projects.csail.mit.edu/gsb/old-archive/gsb-archive/gsb2000-02-11.html).

Bien évidemment, ça émane de gens n’ayant rien d’autre à foutre que de disserter sur la façon dont on peut perdre du temps, ce qui est en soi une perte de temps, ha ha ha, so meta. Ces gens sont des chercheurs du MIT. Moi aussi je suis chercheur, un chercheur tellement meta que j’en suis encore à chercher mon domaine de recherche.

À côté de ça, voilà presque 4 mois que j’ai changé de crémerie, j’ai promis un article à ce sujet que je n’ai toujours pas commencé. Mais tout va bien, c’est pas de la procrastination, puisque je fais quand même des trucs !! (C’est juste pas les bons trucs).

Allez, je me remet dans le code de ce génial expressionotron.

Je vous laisse avec une femme exerçant le métier de cowgirl. C’est plus simple que d’être informaticien-ne, car les vaches ont moins besoin d’être tondues que les yaks.

b5BVIqA