LiquidPrompt version 1.0

Posté par (page perso) . Édité par Nÿco et Florent Zara. Modéré par Christophe Guilloux. Licence CC by-sa
Tags :
26
10
août
2012
Ligne de commande

LiquidPrompt est un prompt bash intelligent, dont l'idée générale est d'afficher élégamment des informations utiles uniquement quand le contexte le demande.

Un grand nombre de fonctionnalités, détaillées dans la suite de la dépêche, sont maintenant disponibles suite au succès fulgurant rencontré par la dernière dépêche sur le sujet.

NdM : nojhan est le papa des Geekscottes

Avec cette version 1.0, le prompt affiche :

  • la charge électrique moyenne restante dans vos batteries, si elle descend en dessous d'un seuil ;
  • la charge système moyenne de vos processeurs, si elle descend en dessous d'un seuil ;
  • le nombre de sessions détachées du terminal courant (avec screen), s'il y en a ;
  • le nombre de processus en cours attachés au terminal courant ;
  • le nombre de processus arrêtés sur le terminal ;
  • l'utilisateur actuel, en blanc s'il est différent de celui qui s'est logé, en jaune vif si c'est root ;
  • deux-points verts s'il a les droits en écritures dans le répertoire courant, rouges sinon ;
  • le répertoire courant, éventuellement raccourcis de manière intelligente s'il est trop long, tout en préservant les deux premiers répertoires ;
  • une petite flèche si un proxy HTTP est défini ;
  • le nom de la branche courante, dans un dépôt versionné, en vert si tout est à jour, en jaune si des commits sont en attente, en rouge si des modifications n'ont pas été commitées ;
  • le nombre de lignes impactées en cas de modifications, le nombre de commits locaux ;
  • le code d'erreur de la dernière commande, si elle a planté d'une manière ou d'une autre ;
  • une marque : ± dans les dépôts git, pour mercurial, pour subversion, (sinon les classiques $ et #).

Par défaut, vous aurez donc un prompt très classique :
[user:~] $

Mais si vous faites en sorte de tout afficher en même temps (cas rare, normalement, ici sans les couleurs) :
⌁24% ⌂42% 3d/2&/1z [user@server:~/ … /code/liquidprompt]↥ master(+10/-5,3) 125 ±

Une bonne partie des fonctionnalités du LiquidPromt sont configurables via un fichier de configuration ou des variables d'environnement, notamment :

  • les seuils pour la batterie et la charge CPU,
  • la taille maximale du chemin courant,
  • le nombre de répertoires à garder en tête de chemin raccourcis,
  • l'affichage permanent du nom d'hôte en local,
  • l'inversion des couleurs noir/blanc.

Il est également possible d'agencer différemment l'affichage (comme mettre les jobs après le path) et de sélectionner les fonctionnalités à utiliser (par exemple si vous n'utilisez pas subversion, ami chanceux).

Le fichier README vous expliquera tout ça.

  • # Un peu lent

    Posté par (page perso) . Évalué à  4 .

    Je l'utilise depuis quelques jours et il a fallu que je supprime les parties concernant git/svn/… car c'est beaucoup trop lent. Désormais c'est mieux mais ce n'est pas très réactif. J'ai ajouté l'affichage de l'horloge car ça me sert à savoir combien de temps peut prendre une tâche. Peut-être il y aurait moyen de mettre en cache certains résultats pour accélérer les calculs.

    • [^] # Re: Un peu lent

      Posté par (page perso) . Évalué à  2 .

      Il y a plus classe que d'afficher l'horloge. Il semblerait qu'en ajoutant des hooks, on peut directement mesurer le temps pris par la commande exécutée : http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

      C'est plus intéressant, car, a priori, on peut alors n'afficher le temps pris par la dernière commande que s'il dépasse un certain seuil. J'envisage de mettre ça dans le liquid prompt, mais faut voir si ça ne deviens pas trop ingérable niveau temps d'exécution du prompt, justement.

  • # Joli

    Posté par (page perso) . Évalué à  1 .

    Joli ! Je ne l'utiliserai pas parce que je suis sous Zsh, mais j'aime beaucoup l'idée, félicitations !

    • [^] # Re: Joli

      Posté par (page perso) . Évalué à  5 . Dernière modification : le 11/08/12 à 00:21

      Plus d'excuses : je viens de le porter pour zsh : https://github.com/ldidry/liquidprompt/tree/zsh :D

      Ceci dit, il faudra encore un peu de travail : il y a qq problèmes de placement quand j'autocomplète avec plusieurs choix.

      It's a fez. I wear a fez now. Fezes are cool !

      • [^] # Re: Joli

        Posté par (page perso) . Évalué à  1 .

        Magnifique !

      • [^] # Re: Joli

        Posté par . Évalué à  6 .

        La partie sur git/hg pourrait être bien améliorée en utilisant vcs_info.

        La gestion des couleurs pourrait se faire avec colors qui s'utilise très simplement :

        autoload -U colors
        colors
        
        export PROMPT='%{$fg[red]%}%n%{$reset_color%}@%M:%B%{$fg[blue]%}%~%b%{$reset_color%} ${vcs_info_msg_0_}%f%(?.. [%?])%# '
        
        

        Ensuite, la définition de la couleur en fonction des privilège devrait pouvoir se faire directement via %(!.iamroot.iamuser) (voir en utilisant %#).

        Ça :

        __return_value()
        {
            if [[ "$1" -ne "0" ]]
            then
                echo -ne "$1"
            fi
        }
        
        

        pourrait être remplacé par %(?.. [%?]).

        Ligne 646 à 650 :

        loadval=$(__load_$OS)
        load=$(echo $loadval | sed 's/\.//g;s/^0*//g' )
        if [[ -z "$load" ]] ; then
            load=0
        fi
        
        

        pourrait être remplacé par :

        loadval=$(__load_$OS)
        load="${${${loadval/./}##0}:-0}" # on pourrait tout regrouper dans une même ligne mais ça a peu d'intérêt.
        
        

        La version bash pourrait être

        load="${loadval/./}"
        load="${load##0}"
        load="${load:-0}"
        
        

        Il doit y avoir encore d'autres astuces qui ne me viennent pas à l'esprit.

        Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

      • [^] # Re: Joli

        Posté par (page perso) . Évalué à  2 .

        Je ne connais pas Zsh, mais le diff ne semble pas si différent qu'en bash… y aurait-il moyen de regrouper les deux dans le même script avec une détection du type de shell ?

        • [^] # Re: Joli

          Posté par (page perso) . Évalué à  1 .

          Ça doit être faisable. Je me faisais la même réflexion hier soir, mais le plus important à mes yeux était d'avoir une version qui marchait, avant de merger.

          Je jetterais un coup d'œil ce soir, mais avant ça, j'essayerais de résoudre mon bug d'autocomplétion : quand j'autocomplète avec plusieurs choix, la commande se complète mais en la décalant d'un grand espace vide (entre le prompt et la commande), un peu comme si le PS1 devenait :
          [luc:~] $ cd truc

          It's a fez. I wear a fez now. Fezes are cool !

        • [^] # Re: Joli

          Posté par (page perso) . Évalué à  1 .

          Trouver le shell en cours d'exécution :
          ps -p $$ | tail -n1 | awk '{print $NF}'

          Je ferais un merge ce soir :D

          It's a fez. I wear a fez now. Fezes are cool !

          • [^] # Re: Joli

            Posté par . Évalué à  3 .

            Est-ce que ${SHELL} n’est pas une solution.

            Par exemple :

            case "${SHELL}" in
                'zsh')
                    do_zsh_liquid_prompt
                    ;;
                'bash')
                    do_bash_liquid_prompt
                    ;;
                *)
                    do_something_else
                    ;;
            esac
            
            
            • [^] # Re: Joli

              Posté par (page perso) . Évalué à  4 .

              Non. Petit exemple (mon shell par défaut est zsh)
              [luc:~] $ echo $SHELL
              /bin/zsh
              [luc:~] $ bash
              luc@eddard:~$ echo $SHELL
              /bin/zsh

              Donc si pour une raison ou une autre tu as besoin de lancer bash sans pour autant changer de shell par défaut, ta variable d'environnement $SHELL ne change pas et liquidprompt explose en effaçant ton disque dur et en tuant des bébés chats avec des cornes de licornes mortes-nées.

              It's a fez. I wear a fez now. Fezes are cool !

          • [^] # Re: Joli

            Posté par . Évalué à  2 .

            Ou en évitant le tail :

            ps -p $$ | awk '{n=$NF}END{print n}'
            
            

            Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

    • [^] # Re: Joli

      Posté par . Évalué à  2 .

      Je m'étonne que personne n'ai cité oh-my-zsh qui fait la même chose pour zsh depuis un bout de temps.
      oh-my-zsh on github

  • # PROMPT_DIRTRIM

    Posté par . Évalué à  8 .

    Hello!

    Ca vaut ce que ça vaut, mais tu pourrais peut-être simplifier ta fonction __shorten_path() en utilisant la variable PROMPT_DIRTRIM:

    PROMPT_DIRTRIM
            If set to a number greater than zero, the value is used as the number of trailing directory components to retain when expanding the \w and \W prompt string escapes (see PROMPTING below).  Characters removed are replaced with an ellipsis.
    
    

    Par exemple:

    /usr/share/doc/bash$ export PROMPT_DIRTRIM=2
    .../doc/bash$
    
    

    PROMPT_DIRTRIM est disponible à partir de bash 4.

    My 2 cents!

  • # Des petits gains ?

    Posté par (page perso) . Évalué à  3 . Dernière modification : le 10/08/12 à 23:38

    grep ^[Pp]rocessor /proc/cpuinfo | wc -l
    grep -c ^[Pp]rocessor /proc/cpuinfo
    
    uptime | awk '{print $10}'| sed -e 's/,//'
    uptime | awk 'BEGIN { FS = " |," } {print $17}' ## a tester
    uptime | awk '{ sub(",","",$10); print $10}' ## a tester
    
    THIS_TTY=tty$(ps aux | grep $$ | grep bash | awk '{ print $7 }')
    ps aux | awk -vpid=$$ '/pid/ && /bash/ { print $7 }' 
    
    

    Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

    • [^] # Re: Des petits gains ?

      Posté par (page perso) . Évalué à  1 .

      Avec sed sinon pour l'uptime
      uptime | sed -e 's/.average: (:digit.:digit{2})./\1/'

      Quand je mesure avec time sur 100 boucles c'est moins performant que du pure awk

      Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

      • [^] # Re: Des petits gains ?

        Posté par . Évalué à  4 .

        Si on cherche vraiment la performance je pense qu'il faut éviter les expressions régulières et faire :

        uptime | awk '{print substr($10,0,length($10))}'
        
        

        Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

        • [^] # Re: Des petits gains ?

          Posté par (page perso) . Évalué à  2 .

          Après mesures il semblerait que les regexp ne soient pas l'élément discriminant :

          $ ./mtime.sh 10000 < load_commands | sort
          6.05    uptime | awk '{print substr($10,0,length($10))}'
          6.15    uptime | sed  "s/^.*average: \([0-9]\.[0-9][0-9]\),.*$/\1/"
          6.17    uptime | awk '{ sub(",","",$10); print $10}'
          6.23    uptime | awk 'BEGIN { FS = " |," } {print $17}'
          8.02    uptime | awk '{print $10}'| sed -e 's/,//'
          
          

          Mais tu gagnes quand même :-)

  • # Remarques

    Posté par . Évalué à  2 .

    Hello,

    j'ai un conflit avec autojump:
    {: command not found

    Sinon, j'aime beaucoup sauf les caractères spéciaux de tous les côtés, je n'ai pas des fontes qui les supportent, il faudrait au moins une option de config pour mettre des caractères plus classiques.

    Et des thêmes :)

    En tous cas ça a bien grandi depuis la dernière fois, beau boulot.

    A+

    • [^] # Re: Remarques

      Posté par . Évalué à  1 .

      il faudrait au moins une option de config pour mettre des caractères plus classiques

      Euh.. Je ne connais pas LiquidPrompt, mais si ses développeurs ont choisi d'utiliser un ensemble de caractères étendu, tu vas pas leur demander de gérer parallèlement un fallback mode cohérent, si ?

      Tu devrais regarder un peu les fonts dispo sur ton système, je reconnais que c'est un peu le bordel dans les packages, mais à mon avis tu peux trouver ton bonheur.

      J'espère que l'auteur de ce journal pourra te dire exactement les fonts à installer !

      • [^] # Re: Remarques

        Posté par . Évalué à  3 .

        Je pense que certains caractères sont absents de bcp de polices comme les flêches et certains signes. Plus le script grandit plus il y a de fallbacks et de prise en compte de différents OS et différentes versions des applis, c'est déjà le cas.

        J'utilise Inconsolata et Terminus comme fontes de terminal, ces caractères posent problèmes avec les 2, et comme c'est parmis les fontes les plus utilisées en terminal c'est logique de signaler cela.

        PS: la batterie est 'critique' entre 40 et 50% il y a une coupure dans l'interval :)

    • [^] # Re: Remarques

      Posté par (page perso) . Évalué à  0 .

      J'ai rencontré le même problème. J'utilise également autojump.

      Existe-t-il une solution ?

      De même, lorsque je lance un shell avec screen j'obtiens :

      _lp_set_prompt : commande introuvable

      Sinon, le concept m'intéresse beaucoup. Je n'ai jamais été très inspiré pour écrire des jolis prompts :-)

  • # Mise à jour de liquidprompt Zsh !

    Posté par (page perso) . Évalué à  1 .

    J'ai trouvé le bug qui faisait foirer l'autocompletion ! Pensez à vous mettre à jour.

    Plus qu'à merger avec la branche master en détectant le shell utilisé. (ce soir donc)

    It's a fez. I wear a fez now. Fezes are cool !

  • # Version mac?

    Posté par (page perso) . Évalué à  1 .

    Salut!

    Je viens de tester sur ma box linux, et effectivement ça poutre. Un peu lent à cause de git/svn j'ai l'impression, mais bon ça reste correct.

    Est-ce que tu as prévu une version Mac/BSD de cette chose? :)

    • [^] # Re: Version mac?

      Posté par (page perso) . Évalué à  1 .

      Normalement ça marche déjà sous mac… enfin j'ai rien pour tester, mais il y a un type qui l'utilise, a priori.

  • # bug?

    Posté par (page perso) . Évalué à  1 .

    A chaque affichage du prompt, ça me fait :

    bash: history: -; : option non valable
    history : utilisation :history [-c] [-d décalage] [n] ou history -anrw [nomfichier] ou history -ps arg [arg...]
    
    

    $ echo $BASH_VERSION
    4.2.10(2)-release

    • [^] # Re: bug?

      Posté par (page perso) . Évalué à  2 .

      Une piste :

      $ echo $LP_OLD_PROMPT_COMMAND
      history -a; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"
      $ $LP_OLD_PROMPT_COMMAND
      bash: history: -; : option non valable

      or si j'exécute
      $ history -a; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"
      pas de problème.

      Après avoir fait :
      $ $LP_OLD_PROMPT_COMMAND='history -a ; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"'

      je n'ai plus l'erreur (noter l'espace avant le 1er point virgule).

      PS: super mise en abîme : sur un journal de nojhan, je me répond à moi-même et donc un strip de nojhan s'affiche :)
      (pour ceux qui ne connaissent pas : https://linuxfr.org/images/dessins/geekscottes_005.png)

      • [^] # Re: bug?

        Posté par (page perso) . Évalué à  1 .

        nojhan, tu es démasqué, ton plan de domination du monde de DLFP est enfin révélé.

      • [^] # Re: bug?

        Posté par (page perso) . Évalué à  1 .

        Ça ressemble à un vieux bug. Normalement, il ne devrait pas y avoir deux commandes dans cette variable, mais une seule… à moins que tu aies bidouillé des trucs à la main.

  • # Super, merci !

    Posté par (page perso) . Évalué à  3 .

    Je voulais dire que je suis un utilisateur super content de liquidprompt (et que j'ai flattré le repo github).

    Mes demandes:

    • Avoir une couleur aléatoire généré à partir du nom de la machine. Le blanc est un peu triste.
    • Support de bzr.

    Un grand merci :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.