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

Une réponse à “Sublime Text : détection des indentations tab/space

  1. Source des images.

    Screenshot avec les fucking tabulations
    et screenshot avec la console Sublime Text
    http://recher.pythonanywhere.com/urluth/?u=fa
    http:// www. sublimetext.com/2

    La provenance, c’est pas compliquée. C’est moi qu’ai fait les screenshot en appuyant sur le bouton « Impr Écran » de mon clavier. Du coup, j’ai mis Sublime Text comme lien. C’est ce qui me semblait le plus logique. Mais j’aurais peut-être du mettre Paint.NET, à savoir l’outil m’ayant permis de cropper les images et d’ajouter l’annotation « fucking tabulations ». Ou j’aurais peut-être dû mettre une photo de ma touche « Impr Écran ». Ou peut-être un lien vers le constructeur de mon ordinateur, qui l’a réalisé avec les standards requis pour que le système d’exploitation puisse récupérer le contenu de la mémoire vidéo et réaliser correctement le screenshot. Ou peut-être un lien vers la Nature, qui a inventé les yeux, ou Darwin, ou Einstein. Qu’est-ce qu’on s’amuse !

    Homme préhistorique utilisant Notepad
    http://recher.pythonanywhere.com/urluth/?u=fb
    https:// pearlsofprofundity.wordpress.com/2013/10/12/history-from-the-stone-age-to-the-stoned-age/

    Sérieusement, Notepad c’est vraiment du foutage de gueule. Et le plus amusant, c’est que son comportement n’a pas changé d’un poil depuis Windows 3.1. Y’a juste l’aspect visuel de la fenêtre, qui a suivi les évolutions des GUI de Windows, et peut-être quelques raccourcis claviers qui ont été ajoutés. Sinon c’est la même merdouillasse. Lorsqu’on copie-colle du texte depuis Notepad, on récupère le même découpage de texte correspondant à la taille de la fenêtre. Il faut désactiver l’option « Format – Retour automatique à la ligne » pour avoir un copié-collé du texte exact. Et lorsque l’option est activé et qu’on change la taille de la fenêtre, ça devient complètement n’importe quoi. J’ai l’impression que le découpage du texte pour l’adapter à la fenêtre est effectué avec des sauts de ligne ajoutés automatiquement et à l’arrache. Et pleins de gens continuent de se servir de cette daubasse. Parce que pleins de gens n’ont pas si tant besoin que ça de gérer des fichiers textes simples. Et c’est bien dommage car c’est quand même la base de l’informatique, voire la base du monde réel.

    Les gifs animés du test de détection d’indentation
    http://recher.pythonanywhere.com/urluth/?u=fc
    http:// gifmaker.me/

    C’est à nouveau moi qui ait fait ces images. J’ai mis comme lien le site permettant de générer des gifs animés à partir d’une suite d’images. Mais peut-être que j’aurais dû mettre le lien vers la spécification du format gif, ou le bout de code utilisé dans les navigateurs internet qui gère l’affichage et l’animation de ces images. Ou Stephen Hawking qui a inventé le temps, sans qui on ne peut pas avoir la notion d’animation. Blablabla. Qu’est-ce qu’on se re-amuse !

    CommitStrip concernant l’indentation
    http://recher.pythonanywhere.com/urluth/?u=fd
    http:// www. commitstrip.com/fr/2013/02/14/la-question-de-lindentation/

    C’est vachement bien comme blog BD, CommitStrip. Je les ais tous lu, et je lis régulièrement leurs nouvelles planches. Ça fait plaisir de voir de la production artistique qui raconte directement les choses qui me concernent. Tout cela est un peu auto-centré, mais on a bien le droit, de temps en temps. Est-ce qu’il existe des bandes dessinées qui racontent la vie des boulangers ? Des serveurs ? Des fermiers ? Ah oui, plus ou moins. Enfin pas tous. Il nous manque juste une seule chose. Une bande dessinée qui raconte la vie des chômeurs. Ça ce serait vraiment intéressant. Que font les chômeurs ? Y’aurait des planches sur la complexité administrative pour récupérer ses allocations. Le regard des autres. La notion du temps et d’occupation. Les tabous liés au chômage. Ouais, faut faire ça. Un blog chômeurstrip. Le problème, c’est que personnellement je connais pas assez de chômeur pour être en mesure de bien comprendre leur quotidien et le raconter avec exactitude. Va falloir que quelqu’un d’autre fasse ça. Y’a qu’à demander à François Bayrou, il doit être au chômage, depuis le temps.

    Femme ronde ayant posé son ventre sur le clavier
    http://recher.pythonanywhere.com/urluth/?u=fe
    http:// community.eu.playstation.com/t5/PlayStation-Off-Topic/Proof-quot-Spotter-Was-Robbed-quot/m-p/18317094#M1111494

    C’est Plump Princess. Elle est très jolie. Bon, j’ai récupéré cette image sur un forum n’ayant rien à voir avec elle, et le but du post était plutôt de la moquerie envers les femmes rondes. Alors j’ai voulu retrouver la même image sur un site un peu plus officiel, et j’ai pas trouvé. Il y a des images de Plump Princess un peu partout, mais celle-ci en particulier je la trouvais pas. Et puis j’ai fait une recherche pas Google Images, et j’ai trouvé un autre lien plus pertinent : https: //fr.pinterest.com/pin/422423640025471557/. Mais j’ai pas voulu mettre celui-là. Parce que j’ai toujours un peu de mal avec tout ce que fait Google. Mais il faut reconnaître que je ne connais pas d’autre service de recherche d’images. Ouais et j’ai fini par me faire un compte sur ce foutu pinterest, pour pouvoir explorer tous les albums de femmes rondes. Parce qu’on est obligé d’avoir un compte pour ça. M’énerve ces sites qui forcent à s’inscrire.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s