Arch Linuxで使用する Sway のシンプルで落ち着いたステータスバーが欲しいのですが。
これまでに見つけた構成では、 waybar または i3status のような別のプログラムを使用しています。見栄えは良いですが、シンプルにしてstatus_command
で言及されているman sway-bar
直接。
できれば、このステータスバーは i でも同じように機能します。Swayはその構成がi3と互換性があることを目的としているため、これは可能です。
これが私の現在のステータスバーです:
音声がミュートされている場合:
status.sh
が呼び出す~/.config/sway/config
の内容:
# The Sway configuration file in ~/.config/sway/config calls this script.
# You should see changes to the status bar after saving this script.
# If not, do "killall swaybar" and $mod+Shift+c to reload the configuration.
# The abbreviated weekday (e.g., "Sat"), followed by the ISO-formatted date
# like 2018-10-06 and the time (e.g., 14:01). Check `man date` on how to format
# time and date.
date_formatted=$(date "+%a %F %H:%M")
# "upower --enumerate | grep 'BAT'" gets the battery name (e.g.,
# "/org/freedesktop/UPower/devices/battery_BAT0") from all power devices.
# "upower --show-info" prints battery information from which we get
# the state (such as "charging" or "fully-charged") and the battery's
# charge percentage. With awk, we cut away the column containing
# identifiers. i3 and sway convert the newline between battery state and
# the charge percentage automatically to a space, producing a result like
# "charging 59%" or "fully-charged 100%".
battery_info=$(upower --show-info $(upower --enumerate |\
grep 'BAT') |\
egrep "state|percentage" |\
awk '{print $2}')
# "amixer -M" gets the mapped volume for evaluating the percentage which
# is more natural to the human ear according to "man amixer".
# Column number 4 contains the current volume percentage in brackets, e.g.,
# "[36%]". Column number 6 is "[off]" or "[on]" depending on whether sound
# is muted or not.
# "tr -d []" removes brackets around the volume.
# Adapted from https://bbs.archlinux.org/viewtopic.php?id=89648
audio_volume=$(amixer -M get Master |\
awk '/Mono.+/ {print $6=="[off]" ?\
$4" ????": \
$4" ????"}' |\
tr -d [])
# Additional emojis and characters for the status bar:
# Electricity: ⚡ ↯ ⭍ ????
# Audio: ???? ???? ???? ???? ???? ????
# Separators: \| ❘ ❙ ❚
# Misc: ???? ???? ???? ???? ⭐ ???? ↑ ↓ ✉ ✅ ❎
echo $audio_volume $battery_info ???? $date_formatted
~/.config/sway/config
のステータスバー部分は次のとおりです。
bar {
position top
# Keep in mind that the current directory of this config file is $HOME
status_command while ~/.config/sway/status.sh; do sleep 1; done
# https://i3wm.org/docs/userguide.html#_colors
colors {
# Text color of status bar
statusline #f8b500
# Background color of status bar
background #5e227f
}
}
status.sh
は、上記と同じbar
ブロックを使用して/.config/i3/config
から呼び出された場合、 i でも機能します。
リンクはこちらstatus.sh
を含む現在のSway構成へ。
このスクリプトは~/.config/sway/status.sh
にあります。
# The Sway configuration file in ~/.config/sway/config calls this script.
# You should see changes to the status bar after saving this script.
# If not, do "killall swaybar" and $mod+Shift+c to reload the configuration.
# Produces "21 days", for example
uptime_formatted=$(uptime | cut -d ',' -f1 | cut -d ' ' -f4,5)
# The abbreviated weekday (e.g., "Sat"), followed by the ISO-formatted date
# like 2018-10-06 and the time (e.g., 14:01)
date_formatted=$(date "+%a %F %H:%M")
# Get the Linux version but remove the "-1-Arch" part
linux_version=$(uname -r | cut -d '-' -f1)
# Returns the battery status: "Full", "Discharging", or "Charging".
battery_status=$(cat /sys/class/power_supply/BAT0/status)
# Emojis and characters for the status bar
# ???? ???? ???? ???? ⚡ ???? \|
echo $uptime_formatted ↑ $linux_version ???? $battery_status ???? $date_formatted
ステータスバーを定義する~/.config/sway/config
の部分は次のとおりです。
bar {
position top
# Keep in mind that the current directory of this config file is $HOME
status_command while ~/.config/sway/status.sh; do sleep 1; done
colors {
# Text color of status bar
statusline #ffffff
# Background of status bar
background #323232
}
font pango:DejaVu Sans Mono 10
}
これが、この構成を使用したバーの外観です。
上記の設定は i でも機能し、同じ結果になります。
絵文字をレンダリングするには、適切なフォントをインストールする必要があります。次に例を示します。
pacman -S noto-fonts-emoji
私はbashが大好きですが、Pythonスクリプトを使用しています。Pythonの標準ライブラリには、これらの種類のユーティリティがたくさんあるようです。
from datetime import datetime
from psutil import disk_usage, sensors_battery
from psutil._common import bytes2human
from socket import gethostname, gethostbyname
from subprocess import check_output
from sys import stdout
from time import sleep
def write(data):
stdout.write('%s\n' % data)
stdout.flush()
def refresh():
disk = bytes2human(disk_usage('/').free)
ip = gethostbyname(gethostname())
try:
ssid = check_output("iwgetid -r", Shell=True).strip().decode("utf-8")
ssid = "(%s)" % ssid
except Exception:
ssid = "None"
battery = int(sensors_battery().percent)
status = "Charging" if sensors_battery().power_plugged else "Discharging"
date = datetime.now().strftime('%h %d %A %H:%M')
format = "Space: %s | Internet: %s %s | Battery: %s%% %s | Date: %s"
write(format % (disk, ip, ssid, battery, status, date))
while True:
refresh()
sleep(1)
これがバーのスクリーンショットです。