- Starship est un projet open source de prompt léger, performant et flexible, utilisable dans divers environnements shell
- Large compatibilité avec la plupart des principaux shells, dont Bash, Zsh, Fish, Powershell et Tcsh
- Configuration et activation possibles en ajoutant simplement le script d’initialisation propre à chaque shell
- Écrit en Rust, il garantit rapidité et sécurité, et est distribué sous la forme d’un binaire unique
- Chaque détail, même mineur, peut être personnalisé
- Prend en charge une configuration d’environnement commune sur de nombreuses plateformes, dont Android, BSD, Linux, macOS et Windows, pour améliorer la productivité et la facilité d’utilisation
Projet open source Starship
- Starship est un outil de prompt qui combine performances et personnalisation, et peut être utilisé sur différents systèmes d’exploitation et shells
- Par rapport aux prompts traditionnels plus lourds, il se distingue par une réactivité élevée et une faible consommation de ressources, tout en offrant un haut niveau de personnalisation qui contribue à améliorer la productivité des développeurs
Méthode de configuration selon l’environnement shell
- Bash:
- Ajouter le code
eval "$(starship init bash)" à la fin du fichier ~/.bashrc
- Fish:
- Ajouter
starship init fish | source à la fin du fichier ~/.config/fish/config.fish
- Zsh:
- Ajouter le code
eval "$(starship init zsh)" à la fin du fichier ~/.zshrc
- Powershell:
- Ajouter
Invoke-Expression (&starship init powershell) dans le fichier Microsoft.PowerShell_profile.ps1
- L’emplacement du fichier de profil PowerShell peut être vérifié avec la variable
$PROFILE
- Ion:
- Saisir le code
eval $(starship init ion) dans le fichier ~/.config/ion/initrc
- Elvish:
- Seule la version v0.18 ou ultérieure est prise en charge
- Ajouter le code
eval (starship init elvish) dans le fichier ~/.elvish/rc.elv
- Tcsh:
- Saisir le code
eval \starship init tcsh`` dans le fichier ~/.tcshrc
- Nushell:
- Seule la version v0.96 ou ultérieure est prise en charge ; la méthode de configuration pourra évoluer à l’avenir
- Le chemin du fichier de configuration peut être vérifié avec la commande
$nu.config-path
- Appliquer dans ce chemin le code
starship init nu | save -f ...
- Xonsh:
- Saisir le code
execx($(starship init xonsh)) à la fin du fichier ~/.xonshrc
- Cmd (Clink requis):
- Clink v1.2.30 ou ultérieure est requis
- Créer un fichier
starship.lua, puis l’enregistrer dans le répertoire des scripts Clink
- Ajouter à l’intérieur le code
load(io.popen('starship init cmd'):read("*a"))()
2 commentaires
Ça fait drôle de voir passer ici quelque chose que j’utilise très bien depuis des années :)
Je l’utilise depuis l’époque où c’était proposé comme thème Zsh... hahaha
Commentaires Hacker News
Je suis un utilisateur qui aime les prompts maximalistes, et j’utilise souvent Shell Bling Ubuntu via Starship quand je monte une machine de dev
Cela dit, ce style ne convient pas à tout le monde
Si vous ne voulez ajouter que l’information la plus dense, je recommande d’afficher seulement l’heure à laquelle le prompt apparaît et la durée d’exécution de la dernière commande
Avec seulement ces deux informations, il est facile de comprendre ce qui s’est passé et quand, ce qui est très utile plus tard pour le débogage ou la tenue d’un historique
C’est une astuce tirée de Networking for System Administrators de Michael W. Lucas, un livre que je recommande souvent aussi aux développeurs qui veulent apprendre les bases du réseau
Si vous voulez gagner encore plus de points de nerd, affichez l’heure en secondes selon l’époque UNIX
Cela rend le calcul des deltas de temps extrêmement simple
Voir le repo Shell Bling Ubuntu
Dans nushell, ce genre d’informations est fourni par défaut
Dans l’historique d’exécution, on peut consulter des détails comme l’horodatage de début de la commande, son temps d’exécution, le répertoire courant, l’état de sortie, etc.
C’est très pratique, car cela montre directement non seulement l’écart de temps entre les commandes, mais aussi la durée d’exécution de la commande elle-même
Je n’ai presque jamais personnalisé mon prompt
Avec emacs, je peux déjà voir dans l’éditeur toutes les informations dont j’ai besoin
Je ne configure Starship que quand je dois montrer quelque chose à quelqu’un, par exemple en pair programming, et j’ouvre alors une application de terminal séparée pour ne pas avoir à exposer ma configuration
Le code de sortie de la commande précédente est aussi une information très utile, pour des raisons similaires à celles citées plus haut
Afficher l’heure actuelle dans un format lisible par un humain aide aussi pas mal
Et afficher l’état de sortie de la commande précédente lorsqu’il n’est pas égal à 0 (en cas d’échec) aide au débogage
Pour moi, l’information sur le répertoire courant suffit à elle seule
Il me suffit de changer la couleur du prompt selon que la dernière commande a réussi ou échoué
Pour le reste, je vérifie séparément quand j’en ai besoin
Cela m’a rendu curieux de connaître la répartition par âge des utilisateurs de Starship
Pour ma part, avec le temps, j’ai largement perdu tout intérêt pour la personnalisation du prompt
J’en suis arrivé à la conclusion que, même avec un prompt très sophistiqué, 90 % des informations affichées sont inutiles 90 % du temps
Trop d’informations finissent au contraire par devenir du bruit visuel, au point que le cerveau les ignore et qu’on en oublie même leur présence
Les informations vraiment importantes atteignent vite les limites du prompt ; par exemple, savoir qu’il y a des changements sur une branche Git ne dit pas quels fichiers ont changé, donc il faut de toute façon lancer des commandes supplémentaires
Plus de 20 ans de carrière dans le développement
Je trouve très utile d’avoir les informations Git dans le prompt
Cela ne donne pas tous les détails, bien sûr, mais c’est pratique pour me rappeler qu’il y a des modifications non commit ou un stash oublié
Starship m’a intrigué, donc je l’ai installé tout de suite, mais les éléments comme l’affichage des versions d’outils m’ont semblé trop bruyants, et je l’ai finalement désinstallé
Les options comme le timing des commandes ou leur état de succès/échec étaient intéressantes, mais pas au point de justifier l’effort d’entretien d’une configuration complexe
En tant que senior avec plus de 25 ans dans le secteur, je n’utilise généralement pas les outils modernes trop tape-à-l’œil
Avant, j’utilisais un PS1 très simple qui affichait seulement l’heure, mon compte, l’hôte de connexion et le chemin courant, comme ceci : <pre><code>export PS1="[\033[1;32m][\t \u@\h \w]\$[\033[0m]"</code></pre>
J’ai essayé plusieurs prompts plus avancés, mais ils m’ont rarement aidé
En ce moment, j’utilise Starship avec satisfaction depuis plusieurs années
Je l’ai personnalisé pour n’afficher que le strict nécessaire, et c’est très rapide et agréable à utiliser
L’un des éléments les plus utiles de ma personnalisation du prompt est l’affichage de l’exit status de la commande précédente
Il arrive qu’une commande échoue sans aucun message d’erreur, donc avoir un indicateur d’échec est un signal très fort
En revanche, pour éviter le bruit au quotidien, je ne l’affiche qu’en cas d’échec
Par exemple : <pre><code>» true » false (last command returned 1.)</code></pre>
S’il s’agit d’une terminaison par signal, je l’affiche aussi sous une forme traduite, du genre « last command exited on SIGSEGV »
C’est également utile dans le cas inverse, lorsqu’un programme affiche un message d’erreur mais se termine malgré tout avec un code de succès
En tant qu’utilisateur « very senior » avec des dizaines d’années d’expérience sur UNIX, je préfère le mode minimal de Starship, que je trouve propre
Autrefois, j’ai passé des années à me battre avec différentes configurations zsh, mais aujourd’hui je n’ai presque plus de hassle
Si vous vous imaginiez que les utilisateurs de Starship étaient tous de jeunes gens qui abusent des emoji en JavaScript, sachez qu’il y a aussi des gens comme moi
Plus largement, c’est un phénomène qui s’applique à tout l’environnement informatique
Quand j’étais plus jeune, j’étais absorbé par le fait de construire moi-même mon OS avec Gentoo, d’ajuster les flags d’optimisation CPU, le gestionnaire de fenêtres, les alias et fonctions dans le bashrc, jusqu’au prompt
Ce travail d’optimisation en soi a été une expérience très formatrice
Si l’on fait une analogie avec le travail du bois, au début on passe l’essentiel de son temps à fabriquer et peaufiner des outils ou des petits trucs, puis à un certain moment on se recentre sur le vrai travail pratique
J’aime toujours Linux aujourd’hui, mais dans une vie bien remplie je privilégie le « travail » plutôt que l’efficacité ou la finition idéales, donc j’utilise simplement Debian et KDE comme environnement par défaut
Je n’aime ni les décorations inutiles ni l’excès d’informations, donc je préfère un environnement terminal minimaliste
Mais Starship montre très bien le contexte quand il le faut et permet une personnalisation fine
Mon prompt par défaut n’affiche que le répertoire courant, l’heure et un simple %
Si certaines variables d’environnement sont définies (KUBECONFIG, OS_CLOUD, etc.), il inclut alors les informations correspondantes
Il affiche aussi automatiquement les versions de langages comme Go ou Python selon le contexte d’utilisation
Starship rend vraiment ce type de configuration très facile, sans empilement complexe de plugins zsh et avec un overhead minimal
En particulier, utilisé avec evalcache, l’initialisation est aussi très rapide
En tant que fan de Starship, quelques commentaires
Le fait qu’il soit développé en Rust, donc sûr et rapide, et distribué sous forme de binaire compilé lui donne des performances bien supérieures à powerline basé sur Python, ohmybash basé sur des scripts shell, ohmyzsh basé sur zshell, ou spaceship
Il prend naturellement en charge zsh, bash, sh et fish, mais aussi MS Windows CMD et Powershell
Le fait de pouvoir gérer les prompts de tous ses systèmes avec un unique fichier de configuration est presque unique
Si les informations sont trop nombreuses, on peut très facilement simplifier, et il est aussi possible de désactiver les icônes
Avec environ 100 modules, les possibilités de personnalisation sont pratiquement illimitées
Je ne comprends pas pourquoi Starship est présenté comme « minimal » dans son marketing
<pre><code>: ▶</code></pre>En réalité, il a énormément de fonctionnalités, et dans l’usage réel on voit souvent d’énormes prompts couverts de décorations
Moi, j’utilise quelque chose d’aussi simple que ça
Si l’on veut du vrai minimalisme, on n’a pas forcément besoin d’un framework de personnalisation comme celui-ci
Par rapport aux autres shells et prompts, le fichier de configuration de Starship a l’avantage de rester assez intuitif même quand la complexité augmente
On peut tout désactiver
<pre><code>format = """ $username\ $hostname\ $shlvl\ $directory\ $git_branch\ $git_commit\ $git_state\ $git_metrics\ $git_status\ $package\ $python\ $rust\ $env_var\ $custom\ $cmd_duration\ $jobs\ $time\ $status\ $shell\ $character"""</code></pre>En ce moment, j’utilise une configuration minimale qui ressemble à ceci
Au fond, Starship peut certes être utilisé de manière minimaliste, mais par nature c’est surtout un prompt maximaliste capable d’embarquer autant d’informations et de contenu que possible
Ce serait bien de le reconnaître
J’utilise une flèche encore plus fine que ça
<pre><code>PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'</code></pre>C’est propre, simple et minimal
Je suis surpris par les réactions qui confondent la capacité de personnalisation avec le maximalisme
Les valeurs par défaut sont un peu chargées, mais on peut les réduire autant qu’on veut
Je travaille sur plusieurs environnements AWS et avec divers runtimes, et les informations de contexte dans le prompt m’aident réellement beaucoup
Personnellement, j’utilise depuis longtemps la combinaison Starship + Nushell
J’aime le fait qu’une fois installé, il n’y ait plus besoin d’y toucher
J’aime voir immédiatement si mon shell tourne sur node 20 ou 22, ou si rust est en stable ou en nightly
Comme tout cela s’affiche directement sans travail supplémentaire, ça me convient très bien
Indépendamment de Starship, il y a un phénomène gênant dans les prompts zsh : quand on appuie sur Entrée, le curseur se déplace brièvement vers le début de la ligne, provoquant une sorte de « flash »
C’est moins visible avec un prompt ultra-rapide, mais dès qu’il se passe la moindre chose dans le prompt, ce phénomène saute aux yeux
Je l’ai observé de la même manière dans plusieurs terminaux (gnome-terminal, wezterm, kitty, alacritty, xterm)
Le seul terminal où ce problème n’apparaît pas est urxvt
Voir la vidéo de reproduction
Je suis curieux de connaître la cause de ce flash et les moyens de l’éviter
Si, toutes les 100 ms, le prompt va vérifier des informations peu utiles comme git status à chaque rendu, cela finit par provoquer une baisse de productivité invisible
Le terminal devrait être un outil mémoriel réactif, et il faut éviter qu’il devienne une décoration superflue
Le problème, c’est qu’on fait très attention à la vitesse d’exécution du code tout en restant étrangement tolérant vis-à-vis de la latence de frappe
Starship est vraiment rapide
La collecte des données nécessaires ne prend que quelques ms, et on peut facilement contrôler quelles informations extraire
Avec les autres outils que j’ai utilisés jusque-là, les délais me gênaient toujours, mais avec Starship la différence est très sensible
Les 100 ms perçues par un humain et les 100 ms de l’optimisation CPU sont deux choses complètement différentes
À mon avis, cela pousse à se demander ce qu’il faut le plus optimiser entre un prompt qui met 100 ms à afficher une branche ou un état git, au risque de casser le flow, et le temps plus long que je mets moi-même à saisir une commande
Quelques ms consacrées à des fonctions de confort raisonnables valent largement le coût
Au final, tout revient à trouver un point d’équilibre entre confort et minimalisme
Un minimalisme extrême comme une décoration excessive peuvent tous deux conduire à l’inefficacité
Comme cette latence m’agaçait, j’ai patché le terminal kitty pour déplacer le prompt Starship dans une barre d’état en bas, comme la status bar ou modeline de vim ou emacs
La modeline se met à jour de manière asynchrone, donc la réactivité du prompt est excellente
L’inconvénient, c’est qu’il faut patcher kitty soi-même, et je n’ai pas pu tester cela en dehors de mon environnement Linux personnel
Voir le projet de patch associé
Je me demande s’il serait possible pour un outil de prompt d’agir un peu comme un TUI, c’est-à-dire de modifier de manière asynchrone la zone du prompt même après avoir complètement rendu sa sortie initiale (par exemple, kubectl, git ou aws cli pourraient ajouter des informations 200 ms plus tard)
De cette façon, l’utilisateur pourrait taper sa commande suivante immédiatement sans attente, et les informations supplémentaires apparaîtraient ensuite naturellement
Je me demande si, au lieu d’optimiser l’exécution du code, le vrai problème n’est pas plutôt que l’empilement des couches rend en pratique plus difficile l’optimisation de la latence d’entrée du prompt
En allant sur le site officiel, j’ai eu l’impression qu’il manquait une explication claire de pourquoi utiliser Starship
<pre><code>- résultat de la dernière commande (couleur : vert, rouge, violet)Ces derniers temps, ma personnalisation du prompt me montre d’un coup d’œil les informations suivantes
Si la dernière commande réussit, c’est vert ; si elle échoue, c’est rouge ; si elle a été interrompue, c’est violet
Je pourrais bien faire partie de leur cible, mais la page d’accueil ne m’a pas clairement communiqué le « pourquoi » de l’outil ni ce qu’il améliore réellement