Rendez-vous sur Arrakiss
Le 08/10/2019 à 15:14 dans /Journal/2018/

Un joli prompt dans ksh

ksh, c'est le shell par défaut sous OpenBSD. Globalement, ça fait à peu près tout ce dont on peut avoir besoin à moins d'avoir des habitudes très poussées avec bash ou zsh. Perso, ça fait le job.
Actuellement en recherche de minimalisme, je fais le tour des outils que j'utilise pour n'en utiliser qu'un minimum, si possible déjà installés.

J'avais déjà parlé de cwm, un gestionnaire de fenêtres qui remplace désormais dwm déjà très simple. Il me manquait de quoi voir si j'ai reçu des mails. J'utilisais conky pour ça, mais j'ai enfin un moyen de m'en passer, en configurant le prompt de ksh puisque j'ai souvent un terminal d'ouvert.

Désormais, j'ai un prompt qui ressemble à ça :

PS1="[\D{%H:%m - %d/%m/%Y}] [\$(~/geek/bin/nbmail.sh)] [\$(MPD_)]\n[\w] \$ "
  • \D{%H:%M - %d/%m/%Y} : Cette partie affiche l'heure selon les variables mises entre accolades. Ça comprends les mêmes paramètres que la commande "date" (voir man strftime).
  • \$(~/geek/bin/nbmail.sh) : J'appelle un script qui liste mes nouveaux mails. Le "\" avant le "$" permet dexécuter cette commande à chaque fois que le prompt est affiché (donc pas seulement lorsque le terminal est ouvert).
  • \$(MPD_) : Pareil, mais cette fois-ci ce sont des informations sur mpd, le lecteur de musique que j'utilise.
  • \n : Retour à la ligne.
  • \w : Emplacement dans lequel je me trouve.
  • \$ : Affiche "$" si je suis un simple utilisateur, "#" si on est root.

Le script nbmail.sh ne fait que lister le nombre de fichiers dans les dossiers "new" de mes Maildir.
Sinon, j'ai ce qui est en cours de lecteur dans MPD.
C'est très simple, et ça reste léger puisque mis à jour seulement à l'ouverture du terminal ou après avoir tapé une commande.

Voici donc ma configuration de ksh au complet: le .kshrc

# source some aliases
. /etc/ksh.kshrc
. ~/.aliases
. ~/.functions

# history
HISTFILE=~/.hist
HISTSIZE=3000
HISTCONTROL=ignoredumps # no doubles

# Prompt
MPD_() {
    pgrep mpd > /dev/null
    if [ $? -eq 0 ]; then
        status=$(mpc)
        if [ -n "$(echo "$status" |grep -o '[playing]')" ]; then
            STRING=$(echo -n "$status" | sed -n '1p')
            STRING="$STRING $(echo -n "$status" | sed -n '2p' | cut -d' ' -f5)"
            echo -n "$STRING"
        fi
    fi
}

PS1="\e[m[\e[0;36m\D{%H:%m - %d/%m/%Y}\e[m] [\e[0;35m\$(~/geek/bin/nbmail.sh)\e[m] [\e[0;32m\$(MPD_)\e[m]\n[\e[0;33m\w\e[m] \e[0;33m\$\e[m "
PS2="\n>"

# option
set -o vi # I love vim

# autocompletion
set -A complete_git -- clone branch add rm checkout fetch show tag commit
set -A complete_mpc -- lsplaylists ls play pause toggle prev random shuffle stop update
PKG_LIST=$(ls -1 /var/db/pkg)
set -A complete_pkg_delete -- $PKG_LIST
set -A complete_pkg_info -- $PKG_LIST

set -A complete_ssh -- $(awk '{split($1,a,","); print a[1]}' ~/.ssh/known_hosts)
set -A complete_rcctl_1 -- disable enable get ls order set
set -A complete_rcctl_2 -- $(ls /etc/rc.d)

set -A complete_signify_1 -- -C -G -S -V
set -A complete_signify_2 -- -q -p -x -c -m -t -z
set -A complete_signify_3 -- -p -x -c -m -t -z
set -A complete_gpg2 -- --refresh --receive-keys --armor --clearsign --sign --list-key --decrypt --verify --detach-sig
set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)