URL: https://linuxfr.org/news/comparaison-critique-de-systemes-d-invite-de-commande Title: Comparaison critique de systĂšmes d'invite de commande Authors: nojhan Ysabeau đŸ§¶ et gUI Date: 2023ćčŽ11月15æ—„T21:24:52+01:00 License: CC By-SA Tags: shell, prompt, ligne, commande, design et terminal Score: 61 Cet article a Ă©tĂ© Ă©crit Ă  l’occasion de [l’imminence de la sortie de la version 2.2 de Liquid Prompt](https://github.com/liquidprompt/liquidprompt/releases/tag/v2.2.0-rc.1) et vous aurez l’occasion de pouvoir en discuter avec son auteur lors des journĂ©es [Toulouse Capitole du Libre](https://capitoledulibre.org/), qui proposera une confĂ©rence sur [Liquid Prompt : repenser en profondeur le design du prompt shell](https://cfp.capitoledulibre.org/cdl-2023/talk/KYLR9C/). # TL;DR: rĂ©sumĂ© Si vous utilisez la ligne de commande, vous gagneriez Ă  utiliser un bon systĂšme d’invite de commande (« prompt ») au lieu de la configuration par dĂ©faut. Parmi les sept systĂšmes de prompt les plus connus, certains sont mieux conçus et d’autres prennent mieux en charge certaines fonctionnalitĂ©s. Mes principales conclusions sont les suivantes : - Si vous recherchez le systĂšme qui offre la meilleure expĂ©rience globale Ă  l’utilisateur, vous devriez probablement utiliser Liquid Prompt. - Si la faible latence est plus importante pour vous que les fonctionnalitĂ©s, vous devriez miser sur PowerLevel10k. - Si vous ĂȘtes un dĂ©veloppeur qui jongle en permanence avec plusieurs jeux d’outils, Starship semble ĂȘtre la meilleure option pour vous. Cet article est divisĂ© en deux parties principales : la premiĂšre introduit le sujet et prĂ©sente les principales Ă©valuations ; la deuxiĂšme partie entre dans les dĂ©tails des designs et des fonctionnalitĂ©s. Enfin, la conclusion donne des conseils sur le choix d’un prompt et propose quelques idĂ©es sur l’avenir des systĂšmes de prompts. ---- ---- # Introduction Avertissement : je suis l’auteur original de Liquid Prompt. Au dĂ©but, j’ai fait cette Ă©tude approfondie pour savoir si je devais continuer Ă  m’intĂ©resser Ă  Liquid Prompt ou passer Ă  un autre systĂšme. Je vais essayer d’expliquer ici pourquoi je pense toujours que c’est l’un des meilleurs systĂšmes de prompt du marchĂ©. Tous les systĂšmes de prompt comparĂ©s ici sont de bons logiciels libres, je me concentrerai donc ici sur l’utilitĂ© de leurs fonctionnalitĂ©s, plutĂŽt que de m’attarder sur la qualitĂ© du code ou la facilitĂ© d’installation. ## Qu’est-ce qu’un prompt ? Il existe deux types d’informaticien·ne·s : celleux qui utilisent la ligne de commande et celleux qui sont Ă  la retraite. MĂȘme les dĂ©veloppeurs qui adoptent des interfaces de dĂ©veloppement trĂšs intĂ©grĂ©es disposent d’une sorte de terminal dans certains panneaux de leur IDE. Qu’on le veuille ou non, l’interprĂ©teur de commandes fait partie intĂ©grante de la vie quotidienne de la plupart des personnes qui attendent de leur ordinateur qu’il travaille pour elles. L’interprĂ©teur de commandes (le « shell ») a accĂšs Ă  de nombreuses informations sur l’ordinateur. Et la plupart de ces informations concernent l’état actuel de l’environnement de travail, ce qui est du plus haut intĂ©rĂȘt pour l’utilisateur. Cependant, par dĂ©faut, le shell n’affiche que trĂšs peu d’informations, Ă  moins que vous ne les demandiez expressĂ©ment. En outre, le seul endroit de l’écran disponible pour l’affichage permanent de quoi que ce soit est le prompt. Le prompt est cette chaine de caractĂšres affichĂ©e juste devant la ligne oĂč vous tapez vos commandes. Dans la configuration par dĂ©faut la plus courante, elle n’affiche que trois informations : l’utilisateur, le nom d’hĂŽte et le chemin d’accĂšs `user@hostname:path $ `. Mais il peut en afficher davantage ! C’est l’objectif des systĂšmes de prompt. Ces prompts (pour faire court) ajoutent en fait beaucoup d’informations Ă  cette partie de la ligne de commande. Par exemple, la fonctionnalitĂ© la plus courante est d’afficher l’état du dĂ©pĂŽt Git dans lequel se trouve l’utilisateur. ## Les concurrents Comme c’est souvent le cas avec les logiciels destinĂ©s aux utilisateurs chevronnĂ©s, le marchĂ© est trĂšs fragmentĂ© : il existe une tonne de prompts disponibles. Beaucoup de gens semblent aimer programmer leur prompt Ă  partir de zĂ©ro et le dĂ©poser sur GitHub. Dans le cadre de cet article, je n’ai pris en compte que sept prompts. Parmi les plus populaires, d’aprĂšs le nombre d’articles de fans trouvĂ©s par Google et d’aprĂšs les Ă©toiles sur GitHub : - [PowerLevel10k](https://github.com/romkatv/powerlevel10k), le plus populaire, - [Starship](https://github.com/starship/starship), celui programmĂ© en Rust, et [Spaceship](https://github.com/spaceship-prompt/spaceship-prompt), son origine (dans ce qui suit, les deux sont considĂ©rĂ©s comme un seul systĂšme, Ă©tant donnĂ© leur similaritĂ©, mais vous voudrez probablement utiliser Starship de toute façon), - [Powerline](https://github.com/powerline/powerline), qui fait des lignes de statut, - [Pure](https://github.com/sindresorhus/pure), le systĂšme minimal au succĂšs surprenant, - [Oh-My-Posh](https://ohmyposh.dev), le systĂšme portable, - [Liquid Prompt](https://github.com/nojhan/liquidprompt), le plus ancien (historiquement parlant). Il convient de noter que le nombre d’étoiles n’est pas nĂ©cessairement liĂ© Ă  l’ñge du logiciel. Par exemple, Liquid Prompt a Ă©tĂ© lancĂ© en 2010, tandis que Powerlevel* a Ă©tĂ© lancĂ© en 2015 et Starship en 2019. ## Ce dont vous avez besoin, c’est du design de l’information La raison d’ĂȘtre d’un prompt c’est qu’il est utile d’avoir un accĂšs immĂ©diat Ă  l’état actuel du systĂšme. Le fait de voir un changement d’état Ă  l’endroit mĂȘme oĂč l’utilisateur regarde habituellement est un trĂšs bon retour d’information sur ses actions. Mais, bien entendu, ce retour d’information ne doit pas entraver le travail de l’utilisateur. Les Ă©tats doivent ĂȘtre choisis et affichĂ©s en fonction de leur importance pour le travail de l’utilisateur. Plus prĂ©cisĂ©ment, un bon prompt est un prompt qui est : - **focus** : il vise les Ă©tats qui sont rĂ©ellement utiles Ă  l’utilisateur au cours d’une session de travail, - **transparent** : il n’entraĂźne pas de friction avec le processus de travail de l’utilisateur, - **ciblĂ©** : il vise des Ă©tats qui peuvent changer d’eux-mĂȘmes ou ĂȘtre changĂ©s par l’utilisateur, - **mesurĂ©** : il tient compte du fait que certains Ă©tats changent moins souvent que d’autres (et Ă©vite ainsi d’ĂȘtre une simple collection d’états qui ne changent que rarement), - **accentuĂ©** : il rend plus visible le retour d’information concernant les changements d’état les plus importants, tout en ne polluant pas la visibilitĂ© des Ă©tats stables/anecdotiques, - **configurable** : il est facile d’adapter immĂ©diatement l’affichage des informations, si nĂ©cessaire. En d’autres termes, un bon systĂšme d’alerte doit ĂȘtre bien conçu. Mon Ă©valuation de la conception gĂ©nĂ©rale des candidats est rĂ©sumĂ©e dans le tableau suivant : | Prompt | Focus | Transparent | CiblĂ© | MesurĂ© | AccentuĂ© | Configurable | | ------------- | ------- | -------- | ------ | -------- | ----------- | ------------ | | Liquid Prompt | 🌟🌟🌟 | ⭐⭐ | ⭐⭐ | 🌟🌟🌟 | 🌟🌟🌟 | 🌟🌟🌟 | | PowerLevel10k | ⭐⭐ | 🌟🌟🌟 | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐ | | Oh-My-Posh | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐ | ⭐⭐ | | Pure | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐ | ⭐⭐ | | *ship | ⭐ | ⭐⭐ | ⭐ | ⭐ | ⭐ | ⭐⭐ | | Powerline | ⭐ | ⭐⭐ | ⭐ | ⭐ | ⭐ | ⭐ | La section « design » de l’article (voir ci-dessous) explique plus en dĂ©tail pourquoi. ## Toutes les fonctionnalitĂ©s ne naissent pas Ă©gales Quels types de fonctionnalitĂ©s nos six candidats proposent-ils ? On peut considĂ©rer six catĂ©gories (de la plus importante Ă  la moins importante) : - **l’essentiel du shell** : les fonctionnalitĂ©s que l’on trouve habituellement dans un prompt classique (chemin, utilisateur, codes de sortie...), qui sont utiles au quotidien (tĂąches, capteurs, intĂ©gration de multiplexeurs...), ou qui sont gĂ©nĂ©ralement considĂ©rĂ©es comme importantes (thĂšmes...). - la **gestion de version** : Git, Mercurial, etc. - **environnements** : dĂ©tection de configuration dynamique (virtual env, variables shell, conteneurs...). - **versions des outils** : version actuelle d’outils spĂ©cifiques (langages de programmation, chaines de construction, outils...). - **fonctions diverses** : fonctions liĂ©es au shell considĂ©rĂ©es comme moins importantes (rĂ©seau, titre du terminal, liens hypertextes...). - **services** : services fonctionnant en permanence, en ligne ou sur la machine (musique, mĂ©tĂ©o...). Ces catĂ©gories sont dĂ©limitĂ©es en fonction de l’utilisation principale du terminal : - Les fonctionnalitĂ©s de la catĂ©gorie « l’essentiel du shell » sont celles dont vous aurez le plus souvent besoin, quoi que vous fassiez dans votre terminal. - Si vous ĂȘtes programmeur, vous porterez une attention particuliĂšre aux catĂ©gories *gestion de version* et *environnements*. - Si vous ĂȘtes dĂ©veloppeur, la catĂ©gorie *version des outils* vous intĂ©ressera Ă©galement. - Si vous faites de l’administration systĂšme, la catĂ©gorie *divers* peut contenir des fonctionnalitĂ©s marginalement intĂ©ressantes. - Si vous avez besoin de fonctionnalitĂ©s dans la catĂ©gorie des services, vous avez probablement mal compris ce qu’est une interface de ligne de commande, ou vous recherchez une barre d’état (ce qu’un systĂšme de prompt peut ĂȘtre). Mon Ă©valuation de la prise en charge globale de chaque ensemble de fonctionnalitĂ©s est rĂ©sumĂ©e dans le tableau suivant : | Prompt | Essentiels | Gestion de version | Environnements | Versions d’outils | Divers | Services | | ------------- | ---------- | --------------- | ------------ | -------- | ------ | -------- | | Liquid Prompt | 🌟🌟🌟 | 🌟🌟🌟 | 🌟🌟🌟 | ⭐ | ⭐⭐ | _ | | *ship | ⭐⭐ | ⭐⭐ | 🌟🌟🌟 | 🌟🌟🌟 | ⭐ | _ | | PowerLevel10k | ⭐⭐ | ⭐ | 🌟🌟🌟 | ⭐⭐ | ⭐⭐ | ⭐ | | Oh-My-Posh | ⭐ | ⭐⭐ | ⭐ | ⭐⭐ | ⭐ | ⭐⭐ | | Powerline | ⭐ | ⭐ | ⭐ | _ | ⭐⭐ | 🌟🌟🌟 | | Pure | ⭐ | ⭐ | _ | _ | _ | _ | La section « fonctionnalitĂ©s » ci-dessous explique en dĂ©tail comment certains prompts prennent en charge certaines de ces catĂ©gories. # Design Chaque systĂšme de prompt possĂšde une culture sous-jacente, nĂ©e de son histoire, qui transparait dans sa conception. Par exemple, Powerline a eu un impact considĂ©rable sur l’adoption de caractĂšres supplĂ©mentaires dans les polices « patchĂ©es ». Liquid Prompt a ciblĂ©, dĂšs le dĂ©but, des caractĂ©ristiques proches du shell lui-mĂȘme, tout en mettant l’accent sur le design. D’un autre cĂŽtĂ©, PowerLevel10k a Ă©tĂ© conçu pour ĂȘtre aussi rapide que possible. Étonnamment, Starship a Ă©galement commencĂ© avec la promesse d’ĂȘtre rapide, bien qu’il ne se rapproche mĂȘme pas de PowerLevel10k (un bon exemple de la façon dont l’impact des langages est surestimĂ©). Il rassemble cependant une grande communautĂ©, qui Ă  son tour fournit des tonnes d’outils de support. A titre de contre-exemple, Pure a dĂ©marrĂ© sur la promesse d’ĂȘtre ascĂ©tique en termes de fonctionnalitĂ©s, et s’en est tenu Ă  cette idĂ©e. ## Si vous vous sentez sexy, vous avez l’air sexy En ce qui concerne le design, les prompts candidats peuvent ĂȘtre rĂ©partis en trois catĂ©gories : - ceux qui soutiennent que le plus simple est le mieux (Pure et *ship), - ceux qui aiment le look classique des « chevrons » (Powerline et Oh-My-Posh), - ceux qui accordent une attention particuliĂšre au design (Liquid Prompt et PowerLevel10k). L’équipe de Pure, par exemple, affirme trĂšs clairement qu’il est « joli et minimal ». Et par joli, elle entend « livrĂ© avec le parfait caractĂšre de prompt » (sic, c’est « ❯ ») et utilise des couleurs pastel. Son aspect par dĂ©faut est assez clairement partagĂ© avec Starship, mĂȘme s’il permet de configurer certains thĂšmes en utilisant Ă©galement le look chevrons. Dans la documentation de cette catĂ©gorie de design de prompts, il n’y a pas beaucoup d’explications sur la raison pour laquelle les choses sont affichĂ©es (ou non). La deuxiĂšme catĂ©gorie suit plus ou moins la mĂȘme philosophie, en pensant seulement que ce qui est joli, c’est d’avoir un arriĂšre-plan colorĂ© au lieu d’un avant-plan, d’utiliser une police de caractĂšres patchĂ©e pour sĂ©parer joliment les segments, et d’utiliser des icĂŽnes partout. Bien entendu, vous trouverez des systĂšmes permettant une certaine configuration des icĂŽnes ou des couleurs, afin de reproduire l’un ou l’autre style (Starship et Oh-My-Posh proposent des thĂšmes dans les deux styles, Liquid Prompt et PowerLevel10k ont des thĂšmes reproduisant les deux, fonctionnalitĂ©s comprises). La derniĂšre catĂ©gorie, cependant, va plus loin dans les dĂ©tails lorsqu’il s’agit d’expliquer pourquoi elle montre les choses de telle ou telle maniĂšre, et permet plus gĂ©nĂ©ralement un ensemble plus variĂ© de thĂšmes. PowerLevel10k va jusqu’à fournir un assistant de configuration pour construire le thĂšme que vous prĂ©fĂ©rez, en combinant plusieurs caractĂ©ristiques (nombre de lignes, caractĂšre de sĂ©paration, etc.) Cependant, en dehors des capacitĂ©s techniques impressionnantes, l’approche globale de la conception consiste Ă  afficher ce qui doit ĂȘtre affichĂ© sous forme de segments colorĂ©s flashy avec des icĂŽnes. Liquid Prompt fournit des thĂšmes prĂȘts Ă  l’emploi et dispose de l’ensemble le plus diversifiĂ©. Certains de ses thĂšmes n’ont pas d’équivalent chez les autres systĂšmes, et changent beaucoup de la « sĂ©rie de segments » de tous les autres prompts. ## Un segment pour les gouverner tous Un exemple intĂ©ressant de l’importance de l’approche de design est la façon dont Powerline et Liquid Prompt indiquent Ă  l’utilisateur qu’il se trouve dans une session multiplexĂ©e (ce sont les deux seuls Ă  disposer de cette fonctionnalitĂ©). Les multiplexeurs de terminaux sont des systĂšmes qui permettent d’avoir plusieurs sessions permanentes sur une machine, et de les dĂ©tacher/attacher Ă  volontĂ©. Les plus connus sont screen et tmux. Powerline affichera un segment colorĂ© indiquant le nombre de clients tmux attachĂ©s Ă  la session. Liquid Prompt a divisĂ© son support en deux informations diffĂ©rentes : il affichera d’abord le nombre de sessions dĂ©tachĂ©es, et colorera ensuite les crochets entourant le noyau de l’invite (nom d’utilisateur, hĂŽte, chemin) s’il se trouve actuellement dans une session multiplexeur. L’indice visuel est subtil, mais si l’on y rĂ©flĂ©chit, il est logique, car c’est « autour » de ce qui change avec la connexion. Il n’est pas nĂ©cessaire d’utiliser beaucoup d’espace pour rappeler Ă  l’utilisateur cette information, qui sera constante au cours d’une session de travail. Un autre exemple est la façon dont Starship et Liquid Prompt indiquent que sudo est actif. Starship affichera une icĂŽne (d’un assistant), tandis que Liquid Prompt changera la couleur de la marque d’invite, prĂšs de l’endroit oĂč l’utilisateur tape des commandes, puisque les informations d’identification sudo peuvent avoir un impact considĂ©rable sur leur effet. Le mĂȘme type de diffĂ©rence se produit lors d’une connexion SSH : Starship affiche une autre icĂŽne, Ă  cĂŽtĂ© du nom d’hĂŽte. Liquid Prompt affiche le nom d’hĂŽte avec sa propre couleur. Les deux peuvent ĂȘtre configurĂ©s pour n’afficher le nom d’hĂŽte que lors d’une connexion via SSH. Oh-My-Posh affiche un segment avec une icĂŽne, et PowerLevel10k affiche Ă  la fois le nom d’utilisateur et le nom d’hĂŽte sous SSH, mais n’indique pas si l’utilisateur a Ă©tĂ© commutĂ© localement, comme les autres. La mĂȘme approche s’applique Ă  l’affichage des droits d’écriture ou du support X11 : Liquid Prompt change la couleur d’un caractĂšre existant, tandis que les autres prompts ont tendance Ă  ajouter un nouveau segment/une nouvelle icĂŽne. Vous pouvez commencer Ă  voir la tendance ici : la plupart des prompts ont Ă©tĂ© conçues avec l’idĂ©e qu’un Ă©tat atomique doit ĂȘtre ajoutĂ© Ă  la liste des Ă©tats, ou non. En d’autres termes, ils ont tendance Ă  ajouter un nouveau segment (et/ou une nouvelle icĂŽne) Ă  la liste des segments. Liquid Prompt est peut-ĂȘtre le seul Ă  avoir rĂ©flĂ©chi Ă  l’idĂ©e de maximiser la rĂ©utilisation des indices visuels et Ă  les positionner avec prĂ©caution. Essentiellement, la plupart des systĂšmes de prompts donnent la prioritĂ© Ă  la question « saviez-vous que ? » (par exemple, « saviez-vous que vous avez la version 3.14 de Python ? ») tandis que Liquid Prompt donne la prioritĂ© Ă  la question « vous devriez noter que » (par exemple, « vous devriez noter qu’il est temps de git pull »). ## La force rĂ©side dans la diversitĂ©, pas dans la similitude Bien entendu, la plupart des systĂšmes de prompts ont en commun le fait que de nombreux Ă©lĂ©ments sont configurables. Un utilisateur peut rĂ©organiser ce qui est affichĂ© et changer complĂštement le *look and feel* de son message. C’est flagrant quand on regarde la diversitĂ© des thĂšmes compatibles. Ici, Oh-My-Posh a fait beaucoup d’efforts pour promouvoir un trĂšs grand nombre de thĂšmes. En plus des prompts *ship, ils utilisent un langage de configuration dĂ©claratif qui prĂ©tend ĂȘtre le moyen le plus simple d’assembler un nouveau thĂšme. Je vois deux problĂšmes Ă  cette idĂ©e, qui semble ĂȘtre trĂšs rĂ©pandue parmi les informaticiens, mĂȘme loin de la configuration des invites (pensez aux systĂšmes de construction, par exemple) : 1. la simplicitĂ© ne passe pas Ă  l’échelle, 2. elle introduit trop de contraintes et limite l’innovation. ### La simplicitĂ© ne passe pas Ă  l’échelle Le premier problĂšme est relativement Ă©vident si vous essayez d’interprĂ©ter une configuration de prompt complĂšte, par exemple cette configuration alĂ©atoire de [Oh-My-Posh/atomicBit](https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/themes/atomicBit.omp.json) : ``` <#ffffff>[{{ .HEAD }}{{ if .Staging.Changed }}<#00aa00> \u25cf {{ .Staging.String }}{{ end }}{{ if .Working.Changed }}<#d75f00> \u25cf {{ .Working.String }}{{ end }}<#ffffff>]-" ``` Je ne fais mĂȘme pas de sĂ©lection ; j’ai choisi celui-ci parce qu’il est en fait plus simple que le modĂšle par dĂ©faut. Que fait-elle en rĂ©alitĂ© ? Je ne suis pas sĂ»r de vouloir faire les efforts nĂ©cessaires pour le comprendre. Par contre, je peux trĂšs bien voir l’intĂ©rĂȘt de faire la mĂȘme chose en script shell, avec des instructions if/then communĂ©ment comprises, au lieu d’une soupe de parenthĂšses en notation polonaise inversĂ©e. Je pense que, dans Liquid Prompt, cela ressemblerait Ă  (non testĂ©, juste ici pour donner une idĂ©e) : ``` LP_COLOR_CHANGES=$GREEN LP_COLOR_COMMITS=$MAGENTA lp_git="" if _lp_vcs_head_status; then lp_git+="$lp_vcs_head_status" fi if _lp_vcs_unstaged_lines; then lp_git+="$LP_COLOR_CHANGES â—‹ă—ă‚ăŸă‚‹+$lp_vcs_unstaged_i_lines/-$lp_vcs_unstaged_d_lines" fi if _lp_vcs_commits_off_remote; then lp_git+="$LP_COLOR_COMMITS â—‹ă—ă‚ăŸă‚‹+$lp_vcs_commit_ahead$NO_COL/$LP_COLOR_COMMITS_BEHIND-$lp_vcs_commit_behind$NO_COL" fi ``` Notez que la logique d’affichage (ou non) est dĂ©couplĂ©e du schĂ©ma de coloration. Cela ne vous semble peut-ĂȘtre pas plus simple, mais au moins vous pouvez le lire sans avoir mal Ă  la tĂȘte, et il me semble que vous pouvez l’adapter plus facilement Ă  un plus grand nombre de cas d’utilisation, et qu’il a une granularitĂ© plus fine sur l’information qu’il peut afficher. Maintenant, tout comme il est trĂšs difficile de concevoir de bons systĂšmes de *build* (qui sont un mĂ©lange de programmes dĂ©claratifs et impĂ©ratifs), c’est un problĂšme notoirement difficile que de concevoir un systĂšme de configuration (pour les mĂȘmes raisons). Ne soyez donc pas trop durs avec les dĂ©veloppeurs, il n’y a pas de solution miracle. ### DĂ©claration contre Innovation Le deuxiĂšme problĂšme se manifeste dans la diversitĂ© des thĂšmes que les gens peuvent produire dans la pratique. La [liste des thĂšmes disponibles pour Oh-My-Posh](https://ohmyposh.dev/docs/themes) est impressionnante. Il ne fait aucun doute que l’approche dĂ©clarative incite les gens Ă  crĂ©er des thĂšmes. Toutefois, lorsque l’on parcourt la longue liste, il est Ă©vident qu’ils se ressemblent tous. Il ne faut pas s’attendre Ă  des designs trĂšs diffĂ©rents avec ce prompt, ce ne sont que des listes de segments colorĂ©s. Ici, Liquid Prompt prĂ©sente une diffĂ©rence intĂ©ressante. Vous pouvez reconfigurer les thĂšmes avec l’approche classique `clĂ©=valeur`, mais plus gĂ©nĂ©ralement, les thĂšmes sont de purs scripts shell qui *arrangent* les informations disponibles. Cela permet toutes sortes de subtilitĂ©s, et plus gĂ©nĂ©ralement d’afficher n’importe quelle information sous n’importe quelle forme, pour n’importe quelle combinaison d’états, ce qui est totalement impossible Ă  faire de maniĂšre efficace avec une approche dĂ©clarative. Par ailleurs, l’approche utilisĂ©e par Liquid Prompt permet de combiner facilement des configurations (appelĂ©es *presets*). Ainsi, vous pouvez utiliser un thĂšme, puis utiliser un *preset* pour modifier certaines de ses couleurs (par exemple si vous ĂȘtes daltonien). L’impact de cette approche est visible dans la [diversitĂ© des thĂšmes proposĂ©s par Liquid Prompt](https://github.com/liquidprompt/liquidprompt/wiki/Themes). Il ne s’agit pas seulement de changer les couleurs et les icĂŽnes, mais de modifier l’ensemble de l’expĂ©rience utilisateur. Par exemple, le thĂšme [GitCrux](https://github.com/nojhan/lp-gitcrux) reprend le thĂšme par dĂ©faut, mais ajoute des indications visuelles sur les commandes Git qui peuvent ĂȘtre utiles compte tenu de l’état du rĂ©fĂ©rentiel actuel. Pour ce thĂšme, Liquid Prompt est plutĂŽt un fournisseur de donnĂ©es, un* moteur de thĂšme* qu’il utilise Ă  ses propres fins. On peut Ă©galement voir une certaine innovation dans le [thĂšme DotMatrix](https://github.com/nojhan/lp-dotmatrix), oĂč certaines informations sont affichĂ©es non pas avec des icĂŽnes/segments, mais simplement avec des espaces orientĂ©s. Par exemple, dans Dotmatrix, lorsque vous ĂȘtes connectĂ© via SSH, un espace entourĂ© de flĂšches vers la gauche est insĂ©rĂ© entre le type de terminal (c’est-Ă -dire une session purement textuelle ou graphique) et l’utilisateur. Il en va de mĂȘme pour indiquer une session multiplexĂ©e : un espace est insĂ©rĂ© entre l’utilisateur et le nom d’hĂŽte. Le thĂšme utilise la mĂȘme idĂ©e pour le contrĂŽle de version, et pour indiquer que des commits attendent d’ĂȘtre poussĂ©s (flĂšches espacĂ©es vers la gauche — lĂ  oĂč se trouve le serveur) ou retirĂ©s (flĂšches espacĂ©es vers la droite — lĂ  oĂč *vous* vous trouvez). Ce type de conception nĂ©cessiterait une refonte complĂšte du moteur de thĂšme dans d’autres systĂšmes de prompt, mais ne requiert qu’un dĂ©veloppeur motivĂ© connaissant un peu de shell avec Liquid Prompt. # FonctionnalitĂ©s Le design, c’est bien, mais en fin de compte, les logiciels doivent avoir les fonctionnalitĂ©s qui comptent. Vous savez, genre avoir quelque chose Ă  afficher. Pour entrer dans les dĂ©tails des fonctionnalitĂ©s, j’ai dressĂ© la liste de toutes les fonctionnalitĂ©s de chaque systĂšme d’invite, puis j’ai vĂ©rifiĂ© lesquels les prenaient Ă©galement en charge. J’ai ensuite Ă©valuĂ© la qualitĂ© de cette prise en charge : 0. aucune prise en charge, 1. prise en charge et conception de base, 2. bon ensemble de fonctionnalitĂ©s, mais ergonomie mĂ©diocre, 3. bonnes fonctionnalitĂ©s et ergonomie. Les rĂ©sultats sont prĂ©sentĂ©s dans le tableau suivant, et les rĂ©flexions sur ce que cela signifie dans les sections suivantes. Dans ce tableau, les nombres dans les cellules indiquent le niveau de qualitĂ© de la fonctionnalitĂ©. La popularitĂ© est la somme des niveaux de la ligne. Les lignes « support » correspondent Ă  la somme des niveaux de la colonne, pour chaque catĂ©gorie. Les catĂ©gories sont triĂ©es de haut en bas en fonction de leur popularitĂ© moyenne. Les projets sont triĂ©s de gauche Ă  droite, en fonction de leur score de support dans la section des essentiels du shell. Les sections suivantes abordent certains des ensembles de fonctionnalitĂ©s prĂ©sentĂ©s dans ce tableau et les comparaisons entre les systĂšmes d’invite. [Tableau de support des principaux systĂšmes de prompts](https://camo.githubusercontent.com/a39022857261f072e32a7954f28c7c12e3be340ff38742d747034aba682e405a/68747470733a2f2f6c697175696470726f6d70742e72656164746865646f63732e696f2f656e2f6c61746573742f5f696d616765732f70726f6d7074735f636f6d70617269736f6e2e737667) ## Les fonctionnalitĂ©s essentielles sont essentielles Le shell est un logiciel assez ancien. Vieux dans le bon sens du terme : il a Ă©tĂ© testĂ© et mis Ă  jour pour atteindre un niveau de qualitĂ© qui permet de travailler efficacement. De plus, il est fort probable que vous y passiez la plupart de votre temps Ă  travailler sur quelques types de tĂąches : dĂ©veloppeur, sysadmin, devops, analyste de donnĂ©es, ou n’importe quelle variante de ces familles. Quel que soit votre travail, il vous serait probablement utile de connaitre (et d’utiliser) un ensemble de fonctionnalitĂ©s pour utilisateurs « chevronnĂ©s ». Si vous avez lu cet article jusqu’ici, il y a de fortes chances que vous soyez Ă  l’aise avec le shell et que vous soyez un utilisateur expĂ©rimentĂ©, ou que vous aspiriez Ă  l’ĂȘtre. La tĂąche principale du shell est d’afficher une sorte d’état liĂ© Ă  la machine, au shell/Ă  l’environnement ou au rĂ©pertoire courant. Les Ă©tats les plus importants sont soit ceux fournis par le shell lui-mĂȘme, soit ceux qui peuvent gĂȘner votre travail (probablement l’état de l’ordinateur lui-mĂȘme). Ces fonctionnalitĂ©s sont essentielles, et elles devraient avoir une place de premier ordre dans l’invite. Dans le tableau ci-dessus, j’ai sĂ©parĂ© les fonctionnalitĂ©s liĂ©es Ă  la machine et au shell en deux catĂ©gories : les fonctionnalitĂ©s essentielles et les fonctionnalitĂ©s diverses. La catĂ©gorie « divers » contient les fonctionnalitĂ©s liĂ©es au rĂ©seau, car elles sont notoirement criblĂ©es de toutes sortes d’écueils. J’ai Ă©galement placĂ© la fonction « dir stack » (les commandes `pushd` et `popd`) dans cette catĂ©gorie, car elle n’est pas frĂ©quemment utilisĂ©e par les utilisateurs. C’est dommage, car il s’agit d’une fonctionnalitĂ© puissante. J’y ai Ă©galement placĂ© [direnv](https://direnv.net/). Bien qu’il ne s’agisse pas d’une fonctionnalitĂ© principale de l’interprĂ©teur de commandes (il s’agit aprĂšs tout d’un logiciel externe), elle est trĂšs proche d’une fonctionnalitĂ© principale de l’interprĂ©teur de commandes et j’ai pensĂ© qu’elle mĂ©ritait plus que la catĂ©gorie « contexte de dĂ©veloppement ». Dans notre tableau, les prompts sont classĂ©s en fonction de leur capacitĂ© Ă  prendre en charge ces fonctionnalitĂ©s essentielles. Il devrait ĂȘtre Ă©vident en voyant le tableau que Liquid Prompt a de loin le meilleur support. Les autres prompts sont bien moins Ă©quipĂ©s, Starship a un bon support, bien qu’avec des choix ergonomiques discutables (comme nous l’avons vu dans la section *Design*), suivi par Oh-My-Posh et Powerlevel10k, tous deux avec un support moyen et une ergonomie gĂ©nĂ©rale moyenne. Pure a un support mĂ©diocre de par sa conception mĂȘme, ce qui ne peut lui ĂȘtre reprochĂ©, mais si vous ĂȘtes un utilisateur expĂ©rimentĂ© plutĂŽt qu’un ascĂšte, vous pourriez avoir une opinion peu amĂšne quant Ă  ce choix. ## Prendre soin de l’environnement Pour les tĂąches du dĂ©veloppeur, il est essentiel de connaitre le contexte logiciel dans lequel vous travaillez. Bien entendu, il faut diviser ce contexte en fonction de la prise en charge de tel ou tel logiciel. Il existe deux catĂ©gories gĂ©nĂ©rales Ă  cet Ă©gard : les logiciels qui manipulent la configuration actuelle de votre session (*environnements virtuels* proprement dits) et la version actuelle de tout outil liĂ© Ă  la tĂąche en cours (*toolset*). Si vous jouez avec des conteneurs toute la journĂ©e, vous allez adorer ces fonctionnalitĂ©s (une fois que vous aurez trouvĂ© un moyen d’y installer un prompt). En ce qui concerne la catĂ©gorie « environnements », le support est assez faible parmi les principaux concurrents (Liquid Prompt, *ship, et PowerLevel10k), Starship ayant le meilleur support global et la meilleure ergonomie. Oh-My-Posh est un peu en retrait, et Powerline presque nulle part. Pure, comme d’habitude, a dĂ©cidĂ© de ne pas supporter ce genre de choses. Mais le vrai clivage est dans la catĂ©gorie *toolset*, avec Pure et Powerline qui ont dĂ©cidĂ© de ne pas supporter ce genre de fonctionnalitĂ©s, Liquid Prompt qui ne supporte que deux outils, et *ship, Oh-My-Posh et PowerLevel10k qui misent Ă  fond dessus. Parmi eux, Starship est le vainqueur incontestĂ©, avec une liste impressionnante d’outils pris en charge. Cependant, cette catĂ©gorie a tendance Ă  avoir une expĂ©rience utilisateur trĂšs limitĂ©e, chaque fonctionnalitĂ© Ă©tant rĂ©duite Ă  « afficher simplement l’icĂŽne & la version ». Pour la plupart d’entre elles (comme les langages de programmation), cela peut ĂȘtre facilement compris, puisqu’il n’y a pas grand-chose Ă  signaler de toute façon. Pour d’autres (comme les systĂšmes de *build*), je pense que les prompts peuvent mieux faire. Dans l’ensemble, je ne suis pas complĂštement convaincu que cette catĂ©gorie de fonctionnalitĂ©s soit suffisamment importante pour remplir le prompt avec des icĂŽnes et des chiffres, mais puisque Starship semble le juger crucial, il y a surement des cas d’usage pour cela. En passant, on peut voir que Starship se dit « minimal » sur sa page d’accueil, ce qui ne correspond pas tout Ă  fait au niveau de support qu’il a pour ces *toolsets*... mais je m’éloigne du sujet. ## Il est temps La rapiditĂ© du prompt — c’est-Ă -dire le temps nĂ©cessaire pour l’afficher aprĂšs l’exĂ©cution d’une commande — est une caractĂ©ristique qui fait l’objet de discussions constantes de la part des utilisateurs. Vous pourriez penser qu’il s’agit d’une fonctionnalitĂ© trĂšs importante et qu’aucun compromis ne doit ĂȘtre fait Ă  ce sujet. Mon point de vue est lĂ©gĂšrement diffĂ©rent. L’interprĂ©teur de commandes est une interface de commande. C’est-Ă -dire que vous tapez, entrez, regardez le rĂ©sultat de la commande, puis rĂ©flĂ©chissez Ă  la suivante. Il y a de fortes chances que vous ne tapiez jamais frĂ©nĂ©tiquement *EntrĂ©e* aprĂšs une commande qui a Ă©tĂ© trĂšs rapide Ă  produire son rĂ©sultat. Vous tapez, vous rĂ©flĂ©chissez, vous tapez la commande suivante. Vous n’avez pas besoin de la latence d’un jeu de tir Ă  la premiĂšre personne. Bien sĂ»r, il existe un seuil au-delĂ  duquel la latence de l’affichage commence Ă  produire des frictions. L’auteur de PowerLevel10k a [discutĂ© en dĂ©tail de ce qui est impossible Ă  distinguer d’une absence de latence](https://github.com/romkatv/zsh-bench#how-fast-is-fast), ce qui vous donne une idĂ©e de la *plus petite* latence que vous pouvez remarquer, mais pas tout Ă  fait celle que vous tolĂšreriez dans une session typique. De ce point de vue, il y a un vainqueur incontestable : PowerLevel10k est incroyablement rapide. Il est allĂ© trĂšs loin pour rĂ©duire sa latence, et a rĂ©ussi quelques tours de force techniques trĂšs impressionnants, comme l’affichage asynchrone d’élĂ©ments lents, grĂące Ă  une « Ă©valuation paresseuse ». Cela explique aussi en grande partie pourquoi il ne supporte que Zsh. Je comprends l’intĂ©rĂȘt de rĂ©duire les frictions liĂ©es Ă  l’attente de la frappe ; mais je pense que l’on surestime souvent l’intĂ©rĂȘt d’une latence ultra-faible, quand le prix Ă  payer est que l’information intĂ©ressante peut ne pas ĂȘtre affichĂ©e au moment oĂč l’on a besoin d’y penser. Un fait intĂ©ressant concernant la latence est la curieuse affirmation de Starship Ă  ce sujet. Sur sa page d’accueil, il affirme que Starship est « incroyablement rapide », *parce qu’il est programmĂ© en Rust*, qui « apporte la meilleure vitesse, toutes catĂ©gories ». Cette affirmation ne tient pas vraiment la route face Ă  la vraie vie. Non seulement Starship est beaucoup plus lent que PowerLevel10k, mais il est Ă©galement plus lent que Liquid Prompt — tous deux Ă©crits en pur script shell — dans la plupart des cas d’utilisation simple ! Oh-My-Posh — Ă©crit en Go — ne se risque pas Ă  faire le mĂȘme genre d’affirmation, par exemple. [Romkatv explique pourquoi dans son Ă©tude](https://github.com/romkatv/zsh-bench#prompt) :> « Starship est implĂ©mentĂ© en tant que binaire externe, il doit donc payer le prix d’au moins un fork+exec supplĂ©mentaire pour chaque commande par rapport aux prompts natifs de zsh. Un seul fork+exec ne peut pas expliquer le dĂ©calage Ă©levĂ© dont Starship fait preuve, alors qu’est-ce qui se passe ? Dans les conditions de rĂ©fĂ©rence, Starship clone 158 fois ! C’est coĂ»teux. » C’est peut-ĂȘtre contre-intuitif pour la plupart des informaticiens peu expĂ©rimentĂ©s, mais le langage est loin d’ĂȘtre l’aspect le plus important de la programmation. # Conclusion Si vous entrez suffisamment dans les dĂ©tails, vous pourrez probablement toujours argumenter que tel ou tel systĂšme de prompt est le meilleur pour tel ou tel utilisation trĂšs spĂ©cifique. GrĂące aux informations fournies dans cet article, j’espĂšre que vous pourrez dĂ©cider par vous-mĂȘme. Maintenant, si vous prĂ©fĂ©rez une Ă©valuation globale, je pense qu’il est clair qu’il y a quelques systĂšmes qui conviennent mieux Ă  certaines utilisations majeures. ## Certains sont *out* Tout d’abord, je pense que l’on peut affirmer sans risque de se tromper qu’il y a trĂšs peu d’intĂ©rĂȘt Ă  choisir Pure, si ce n’est pour signaler que vous vous positionnez comme Ă©tant alignĂ© avec ses valeurs (c’est-Ă -dire que vous croyez au « one size does fit all », ou « je n’utilise pas vraiment le shell de toute façon »). La plupart des autres candidats ont des thĂšmes qui reproduisent son (absence) de fonctionnalitĂ©, et proposent mĂȘme d’avoir le mĂȘme style, mais en supportant plus de cas d’utilisation (d’autres systĂšmes de version, plus d’alertes sur l’état de l’ordinateur, etc.). De mĂȘme, Powerline n’est probablement pas trĂšs utile en dehors de son marchĂ© principal, qui est de produire des lignes d’état. Et mĂȘme les autres prompts peuvent gĂ©nĂ©ralement fournir beaucoup plus d’informations pour ce faire, Ă  l’exception de certains services en ligne spĂ©cifiques. En outre, Spaceship peut Ă©galement ĂȘtre mis de cĂŽtĂ© en toute sĂ©curitĂ©, Ă©tant donnĂ© qu’il a Ă©tĂ© en pratique remplacĂ© par Starship, qui prend en charge davantage de fonctionnalitĂ©s (Ă  moins que vous n’ayez besoin d’une identification trĂšs spĂ©cifique de l’ensemble d’outils, voir le tableau ci-dessus). AprĂšs avoir longuement hĂ©sitĂ©, j’ai dĂ©cidĂ© de mettre Ă©galement de cĂŽtĂ© Oh-My-Posh. Cela n’a pas Ă©tĂ© facile, Ă©tant donnĂ© qu’il est assez bon sur presque tous les critĂšres d’évaluation que j’ai dĂ©veloppĂ©s dans cet article, ce qui est dĂ©jĂ  une belle rĂ©ussite. Mais c’est lĂ  que rĂ©side son dĂ©faut : il n’est que moyen partout. ## Certains sont *in* Il nous reste donc Liquid Prompt, Starship et PowerLevel10k. PowerLevel10k est le plus populaire (selon la mĂ©trique des Ă©toiles de Github) et est le choix Ă©vident si vous vous souciez plus de la latence que des fonctionnalitĂ©s. Il a un support plutĂŽt moyen de chaque catĂ©gorie de fonctionnalitĂ©s, mais a travaillĂ© trĂšs dur pour fournir une latence ultra-faible entre deux commandes. Je ne suis pas sĂ»r que cela vaille la peine de rĂ©duire les fonctionnalitĂ©s et la portabilitĂ©, Ă©tant donnĂ© que je suis trĂšs rarement ennuyĂ© par de grandes latences lorsqu’elles se produisent dans d’autres systĂšmes de prompts, mais votre apprĂ©ciation peut diffĂ©rer (chacun ses fixettes). Il a nĂ©anmoins quelques choix de design trĂšs modernes et innovants, que j’aime beaucoup, mĂȘme si j’ai l’impression qu’ils sont plus des paillettes techniques impressionnantes qu’un design vraiment utile ancrĂ© dans l’expĂ©rience de l’utilisateur. Starship n’est pas loin derriĂšre en termes d’étoiles, et brille Ă©videmment par son soutien Ă  l’identification des versions d’outils. L’utilitĂ© de ce systĂšme pour vous dĂ©pend de la frĂ©quence Ă  laquelle vous jonglez avec des tĂąches de dĂ©veloppement complexes. En tant qu’ingĂ©nieur de recherche, je jongle constamment avec un ensemble de tĂąches trĂšs diverses, et je suis donc plus attirĂ© par des systĂšmes qui couvrent bien les fonctionnalitĂ©s de base du shell que par l’énumĂ©ration des versions, mais je suppose que cela peut ĂȘtre dĂ©battu. Quoi qu’il en soit, si vous avez besoin de la portabilitĂ© vers PowerShell, Starship est un choix sĂ»r. Gardez Ă©galement Ă  l’esprit que ses revendications en matiĂšre de latence sont exagĂ©rĂ©es. Bien qu’il soit le plus ancien de tous, Liquid Prompt est aussi le moins connu. Cependant, il offre le meilleur support des fonctionnalitĂ©s essentielles. Je dirais aussi qu’il a prĂȘtĂ© plus d’attention Ă  son design, permettant des prompts trĂšs denses, par exemple. Il est Ă©galement trĂšs configurable, ce qui a permis de crĂ©er des thĂšmes trĂšs originaux en termes d’expĂ©rience utilisateur. C’est probablement le prompt qui servira le plus grand nombre de cas d’utilisation et d’utilisateurs, en particulier les personnes souhaitant apprendre le shell en expĂ©rimentant toutes ses fonctionnalitĂ©s. # Vers le service et au-delĂ  Cet article vous a donnĂ© quelques opinions basĂ©es sur une analyse Ă  un moment donnĂ© d’un marchĂ© qui continue d’évoluer. En tant que tel, il ne constitue qu’un point dans le temps et peut trĂšs bien ĂȘtre rendu obsolĂšte par un changement soudain dans l’activitĂ© de l’un ou l’autre projet. Au cours de l’histoire des systĂšmes de prompts, tous ont dĂ©couplĂ© la collecte des donnĂ©es et leur affichage. Et la collecte des donnĂ©es est l’opĂ©ration la plus couteuse, qui retient toute l’attention lorsque le temps d’exĂ©cution doit ĂȘtre optimisĂ©. PowerLevel10k, par exemple, a complĂštement dĂ©couplĂ© les deux opĂ©rations, qui s’exĂ©cutent dĂ©sormais dans des coroutines parallĂšles. Son auteur a mĂȘme mis en place un [service de status pour Git](https://github.com/romkatv/gitstatus) totalement prĂ©curseur, qui permet d’accĂ©lĂ©rer considĂ©rablement les prompts. Une autre tendance intĂ©ressante consiste Ă  dĂ©coupler la collecte des donnĂ©es en Ă©lĂ©ments logiciels atomiques, comme les plugins. Starship n’aurait probablement pas eu son impressionnant support d’outils s’il n’y avait pas eu sa base de code propre et modulaire. En mĂȘme temps, Liquid Prompt a fait de gros efforts pour permettre aux thĂšmes de dĂ©cider de ce qu’il faut afficher et (plus important) comment et quand l’afficher, allant plus loin que de considĂ©rer les thĂšmes comme de simples configurations. Je pense que ces trois tendances convergent vers l’idĂ©e d’un *service* d’invite, oĂč le *serveur* est responsable de la collecte et de la mise en cache des donnĂ©es, tandis que le *client* est responsable de l’articulation de ces informations d’une maniĂšre qui soit utile Ă  l’utilisateur (et pas seulement en les affichant). L’idĂ©e a Ă©tĂ© explorĂ©e ici et lĂ , Ă  ma connaissance surtout par les dĂ©veloppeurs de Liquid Prompt, avec des projets tels que [AngelPS1](https://github.com/dolmen/angel-PS1) de Dolmen et [MOST](https://github.com/Rycieos/most) de Rycieos. Si vous aimez ça, le mainteneur de Liquid Prompt a lancĂ© [une conversation sur les « moteurs de thĂšmes »](https://github.com/liquidprompt/liquidprompt/discussions/786), n’hĂ©sitez pas Ă  la rejoindre et Ă  participer Ă  l’élaboration de l’avenir des systĂšmes de prompts !

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /