Uzyskaj aktualny numer okna dla monitu bash

11

Chcę zastąpić pasek stanu pytaniem bash wyświetlającym numer okna jak ①. Jak mogę uzyskać bieżący numer okna w powłoce?

Istnieje zmienna env TMUX_PANE, niestety nie ma TMUX_WINDOW.

Najbliższe, jakie mam: tmux display-messageflashowanie informacji o oknie / okienku, a następnie wzięcie ostatniej linii tmux show-messagesi parsowanie. Nie chcę, aby informacje o oknie / okienku migały za każdym razem, gdy wyświetlany jest monit.

Wojtek Kruszewski
źródło

Odpowiedzi:

14

Możesz użyć, display-message -paby wysłać dane wyjściowe na standardowe wyjście, aby uniknąć konieczności wyodrębnienia go z danych wyjściowych show-messages:

tmux display-message -p '#I'

Możesz przekonwertować na takie liczby w kółku ( składnia bash ; testowana z wersjami 3.2.48 i 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
}

Pierwsza linia jest ładna, ponieważ jest czystym ASCII; jeśli nie masz nic przeciwko umieszczeniu znaków w pliku innym niż ASCII, możesz zamiast tego przejść do drugiej linii (to z pewnością czyni intencję bardziej oczywistą, zakładając, że edytor i powłoka poprawnie obsługują kodowanie pliku).

Następnie możesz użyć tego w następujący sposób:

PS1="$(tmux_winidx_circled) \W➤ "
Chris Johnsen
źródło
3

Wszystko, czego potrzebowałem, to flashowanie i wyodrębnienie wiadomości tmux podczas uruchamiania powłoki i przechowywanie jej. D-och!

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➤ "

Teraz mój monit wygląda następująco:

[2] ~➤  

pozostało jeszcze tylko ulepszyć parsowanie i zastąpić zwykłe cyfry ładnymi znakami z cyframi w kółku - ale to już inna historia.

Wojtek Kruszewski
źródło