參考來源
我參考了這篇部落格文章後,根據自己的需求修改程式、新增功能讓自己的 tmux 狀態列可以顯示網路連線狀態、記憶體用量和電池電量。
原因


我喜歡讓一個應用程式完全佔滿所有畫面,讓我的注意力完全專注,所以都會打開全螢幕、也會盡可能移除其他物品。
但是有時候,我還是需要把全螢幕關掉、查看 GNOME 狀態列的記憶體用量、筆電電量等資訊。雖然它不會佔畫面上的多少空間(大約 2%),但我還是想要把它去掉,獲得更乾淨的桌面。

因此,我想要把狀態列的功能全都移動到 tmux 裡面,如果我需要看狀態列裡面的東西,我只要切換到放終端的那個虛擬桌面就可以了。
移除 GNOME 狀態列
GNOME 預設沒有移除狀態列的方法,我是透過 Just Perfection 這個用來調整 GNOME 的插件移除的,設定方式如下:
- 下載 gnome shell integration 這個 chrome 插件,方便後續的安裝 GNOME 插件(其實也可以手動下載 GNOME 插件、載入進 GNOME shell,但是這個方法比較簡單)
- 進入 Just Perfection 插件的網站,選擇 GNOME 和插件版本後下載
- 打開 Extensions 應用程式,啟用 User Extensions > Just Perfection
- 點擊 Just Perfection 旁邊的選單、調整設定,關掉 Visibility > Panel,就可以隱藏狀態列了
其實 Just Perfection 這個插件也有其他 GNOME 的設定可以調整,像是我會把所有動畫和切換 workspace 的標示關掉,我覺得比較不容易分心。
修改 tmux 的狀態列
我們可以寫一個 bash 腳本,輸出我們想要的資訊,並在 tmux 的設定檔中將此腳本的輸出顯示在狀態列上。
status-line.sh
為了讓 tmux 執行我們的 bash 腳本,我們需要將它放在 PATH 底下。
而為了能夠執行腳本,同時方便與 tmux 設定檔做版本控制,我將 status-line.sh 和 tmux.conf 一起放在 ~/.config/tmux/ 下,方便使用 git 追蹤。
接著再使用 ln -s ~/.config/tmux/status-line.sh ~/.local/bin/status-line.sh,在 PATH 底下建立一個 symlink,讓 tmux 可以執行這個腳本。
以下是我目前腳本的內容,可以顯示
- 網路狀態:有線網路/wifi/沒有網路
- 記憶體用量:使用百分比
- 電池電量:是否充電中、剩餘電量
查看電量的指令可能會根據不同的 linux 發行版不同,還有我也安裝了 nmcli 這個指令查看網路狀態,也許要先安裝。
status-line.sh 的內容如下:
(我在腳本中使用 Nerd Fonts 文字,在網頁會看到亂碼,但其實是需要特定字體才能顯示的圖示)
#!/usr/bin/env bash
# NOTE: create symlink of this under PATH
# 用整數顯示記憶體用量的 %
mem=$(free -m | awk '/Mem/{printf "%.0f%", 100*$3/$2}')
# 取得電池容量與狀態,注意這個指令可能會根據使用的 linux 發行版不同
# status 可能是 Charging/Discharging/Full
capacity=$(cat /sys/class/power_supply/BAT1/capacity)
status=$(cat /sys/class/power_supply/BAT1/status)
battery_icon=" "
# 這些是電池從 10% 到 100% 的圖示,分別是充電中與未在充電
charging_icons=(" " " " " " " " " " " " " " " " " " " ")
discharging_icons=(" " " " " " " " " " " " " " " " " " " ")
# 100 -> 9, 9x -> 8, x -> 0
# 計算圖示索引(將電池容量除以 10,並向下取整)
if [ "$capacity" -lt 10 ]; then
index=0
else
index=$((capacity / 10 - 1))
if [ "$index" -gt 9 ]; then
index=9 # 確保索引不超出陣列範圍
fi
fi
# 根據充電狀態選擇對應圖示
if [ "$status" == "Charging" ] || [ "$status" == "Full" ]; then
battery_icon="${charging_icons[$index]}"
else
battery_icon="${discharging_icons[$index]}"
fi
battery="$battery_icon$capacity%"
# 顯示網路狀態,可能是沒網路,連結有線網路,或是 wifi
internet_icon=" "
# NOTE: the space before is needed or else disconnected will also match
wired=$(nmcli device status | grep ethernet | grep " connected")
wifi=$(nmcli device status | grep wifi | grep " connected")
if [ -n "$wired" ]; then
internet_icon=" "
elif [ -n "$wifi" ]; then
# seeing wifi strength doesn't provide much value for me, just test its speed
internet_icon=" "
fi
echo "$internet_icon $mem $battery"
我原本還有一段顯示藍牙連接裝置數量的程式,但是後來覺得不是很有用,所以移除了
# 取得藍牙連接數量
bluetooth_count=$(bluetoothctl devices Connected | wc -l)
# 顯示藍牙圖示與連接數量
if [ "$bluetooth_count" -gt 0 ]; then
bluetooth=" $bluetooth_count"
else
bluetooth=" " # 無連接的藍牙圖示
fi
tmux.conf
接著,我們只要修改 tmux 的設定檔 ~/.config/tmux/tmux.conf,就可以在狀態列顯示輸出內容了。
原生的 tmux 需要加上
set -g status-right "#( status-line.sh )"
因為我的 tmux 狀態列有使用 tmux-onedark-theme 這個插件調整過,所以程式會變成
set -g @onedark_widgets "#(status-line.sh)"
可以根據自己的狀況查詢要用什麼方式修改,但原理都是讓狀態列顯示 status-line.sh 的輸出。
結論
- 我原本是要寫 tmux 設定的,不知道為什麼變成前面有一大部分在寫 GNOME 插件 XD
- Linux 真的是一個可以完全客製化的作業系統,只要肯付出心力,就可以有一個專屬於自己的開發環境
- tmux 超棒
參考
- Make Your Tmux Status Line 100% Better With Bash - DEV Community:主要參考的部落格文章,還包含了如何在 tmux 顯示網路 IP、顯示不同顏色等。
- odedlaz/tmux-onedark-theme - Github:我使用的 tmux 主題,讓 tmux 的狀態列和 neovim 的 one dark 狀態列有一樣的樣式。