Dapatkan nomor jendela saat ini untuk bash prompt

11

Saya ingin mengganti status bar dengan bash prompt menampilkan nomor jendela seperti ①. Bagaimana saya bisa mendapatkan nomor jendela saat ini di shell?

Ada variabel env TMUX_PANE, sayangnya tidak ada TMUX_WINDOW.

Yang paling dekat yang saya dapat adalah: tmux display-messageuntuk tmux show-messagesmem- flash info jendela / pane, lalu mengambil baris terakhir dan menguraikannya. Saya tidak ingin info jendela / panel berkedip setiap kali prompt ditampilkan.

Wojtek Kruszewski
sumber

Jawaban:

14

Anda dapat menggunakan display-message -puntuk mengirim output ke stdout untuk menghindari keharusan mengekstraknya dari output show-messages:

tmux display-message -p '#I'

Anda dapat mengonversi ke nomor yang dilingkari seperti ini ( sintaks bash ; diuji dengan versi 3.2.48 dan 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
}

Baris pertama bagus karena murni ASCII; jika Anda tidak keberatan memiliki karakter non-ASCII dalam file konfigurasi Anda, maka Anda dapat menggunakan baris kedua sebagai gantinya (itu tentu membuat maksudnya lebih jelas, dengan asumsi editor dan shell Anda dapat menangani pengkodean file dengan benar).

Maka Anda bisa menggunakannya seperti ini:

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

Yang saya butuhkan adalah menginstal dan mengekstrak pesan tmux ketika memulai shell dan menyimpannya. D-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➤ "

Sekarang prompt saya terlihat seperti:

[2] ~➤  

dan yang tersisa adalah memperbaiki parsing dan mengganti digit reguler dengan karakter digit Unicode yang cantik - tapi itu cerita lain.

Wojtek Kruszewski
sumber