Obtenir le numéro de fenêtre actuel pour l'invite bash

11

Je veux remplacer la barre d'état par une invite bash affichant le numéro de fenêtre comme ①. Comment puis-je obtenir le numéro de fenêtre actuel dans le shell?

Il y a la variable env TMUX_PANE, malheureusement pas TMUX_WINDOW.

Le plus proche que j'ai obtenu est: tmux display-messageflasher les informations de la fenêtre / du volet, puis prendre la dernière ligne de tmux show-messageset l'analyser. Je ne veux pas que les informations de la fenêtre / du volet clignotent chaque fois que l'invite s'affiche.

Wojtek Kruszewski
la source

Réponses:

14

Vous pouvez utiliser display-message -ppour envoyer la sortie vers stdout pour éviter d'avoir à l'extraire de la sortie de show-messages:

tmux display-message -p '#I'

Vous pouvez convertir les nombres encerclés comme ceci ( syntaxe bash ; testé avec les versions 3.2.48 et 4.2.20):

circled_digits=$(printf %s \${$'\xEA',\`,{a..s}} | iconv -f UTF-16BE)
# circled_digits='⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳'

tmux_winidx_circled() {
    local winidx=$(tmux display-message -p '#I')
    if (( winidx > 20 )); then
        echo "($winidx)"
    else
        echo "${circled_digits:$winidx:1}"
    fi
}

La première ligne est agréable en ce sens qu'elle est en pur ASCII; si cela ne vous dérange pas d'avoir des caractères non ASCII dans votre fichier de configuration, vous pouvez utiliser la deuxième ligne à la place (cela rend certainement l'intention plus évidente, en supposant que votre éditeur et votre shell peuvent gérer correctement l'encodage du fichier).

Ensuite, vous pouvez l'utiliser comme ceci:

PS1="$(tmux_winidx_circled) \W➤ "
Chris Johnsen
la source
3

Tout ce dont j'avais besoin était de flasher et d'extraire le message tmux lors du démarrage du shell et de le stocker. Oh!

tmux display-message
export TMUX_WINDOW=$(tmux show-messages | tail -1 | grep -o '\[[0-9]\] \([0-9]\)' | grep -o '[0-9]$')
PS1="$(echo $TMUX_WINDOW) \W➤ "

Maintenant, mon invite ressemble à ceci:

[2] ~➤  

et ce qui reste est d'améliorer l'analyse et de remplacer les chiffres réguliers par de jolis caractères chiffrés Unicode - mais c'est une autre histoire.

Wojtek Kruszewski
la source