16 个版本

0.8.4 2023 年 12 月 22 日
0.8.2 2023 年 7 月 29 日
0.7.3 2023 年 3 月 23 日
0.6.1 2022 年 12 月 19 日
0.6.0 2022 年 11 月 2 日

命令行工具 中排名 #91

Download history 72/week @ 2024-03-08 343/week @ 2024-03-15 4/week @ 2024-03-29

每月下载 53

GPL-3.0-or-later

62KB
1.5K SLoC

smolbar

Crates.io Crates.io

smolbar 是 sway 的 smol 状态命令。

安装

smolbar 在 crates.io 上!

$ cargo install --locked smolbar

使用方法

确保 smolbar 已安装并在您的 $PATH 中。在 sway 配置中,使用 smolbar 调用 bar 子命令的 status_command

bar {
	status_command smolbar
	# the rest of your bar config
}

心智模型

smolbar 履行由 swaybar-protocol(7) 描述的角色[^1]。用户通过其配置文件控制 smolbar 的行为。请注意,其可配置行为是协议中概述行为的超集。

[^1]: 如果您在配置或理解 smolbar 时遇到问题,阅读此手册页是个好主意。

块是可刷新内容的基本单位。该内容的结构由协议中的 Body JSON 对象定义,并包含额外的信息以便使用。为了动态更新,块需要同时具有“内容来源”(即内容来源)和“何时更新内容”(即何时刷新内容)。

“内容来源”通过为块提供要执行的命令来实现。整个 Body JSON 对象用该命令的输出填充。

“何时更新内容”目前有两种实现方式:周期性间隔和操作系统信号。这意味着块的内容会在计时器上刷新,并且每当 smolbar 收到特定信号时。

请参阅 本地作用域配置

栏是块的所有者[^2]。smolbar 的核心行为是当块有新内容时发送栏的块。

条形图还负责响应 cont_signalstop_signal,它通过 Header JSON 对象(也来自协议)发送这些信号。如果接收到 stop_signal,则 smolbar 将按照规范优雅地关闭。在接收到 cont_signal 后,smolbar 将重新加载其配置。请注意,smolbarcont_signal 赋予了新的含义,因为协议中描述的含义并不特别适用。

[^2]: 在代码库之外,“bar” 并不是一个非常有用的抽象,可以将其视为 smolbar 本身。

配置

smolbar 通过 TOML 文件进行配置。

如果没有指定作为参数的 --config,则 smolbar 会查找位于 $XDG_CONFIG_HOME/smolbar$HOME/.config/smolbar 的名为 config.toml 的文件。

配置的示例 可用。

头部

首次发送给 sway 的 Header(由 swaybar-protocol(7) 定义)可以在 header TOML 表中进行配置。它直接继承自 Header 的所有键。

[header]
cont_signal = "SIGCONT" # default value, as per swaybar-protocol(7)
stop_signal = "SIGINT"

可以在三个范围内定义块的内容和行为。

  • “全局”范围优先级最低,但适用于所有块。
  • “本地”范围按块定义。
  • “立即”范围优先级最高,按块定义,但由块的命令定义。

这意味着全局和本地范围可用于为 Body 属性提供默认值,而立即范围对属性更改很有用。

[^3]: “块的 内容”指的是 swaybar-protocol(7) 定义的 Body JSON 对象属性的超集。更多关于此的信息可以在 心智模型 部分找到。

全局范围

全局范围在配置文件的根级别进行配置。

类型 描述
command_dir 字符串 设置要执行 command(在本地范围中定义)的目录
smolbar_version 字符串 需要当前 smolbar 版本以满足给定的版本要求(根据 Cargo 的语义版本控制风格 解析)

全局范围还继承自 swaybar-protocol(7) 定义的 Body JSON 对象的所有属性。

例如

# global
full_text = "only visible if no other scopes define full_text"

[[block]]
# local
full_text = "never see global full_text"

本地范围

所有本地范围都是 block 数组中的表。

类型 描述
command 字符串 为新的内容执行命令的完整路径[^4]
prefix 字符串 前缀 full_text
postfix 字符串 附加到 full_text
interval 数字 周期刷新块的时间间隔,单位为秒
信号 字符串 当接收到该操作系统信号时刷新块的信号名

本地作用域继承自 Body 的所有其他键。

例如

[[block]]
# this block displays the date every second
command = "date" # assuming date coreutil is in $PATH
prefix = "Today is "
interval = 1

[^4]: 刷新不会干扰命令的执行,它会等待命令完成。

立即作用域

执行的 command(在本地作用域中定义)的每行标准输出都会按顺序解析为 Body 属性。顺序与在 swaybar-protocol(7) 中出现顺序相同。

例如,假设以下脚本是一个块的命令

# interpreted as `full_text`
echo 'amazing status information'

# interpreted as `short_text`
echo 'short info'

# interpreted as `color`
echo '#ff0000'

热插拔

smolbarcont_signal 的响应是通过重新加载其配置。

这意味着默认情况下,向 smolbar 的进程发送 SIGCONT 信号将导致其热插拔配置。

[header]
# cont_signal is SIGCONT by default, as per swaybar-protocol(7)
$ pkill -SIGCONT smolbar
# causes smolbar to reload config

cont_signal 也可以配置。

[header]
cont_signal = "SIGUSR1"
$ pkill -SIGUSR1 smolbar
# causes smolbar to reload config

注意,在运行时不能重新配置标题。这是因为在 swaybar-protocol(7) 中,它只发送一次,在状态命令进程的开始处。

支持的信号

目前支持以下操作系统信号

  • SIGALRM
  • SIGCHLD
  • SIGCONT
  • SIGHUP
  • SIGINT
  • SIGIO
  • SIGPIPE
  • SIGQUIT
  • SIGSTOP
  • SIGTERM
  • SIGUSR1
  • SIGUSR2
  • SIGWINCH

安全考虑

根据其配置文件定义,smolbar 以其固有的方式执行任意代码

如果攻击者可以写入配置文件,或者写入定义为其命令的任何文件,则攻击者可以执行任意代码(立即执行或当配置重新加载时执行)。

防止这种情况是 您的责任。确保没有其他用户被授予配置或其命令的写权限是个好主意。然而,您采取的措施将 取决于您的具体情况

贡献

欢迎和赞赏提交票据和改进!您可以在 GitLab 上的 问题跟踪器 找到。

贡献将根据 smolbar 相同的许可证授权。

许可证

smolbar 授权根据 GNU 通用公共许可证 v3.0 或更高版本。

有关完整的许可证文本,请参阅 LICENSE

依赖关系

~7-19MB
~215K SLoC