Получить текущий номер окна для приглашения bash


11

Я хочу заменить строку состояния на приглашение bash, отображающее номер окна, например ①. Как я могу получить текущий номер окна в оболочке?

Есть переменная env TMUX_PANE, к сожалению, нет TMUX_WINDOW.

Самое близкое, что я получил: tmux display-messageпрошить информацию об окне / панели, затем взять последнюю строку tmux show-messagesи проанализировать ее. Я не хочу, чтобы информация об окне / панели мигала каждый раз, когда отображается приглашение.

Ответы:


14

Вы можете использовать display-message -pдля отправки вывода в stdout, чтобы избежать необходимости извлекать его из вывода show-messages:

tmux display-message -p '#I'

Вы можете преобразовать в обведенные числами вот так ( синтаксис bash ; протестировано с версиями 3.2.48 и 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
}

Первая строка хороша тем, что это чистый ASCII; если вы не возражаете против того, чтобы в файле конфигурации были символы, не входящие в ASCII, тогда вы можете перейти ко второй строке (это, безусловно, делает намерение более очевидным, если ваш редактор и оболочка могут правильно обрабатывать кодировку файла).

Тогда вы можете использовать это так:

PS1="$(tmux_winidx_circled) \W➤ "

3

Все, что мне было нужно, это прошить и извлечь сообщение tmux при запуске оболочки и сохранить его. D-ой!

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

Теперь моя подсказка выглядит так:

[2] ~➤  

Осталось улучшить синтаксический анализ и заменить обычные цифры красивыми символами Unicode в кружочках - но это уже другая история.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.