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 !