Des geekeries, de la MAO, de tout et de rien…
Je suis
Charlie

Modifier le prompt de son shell

Icône auteur nah, Icône canondrier 13 décembre 2013, Icône commentaire
Mots clés Icône catégorie geekeries, GNU/Linux, Windows, classé dans Icône catégorie Asrall, Geekeries, Linux

Article mis à jour à 23h19. Le problème de git a été résolu.

(Pseudo) suite de l'article sur Fish [1]. Après le message d'accueil, personnalisons le prompt.

D'abord, qu'est-ce que le prompt ?


Prompt, de l'Italien "Pronto", et signifiant « prêt » [2], est une bête étrange que l'on retrouve sur toutes les consoles [3], que ça soit sous MS-DOS [4], la ligne de commande Windows [5], ou les *nix [6].

Symbolisé par un '$', un '#' ou un '>', cela sert à inviter l'utilisateur à taper des commandes [7]. Évidemment, si on tape « merci de me faire du café », au pire, on aura un « Commande inconnue 'merci' ». Si on tape « make coffee » sur un système BSD relié à une cafetière, on aura du café [8].

Après, la plupart des visiteurs de ce blog savent ce qu'est le prompt, donc, entrons dans le vif du sujet.


Personnalisons le prompt.


Sous bash, le plus simple est de modifier la variable PS1.
Lançons alors bash sans rien, comme ceci :

Capture d'écran montrant le shell bash par défaut, comme sur l'exemple ci-dessus.

On a vraiment le strict minimum. Le nom du shell et sa version, suivi du caractère '$'.
Modifions alors la variable PS1.

Capture d'écran montrant le shell bash avec le prompt modifié, comme sur l'exemple ci-dessus.

Voilà qui est déjà mieux, et qui ressemble plus ce à quoi on est habitué de voir.

On peut mettre de la couleur, afficher d'autres informations, etc, je ne m'attarderai pas dessus.


powerline-shell


Capture d'écran montrant le prompt powerline

powerline-shell est un petit script ensemble de scripts écrit en python [9]. Sa particularité, c'est qu'il permet de remplacer le prompt par quelque chose de plus complet, par exemple en plus du chemin, il peut indiquer dans quelle branche git on se situe, ou si on est connecté via ssh. Facilement extensible (via des "segments"), il est simple d'usage, compatible avec bash, zsh et fish (entres-autres). De plus, il fonctionne également sous Windows (cygwin). Il s'inspire de powerline, une extension de vim.

Cependant, il nécessite, pour un fonctionnement optimal, une police de caractère "patchée", contenant des caractères unicode supplémentaires. Ces polices peuvent se trouver ici.

L'installation sous bash et zsh ne pose pas de problèmes en particulier. Cependant, sous fish, en suivant les instructions données, cela ne marchait pas (pourquoi ? mystère). Du coup, j'ai créé un fichier "fish_prompt.fish" dans "~/.config/fish/functions", et y ai inséré le contenu suivant :

$ cat .config/fish/functions/fish_prompt.fish 
function fish_prompt
    ~/powerline-shell.py $status --shell bare ^/dev/null
end

Édit : la doc de fish recommande de passer par function et non d'utiliser fish.config. Cf. How do I set my prompt?

Une déconnexion de fish plus tard, on passe du prompt par défaut à powerline-shell.

Comparaison entre le prompt de fish, par défaut, et de powerline-shell

En haut, le prompt par défaut, en bas, powerline-shell. La différence est notable.
Le terminal utilisé ici est tilda, la police est Ubuntu mono derivative powerline.

À l'usage, ça donne ça :

La connexion ssh fait apparaître un petit cadenas sur fond orangé. L'utilisateur "root" est affiché sur un fond rouge, et le nom de machine est sur fond blanc. Ce n'est pas le thème par défaut, mais un thème légèrement retouché pour correspondre à mes besoins.


Conclusion


Au final, ce prompt est agréable et pratique, à tel point que je ne pourrais plus m'en passer.
À noter cependant un léger délai avec zsh sous Windows au moment d'afficher le prompt. C'est possible que cela soit lié à python sur cette plateforme.
Par contre, sur un de mes dépôts git, powerline-shell semble planter, et n'affiche rien. Il faudra que je regarde ça de plus près. À noter, si je retire le .git, l'affichage du prompt fonctionne, et si je le remet, ça ne fonctionne plus [10]. Je n'ai pas ce problème sur mes autres dépôts git.

Édit : problème réglé. git retourne les infos en français, donc en utf-8. Bien entendu, le segment git attendait de l'ascii. L'ajout de

branch = branch.decode('utf-8')
sur la ligne avant
powerline.append(' %s ' % branch, fg, bg)
vers la ligne 46 de git.py, puis rexécution de "./install.py" pour mettre à jour le script, règle le problème.

terminal montrant les erreurs python, puis le prompt fonctionnel.


1 : Lisible ici personnaliser-le-greeting-de-fish
2 : Je ne sais pas si c'est vrai ou non, c'est juste que je trouvais que les termes étaient proches. Si c'est totalement faux ou absurde, rigolez-en, si c'est vrai… ben euh… c'est que c'est vrai.
3 : Le truc obscur dont j'ai du parler dans un précédent article, utilisé par les 1337 |-|4><0r M45+3R. Ce n'est pas une console de jeux comme la p$ ou la ><|30><, même si les rares consoles de jeux qui tournent sur la distrib « OpenDingux » ont une console ; une console dans la console.
4 : Déjà en son temps, pour passer de C> à C:\>, il fallait taper prompt $p$g.
5 : le truc dans une fenêtre 80x25 non étirable et accessible via cmd.exe
6 : Donc, pas sur GNU/Lennax… je sais, un article écrit un vendredi sans troll sur systemd, c'est pas un bon article. À noter, j'ai réellement utilisé systemd sur fedora19, il y a des bons trucs dedans, et également des trucs vraiment pénible, notamment quand un processus part en cavale…
7 : Ça doit être pour ça qu'on appelle ça une invite de commande…
8 : À noter la commande "c", qui, suivie d'un certain nombre de paramètres, permet d'obtenir un certain breuvage, comme l'indique sa page de man.
9 : Vous vous attendiez à quoi ? du PERL ?
10 : Quand je regarde comme ça, on me voit. Quand je regarde comme ça, on ne me voit plus. On me voit, on me voit plus…