24 个版本
0.4.0 | 2024年8月2日 |
---|---|
0.3.8 | 2024年1月14日 |
0.3.7 | 2023年10月12日 |
0.3.6 | 2023年5月5日 |
0.2.2 | 2022年5月11日 |
#190 在 GUI
每月 335 次下载
120KB
2K SLoC
Swayr & Swayrbar
目录
sway
术语说明:当开始这个项目时,我意外地将最近使用(MRU)和最少使用(LRU)这两个术语搞混了。我的意思是前者,但是错误地将其称为最近未使用(LRU),其含义与最近使用相同,但其缩写 LRU 实际上是相反的。因此,现在有很多命令的名称中包含
lru
,它始终表示最近使用(MRU),而不是最少使用(LRU)。已经太晚了,无法重命名这些命令。也许我会在某个时候添加别名并弃用旧名称...
Swayr 由一个守护程序和一个客户端组成。swayrd
守护程序使用 sway 的 JSON IPC 接口记录窗口/工作区创建、删除和焦点更改。swayr
客户端提供子命令,请参阅 swayr --help
,并将它们发送到守护程序执行。
swayr
二进制文件提供了许多不同类别的子命令。
这些是切换一系列窗口的命令,其中序列是
- 所有带有紧急提示的窗口。
- 所有匹配的窗口,其中哪些窗口匹配特定于每个命令。
- 序列开始时最近使用的窗口。
- 回到原始窗口,即序列开始时具有焦点的窗口。
在每次序列中,不会有任何窗口被访问两次,例如,如果某个窗口具有紧急提示、匹配命令规范并且也是 LRU 窗口,则它不会在每个步骤 1、2 和 3 中各访问一次,而只是在步骤 1 中访问一次。
可以使用标志 --skip-urgent
、--skip-lru
和 --skip-origin
分别抑制步骤 1、3 和 4。
如前所述,哪些窗口匹配特定于每个命令
switch-to-urgent-or-lru-window
不匹配任何内容,因此上述步骤 2 实际上被禁用了。switch-to-app-or-urgent-or-lru-window <name>
用于匹配具有指定名称的窗口。该名称将与窗口的app_id
进行直接比较,对于本地 Wayland 窗口,或者与 X11 窗口的窗口类或实例进行比较。如果没有任何匹配的窗口,则命令会立即退出并返回非零值。switch-to-mark-or-urgent-or-lru-window <con_mark>
用于匹配具有给定标记的窗口。根据man sway(5)
的定义,每个标记一次只能应用于一个窗口。如果没有任何匹配的窗口,则命令会立即退出并返回非零值。switch-to-matching-or-urgent-or-lru-window <criteria>
根据给定的 标准查询 匹配窗口。如果没有任何匹配的窗口,则命令会立即退出并返回非零值。
上述所有命令都具有一个标志 --skip-lru-if-current-doesnt-match
,它类似于 --skip-lru
,但在当前聚焦的窗口不是匹配窗口(通过应用程序名称、标记或标准)时才会跳过 LRU 窗口。请注意,switch-to-urgent-or-lru-window
因纯技术原因具有此标志,但那里没有任何效果。
switch-to-app-or-urgent-or-lru-window
可以方便地用于定义切换到或启动您最喜欢的应用程序的命令,例如,我有以下这些
bindsym $mod+e exec \
swayr switch-to-app-or-urgent-or-lru-window \
--skip-lru-if-current-doesnt-match emacs \
|| emacs
bindsym $mod+b exec \
swayr switch-to-app-or-urgent-or-lru-window \
--skip-lru-if-current-doesnt-match firefoxdeveloperedition \
|| firefox-developer-edition
菜单切换器
这些会启动一个菜单程序,您可以在其中选择窗口(或工作空间、输出等)并对其执行操作。
switch-window
按紧急窗口优先、最近使用顺序的窗口、最后是当前聚焦窗口的顺序显示所有窗口。在菜单程序中选择的窗口将被聚焦。steal-window
按照与switch-window
相同的顺序显示所有窗口,并将选定的窗口移动到当前工作空间。steal-window-or-container
显示所有窗口和容器,并将选定的窗口或容器移动到当前工作空间。switch-workspace
按最近使用顺序显示所有工作空间,并切换到选中的工作空间。switch-output
在菜单中显示所有输出,并聚焦选中的输出。switch-workspace-or-window
显示所有工作空间及其窗口,并切换到选中的工作空间或窗口。switch-workspace-container-or-window
在菜单程序中显示工作空间、容器及其窗口,并切换到选中的项。switch-to
在菜单程序中显示输出、工作空间、容器及其窗口,并切换到选中的项。quit-window
显示所有窗口,并退出选中的窗口。可以指定可选的--kill
/-k
标志,在这种情况下,将使用kill -9 <pid>
杀死窗口的进程,而不仅仅是向 sway 发送kill
IPC 消息。quit-workspace-or-window
显示所有工作空间及其窗口,并允许退出选中的工作空间(所有其窗口)或选中的窗口。quit-workspace-container-or-window
展示工作区、容器及其窗口,并退出选定工作区/容器或选定窗口的所有窗口。move-focused-to-workspace
将当前聚焦的窗口或容器移动到通过菜单程序选定的另一个工作区。可以使用非匹配形式的输入#w:<workspace>
(其中哈希和w:
快捷键是可选的)将其移动到新工作区。move-focused-to
将当前聚焦的容器或窗口移动到选定的输出、工作区、容器或窗口。非匹配输入的处理方式与move-focused-to-workspace
相同。swap-focused-with
将当前聚焦的窗口或容器与菜单程序中选定的窗口或容器交换。
非匹配输入的菜单快捷键
所有菜单切换命令(switch-window
、switch-workspace
和 switch-workspace-or-window
)现在处理非匹配输入,而不是什么也不做。输入应从任意数量的 #
开始(以便能够强制不匹配),后面跟一个冒号,然后是快捷键所需的一些字符串。以下快捷键是支持的。
w:<workspace>
:切换到可能不存在的工作区。<workspace>
必须是一个数字、一个名称或<digit>:<name>
格式。该格式在man 5 sway
中解释。如果提供了该格式,swayr
将使用workspace number <digit>:<name>
创建工作区。如果只提供一个数字或名称,则不使用number
参数。s:<cmd>
:使用swaymsg
执行 sway 命令<cmd>
。- 任何其他输入都假定为工作区名称,因此按
w:<input>
处理。
这些命令按最近使用顺序循环(窗口的子集)。
next-window (all-workspaces|current-workspace) 和
prev-window (all-workspaces|current-workspace)
在树的最深优先迭代顺序中聚焦下一个/前一个窗口。参数all-workspaces
或current-workspace
定义是否考虑所有工作区的所有窗口或仅当前工作区的窗口。next-tiled-window
和prev-tiled-window
的功能与next-window
和prev-window
相同,但仅切换包含在平铺容器中的窗口。next-tabbed-or-stacked-window
和prev-tabbed-or-stacked-window
的功能与next-window
和prev-window
相同,但仅切换包含在标签或堆叠容器中的窗口。next-floating-window
和prev-floating-window
的功能与next-window
和prev-window
相同,但仅切换浮动窗口。next-window-of-same-layout
和prev-window-of-same-layout
的功能类似于next-floating-window
或prev-floating-window
,如果当前窗口是浮动的;如果当前窗口在标签或堆叠容器中,则类似于next-tabbed-or-stacked-window
或prev-tabbed-or-stacked-window
;如果当前窗口在平铺容器中,则类似于next-tiled-window
或prev-tiled-window
;如果不是以上情况,则类似于next-window
或prev-window
。next-matching-window
和prev-matching-window
都需要一个 查询标准。
布局修改命令
这些命令会改变当前工作区的布局。
tile-workspace exclude-floating|include-floating
将当前工作区上的所有窗口平铺(排除或包含浮动窗口)。这是通过将所有窗口移至某个特殊工作区,将当前工作区设置为splith
布局,然后将窗口移回实现的。如果使用auto_tile
功能,请参阅下面的配置部分,它将在重新插入时从水平分割变为垂直分割。shuffle-tile-workspace exclude-floating|include-floating
打乱并平铺当前工作区上的所有窗口。打乱部分意味着(a)在重新插入之前对窗口进行打乱,并且(b)在重新插入另一个窗口之前,会先聚焦一个随机选择的已重新插入的窗口。因此,在典型水平方向的屏幕上使用tile-workspace
并有 5 个窗口时,通常会得到一个布局,其中左侧有一个窗口,其余四个窗口垂直平铺在右侧;而结合auto_tile
的shuffle-tile-workspace
则通常会得到一个更均衡的布局,即右侧垂直平铺 2 个窗口,左侧垂直平铺其余 4 个窗口。如果你只有少量窗口,只需多次重复shuffle-tile-workspace
,直到偶然创建出你想要的布局。tab-workspace exclude-floating|include-floating
将当前工作区上的所有窗口放入标签容器中。toggle-tab-shuffle-tile-workspace exclude-floating|include-floating
在标签布局和平铺布局之间切换,即如果当前是标签布局,则调用shuffle-tile-workspace
;如果当前是平铺布局,则调用shuffle-tile-workspace
。
脚本命令
get-windows-as-json
返回一个包含所有窗口的 JSON,如果提供了--include-scratchpad
,则可能包括便签窗口。此外,可以使用--matching <CRITERIA>
来限制窗口到符合给定查询条件的窗口(见 条件部分)。最后,如果提供了--error-if-no-match
且不存在窗口或窗口不符合给定的查询条件,则命令以非零退出而不是打印 JSON 数组。这使得它适合用于 shell 脚本。基本上,swayr get-windows-as-json --matching <CRITERIA> --error-if-no-match
与swaymsg <CRITERIA> nop
类似,但它返回 JSON 格式的窗口,并支持 swayr 的扩展条件查询,而不是 sway 支持的简单查询。for-each-window <CRITERIA> <SHELL_COMMAND>
对每个符合<CRITERIA>
的窗口执行<SHELL_COMMAND>
(见 条件部分)。在<SHELL_COMMAND>
中,几乎所有的占位符都已被替换。例如,swayr for-each-window true echo "应用 {app_name} 的 PID 是 {pid}。"
会显示每个窗口的应用程序名称和 PID。命令的结果是一个包含退出码、标准输出、标准错误和(系统)错误字段的 JSON 数组。如果任何命令返回非零,则for-each-window
也会返回非零。shell 命令将并行执行,它们必须在 2 秒内完成,否则将被杀死。否则,命令执行会阻塞swayrd
,直到最慢的线程完成,例如,sleep 10
将会阻塞大约 10 秒。
其他命令
configure-outputs
允许你反复发出输出配置命令,直到你中止菜单程序。execute-swaymsg-command
显示大多数不需要额外输入的 swaymsg 并执行选中的命令。这对于绑定不到键的较少使用的命令特别有用。不匹配的输入将直接以swaymsg
执行。此外,请注意,可以在 配置文件 的[swaymsg_commands]
部分中定义自定义命令。execute-swayr-command
显示上述所有命令并执行选中的命令。(这对于访问未绑定到键的 swayr 命令很有用。)nop
(不出所料)什么都不做,这个命令可以用来从一系列非菜单切换命令或窗口循环命令中退出。当处理第一个循环命令时,LRU窗口顺序将被冻结,直到收到非循环命令才会解除冻结。这个nop
命令可以方便地中断一个序列,而不会产生其他副作用。
Swayr支持Sway定义的大多数查询标准,请参阅man sway(5)
中的CRITERIA部分。目前,这些包括
app_id=<regex|__focused__>
class=<regex|__focused__>
instance=<regex|__focused__>
title=<regex|__focused__>
workspace=<regex|__focused__>
con_mark=<regex>
con_id=<uint|__focused__>
shell=<"xdg_shell" | "xwayland"| __focused__>
pid=<uint>
floating
tiling
app_name=<regex | __focused__>
(不在sway中!)
最后一个标准app_name
与应用程序的名称匹配,可以是app_id
、window_properties.class
或window_properties.instance
(哪个填了就匹配哪个)。
所有正则表达式都是Rust的正则表达式crate的正则表达式。使用特殊值__focused__
,比较是按字面意思执行的。
除了上述简单的标准外,还可以使用and
、or
和not
将标准查询组合起来,语法如下
[and <crit1> <crit2> ...]
,这与[<crit1> <crit2> ...]
等价,即and
对于与sway兼容性是可选的,sway只支持这种语法,没有or
和not
。空集合[and]
和[]
总是匹配。[or <crit1> <crit2> ...]
,其中[or]
从不匹配。not <crit>
,后面的标准将被否定。
组合器也可以全部大写书写,即AND
、OR
和NOT
,或者作为&&
、||
和!
。
显然,标准可以嵌套,因此以下是一个有效的示例
[|| [app_id="firefox" tiling]
[&& !app_id="firefox" floating workspace=__focused__]]
还存在布尔字面量 true
和 false
,它们也可以全部大写。
一些发行版已经打包了 swayr,因此您可以使用您发行版的软件包管理器进行安装。或者,使用 cargo
自己构建和安装它也很简单。
发行版软件包
以下 GNU/Linux 和 BSD 发行版已打包 swayr。感谢各位包维护者!有关详细信息,请参阅 repology 网站。
使用 cargo 构建
您需要使用官方 rust 安装页面上的单行命令安装当前稳定版本的 rust 工具链。
然后您可以这样安装 swayr
cargo install swayr
为了方便获取更新,我推荐使用 cargo cargo-update
插件。
# Install it once.
cargo install cargo-update
# Then you can update all installed rust binary crates including swayr using:
cargo install-update --all
# If you only want to update swayr, you can do so using:
cargo install-update -- swayr
您需要在 sway 配置文件中启动 swayr 守护进程(swayrd
)(~/.config/sway/config
)如下
exec env RUST_BACKTRACE=1 RUST_LOG=swayr=debug swayrd > /tmp/swayrd.log 2>&1
RUST_BACKTRACE=1
、RUST_LOG=swayr=debug
和将输出重定向到某个日志文件是可选的,但在某些东西不起作用时非常有帮助。特别是,如果您在特定情况下遇到崩溃并且想报告一个错误,如果能够以 debug
级别的回溯和日志来重现问题并附加到您的错误报告,那就非常有帮助了。从记录更多到记录更少的有效日志级别顺序是:trace
、debug
、info
、warn
、error
、off
。
除了启动守护进程之外,您可能还想将 swayr 命令绑定到某些键,如下所示
bindsym $mod+Space exec swayr switch-window
bindsym $mod+Delete exec swayr quit-window
bindsym $mod+Tab exec swayr switch-to-urgent-or-lru-window
bindsym $mod+Next exec swayr next-window all-workspaces
bindsym $mod+Prior exec swayr prev-window all-workspaces
bindsym $mod+Shift+Space exec swayr switch-workspace-or-window
bindsym $mod+c exec swayr execute-swaymsg-command
bindsym $mod+Shift+c exec swayr execute-swayr-command
当然,您可以按自己的喜好配置这些键。
在修复 Sway 问题 #6456 或合并 Sway PR #6920 之前,将可以使用 nop
命令关闭绑定到 $mod
键释放的一系列 非菜单切换命令 或 窗口循环命令。假设您的 $mod
绑定到 Super_L
,它可能看起来像这样
bindsym --release Super_L exec swayr nop
在此之前,存在 focus.auto_nop_delay
选项,如下面的 配置 部分所述。
Swayr 可以使用 ~/.config/swayr/config.toml
或 /etc/xdg/swayr/config.toml
配置文件进行配置。
如果不存在配置文件,则在第一次调用时将创建一个简单的默认配置,用于与 wofi 菜单程序一起使用。
应该很容易将默认配置适配以用于其他菜单程序,如 fuzzel、dmenu、bemenu、rofi、一个使用 fzf 启动终端的脚本,或任何其他。唯一的要求是启动器需要能够从 stdin 读取要选择的项目,并将选定的项目输出到 stdout。
默认配置如下所示
[menu]
executable = 'wofi'
args = [
'--show=dmenu',
'--allow-markup',
'--allow-images',
'--insensitive',
'--cache-file=/dev/null',
'--parse-search',
'--height=40%',
'--prompt={prompt}',
]
[format]
output_format = '{indent}<b>Output {name}</b> <span alpha=\"20000\">({id})</span>'
workspace_format = '{indent}<b>Workspace {name} [{layout}]</b> <span alpha="20000">({id})</span>'
container_format = '{indent}<b>Container [{layout}]</b> on workspace {workspace_name} <i>{marks}</i> <span alpha="20000">({id})</span>'
window_format = 'img:{app_icon}:text:{indent}<i>{app_name}</i> — {urgency_start}<b>“{title}”</b>{urgency_end} on workspace {workspace_name} <i>{marks}</i> <span alpha="20000">({id})</span>'
indent = ' '
urgency_start = '<span background="darkred" foreground="yellow">'
urgency_end = '</span>'
html_escape = true
icon_dirs = [
'/usr/share/icons/hicolor/scalable/apps',
'/usr/share/icons/hicolor/64x64/apps',
'/usr/share/icons/hicolor/48x48/apps',
'/usr/share/icons/Adwaita/64x64/apps',
'/usr/share/icons/Adwaita/48x48/apps',
'/usr/share/pixmaps',
]
[layout]
auto_tile = false
auto_tile_min_window_width_per_output_width = [
[1024, 500],
[1280, 600],
[1400, 680],
[1440, 700],
[1600, 780],
[1920, 920],
[2560, 1000],
[3440, 1000],
[4096, 1200],
]
[focus]
lockin_delay = 750
[misc]
auto_nop_delay = 3000
seq_inhibit = false
[swaymsg_commands]
include_predefined = true
[swaymsg_commands.commands]
"Window to workspace XXX" = "move window to workspace XXX"
"Workspace to left output" = "move workspace to output left"
"Workspace to right output" = "move workspace to output right"
以下将解释所有部分。
菜单部分
在 [menu]
部分,您可以使用程序名称或完整路径以及要传递的 args
(标志和选项)来指定菜单程序。如果某些参数包含占位符 {prompt}
,它将根据上下文替换为“切换窗口”之类的提示。
在 [format]
部分,指定了如何布局选择项的格式字符串。 wofi
支持 Pango 标记,这使得可以使用 HTML 和 CSS 来样式化文本。目前支持以下格式。
output_format
定义了菜单程序中输出(监视器)的显示方式,workspace_format
定义了工作空间的显示方式,container_format
定义了非工作空间容器的显示方式,而window_format
定义了应用程序窗口的显示方式。- 在这些格式中,可以使用以下占位符
{name}
被替换为输出名称、工作空间编号或名称或窗口标题。占位符{title}
是一个已弃用的同义词,将在以后的版本中删除。{layout}
显示工作空间或容器的布局。{id}
被替换为 sway 内部 con id。{pid}
被替换为 PID。{indent}
被替换为 N 倍新的format.indent
值,其中 N 是显示菜单输入的深度。{app_name}
被替换为窗口的应用程序名称。{marks}
显示容器或窗口的逗号分隔标记列表。{app_icon}
显示应用程序的图标(PNG 或 SVG 文件的路径)。{workspace_name}
被替换为容器或窗口所属的工作空间的名称或编号。- 如果窗口没有紧急标志,则占位符
{urgency_start}
和{urgency_end}
被替换为空字符串;如果设置了相同名称的格式,则替换为窗口的紧急标志值。这使得能够突出显示紧急窗口,如默认配置所示。
indent
是一个字符串,它会被反复插入到格式中的{indent}
占位符中。html_escape
定义了上述占位符(除{urgency_start}
和{urgency_end}
)替换的字符串是否应该进行 HTML 转义。urgency_start
是一个字符串,它将替换window_format
中的{urgency_start}
占位符。urgency_end
是一个字符串,它将替换window_format
中的{urgency_end}
占位符。icon_dirs
是一个目录向量,用于查找应用程序图标,以计算{app_icon}
替换。fallback_icon
是一个 PNG/SVG 图标的路径,如果没有确定应用程序特定的图标,它将被用作{app_icon}
。
除了 {app_icon}
、{indent}
、{urgency_start}
和 {urgency_end}
,其他所有内容都可以根据 Rust 的 std::fmt 指定的方式提供一个格式字符串。语法为 {<placeholder>:<fmt_str><clipped_str>}
。例如,{app_name:{:>10.10}}
表示应用程序名称以精确的 10 个字符打印。如果它更短,它将被右对齐(使用 >
)并填充空格,如果它更长,它将在第 10 个字符后截断。另一个例子,{app_name:{:.10}...}
表示应用程序名称在第 10 个字符处截断。如果它更短,它将按原样打印(没有填充),如果它更长,它将在第 10 个字符后截断,并将该子字符串的最后 3 个字符替换为 ...
(《<clipped_str>》)。
在选择(使用wofi或其他菜单程序)过程中,每个窗口必须有不同的显示字符串,这一点至关重要。因此,强烈建议至少在container_format
和window_format
中包含{id}
占位符。否则,例如,在同一工作空间上的两个垂直分割或两个具有相同工作目录(因此,相同标题)的终端(同一终端应用程序)将无法区分。
针对wofi的提示:wofi
支持使用语法'img:<image-file>:text:<text>'
的图标,因此,带有应用程序图标的合适的window_format
应从img:{app_icon}:text:
开始。
针对rofi的提示:rofi
支持使用语法"<text>\u0000icon\u001f<image-file>"
的图标,因此,带有应用程序图标的合适的window_format
应以"\u0000icon\u001f{app_icon}"
结束。请注意,您必须用双引号而不是单引号包围您的window_format
值。在TOML中,单引号字符串是字面字符串,其中不处理转义序列,而对于双引号字符串(所谓的基本字符串),则处理转义序列。rofi
需要一个空字符和一个段落分隔符来处理图像序列。
针对fuzzel的提示:我被告知fuzzel
支持与上面讨论的rofi
相同的图标语法。
布局部分
在[layout]
部分,您可以通过将auto_tile
设置为true
(默认为false
)来启用自动平铺。选项auto_tile_min_window_width_per_output_width
定义了每个输出宽度应有的最小窗口宽度(以像素为单位)。例如,上面的示例设置表示在宽度为1600像素的输出上,每个窗口应至少有780像素的宽度,因此最多可以有两侧并排的窗口(注意,包括您的边框和间隙!)。如果未包含输出宽度的确切值,则不会自动平铺。
如果启用了auto_tile
,swayr将根据此算法自动垂直或水平分割
- 对于所有输出
- 对于该输出上所有(嵌套)容器(除了scratchpad)
- 对于该容器的所有子窗口
- 如果容器水平分割,并且创建另一个窗口会使当前子窗口的宽度小于最小宽度,则在子窗口上执行
split vertical
(通过IPC的swaymsg
命令)。 - 否则,如果容器垂直分割,并且现在有足够的空间,创建另一个窗口仍可以使当前子窗口的宽度大于或等于最小宽度,则在子窗口上调用
split horizontal
。 - 否则,对此容器不做任何事情。这意味着堆叠或标签式容器永远不会受到自动平铺的影响。
- 如果容器水平分割,并且创建另一个窗口会使当前子窗口的宽度小于最小宽度,则在子窗口上执行
- 对于该容器的所有子窗口
- 对于该输出上所有(嵌套)容器(除了scratchpad)
有一个注意事项:当窗口或容器大小调整时,也很希望同时触发自动平铺,但遗憾的是,调整大小不会通过IPC引发任何事件。因此,自动平铺是由新窗口事件、关闭事件、移动事件、浮动事件和焦点事件触发的。后者是一种变通方法,如果存在调整大小事件,则不需要。
焦点部分
在 [focus] 部分中,您可以配置窗口保持焦点以影响LRU顺序的时间,即
lockin_delay
(以毫秒为单位)。如果某个窗口只是短暂地被聚焦,例如,通过使用sway的 focus_follows_mouse
设置为 yes
或 always
时将鼠标移到它上面,那么其LRU顺序中的位置将不会改变。
杂项部分
在 [misc] 部分中,存在
auto_nop_delay
选项。当执行某些swayr命令时,在此等待一段时间后,将执行 nop
命令(参见命令文档),以跳出 next-*-窗口
/prev-*-窗口
序列或 switch-to-*或-urgent--lru-窗口
循环。如果在规定时间内执行了另一个swayr命令,则自动 nop
执行将延迟 auto_nop_delay
毫秒。如果没有明确指定此选项,则不会执行任何自动 nop
命令。
在使用部分的最后,讨论了一个更优雅的解决方案,使用键释放绑定。然而,这需要一个尚未合并到sway中的PR。
seq_inhibit
布尔值控制 swayrd
在 序列 窗口循环命令中的行为。
-
当设置为
true
(默认值)时,swayrd
会在窗口循环序列期间抑制窗口LRU更新。序列结束时,LRU更新将被重新激活。序列被视为结束时,当swayrd
收到任何非窗口循环命令(例如nop
命令)。注意:LRU更新抑制也适用于在
swayrd
之外进行的焦点更改,例如通过直接使用sway命令。 -
当设置为默认值(
false
)时,swayrd
会以相同的方式处理焦点事件,无论窗口循环序列是否正在进行。
注意,键释放绑定解决方案适用于使用 seq_inhibit=true
。
swaymsg_commands部分
本节配置了 execute-swaymsg-command
命令。
include_predefined
选项定义是否应包含swayr长期以来提供的默认swaymsg命令。commands
映射定义了您的自定义命令,格式为label = command
对。由于它是一个映射,标签(键)必须是唯一的。
自0.8.0版本开始,我已经开始编写一个NEWS文件,列出新闻以及swayr命令或配置选项的更改。如果在更新后某个功能似乎不符合预期,请查阅此文件,以检查是否有一些(可能是不兼容的)更改需要更新您的配置。
swayrbar
是sway的swaybar
的状态命令,实现了swaybar-protocol(7)
。这意味着,您可以在您的~/.config/sway/config
中这样设置您的swaybar
。
bar {
swaybar_command swaybar
# Use swayrbar as status command with some logging output which
# is redirected to /tmp/swayrbar.log. Be sure to only redirect
# stderr because the swaybar protocol requires the status_command
# to emit JSON to stdout which swaybar reads.
status_command env RUST_BACKTRACE=1 RUST_LOG=swayr=debug swayrbar 2> /tmp/swayrbar.log
position top
font pango:Iosevka 11
height 20
colors {
statusline #f8c500
background #33333390
}
}
swayrbar
,就像waybar一样,由一组模块组成,您可以通过其配置文件启用和配置这些模块,无论是通过命令行选项--config-file
指定的,用户特定的(~/.config/swayrbar/config.toml
),还是系统范围的(/etc/xdg/swayrbar/config.toml
)。模块会发出信息,然后swaybar将其显示出来,并且在swaybar
中点击模块的空间会将鼠标点击事件传播回去并触发一些动作(例如,一个shell命令)。
目前有以下模块:
window
模块可以在sway中显示当前窗口的标题和应用程序名称。sysinfo
模块可以显示诸如CPU/内存利用率或系统负载等信息。battery
模块可以显示当前的充电状态、状态(例如,正在充电)和健康状态。date
模块可以显示当前的日期和时间!pactl
模块可以显示当前的音量百分比和静音状态。点击可以增加/减少音量或切换静音状态。nmcli
模块使用NetworkManager的nmcli
命令行工具来显示当前连接的Wi-Fi及其信号强度。iwctl
模块使用iwctl
命令行工具来显示当前连接的Wi-Fi及其信号强度。
我相信随着时间的推移,会有更多的模块。当然,欢迎补丁!
一些发行版有swayrbar软件包,您可以使用您发行版的包管理器安装它,有关详细信息,请参阅repology网站。或者,使用cargo
构建和安装它非常简单。
通过Cargo安装
您需要使用官方 rust 安装页面上的单行命令安装当前稳定版本的 rust 工具链。
然后您可以像这样安装swayrbar
cargo install swayrbar
为了轻松获取更新,我推荐使用cargo的install-update
插件。
# Install it once.
cargo install install-update
# Then you can update all installed rust binary crates including swayr using:
cargo install-update --all
# If you only want to update swayr, you can do so using:
cargo install-update -- swayrbar
当swayrbar
第一次运行且未在~/.config/swayrbar/config.toml
(用户特定)或/etc/xdg/swayrbar/config.toml
(系统范围)中找到现有配置文件时,它将在用户特定位置创建一个新的配置文件,其中所有模块都已启用,并使用一些合理的(根据作者的观点)默认值进行设置。根据您的需求进行修改。
配置文件的语法是TOML。这里有一个包含所有顶级选项(一个!)和一个模块的简短示例。
refresh_interval = 1000
[[modules]]
name = 'window'
instance = '0'
format = '🪟 {title} — {app_name}'
html_escape = false
[modules.on_click]
Left = ['swayr', 'switch-to-urgent-or-lru-window']
Right = ['kill', '{pid}']
refresh_interval
定义了swaybar
刷新之间的毫秒数。
配置的剩余部分定义了一个模块列表及其配置(在 TOML 中是一个表格数组,其中模块的 on_click
)。
name
是模块的名称或类型,例如window
、sysinfo
、battery
、date
、...instance
是一个任意字符串,用于区分具有相同name
的两个模块。例如,您可能希望有两个sysinfo
模块,一个用于 CPU 利用率,另一个用于内存利用率,仅仅是在这些不同类型的信息之间有一个分隔符。这很容易实现,只需为它们分配不同的instance
值即可。format
是要在swaybar
中打印的字符串,其中某些占位符会被模块特定的值替换。通常,这样的占位符写成{title}
,即在大括号内。就像在swayr
中一样,格式化(填充、对齐、精度等)是可用的,请参阅这里。html_escape
定义了是否应该将<
、>
和&
转义为<
、>
和&
,因为format
可能包含 pango 标记。显然,如果您使用此功能,您希望将该模块的html_escape = true
设置为 true。此选项是可选的,可以省略,其含义与将其设置为false
相同。on_click
是一个表格,定义了在您点击swaybar
中模块的空间时要执行的 shell 命令。这里也提供了在format
中可用的所有占位符。每个鼠标按钮的动作指定为一个数组['command', 'arg1', 'arg2',...]
。可分配的按钮名称有Left
、Middle
、Right
、WheelUp
、WheelDown
、WheelLeft
和WheelRight
。
on_click
表格也可以写成内联表格
on_click = { Left = ['swayr', 'switch-to-urgent-or-lru-window'], Right = ['kill', '{pid}'] }
但必须放在一行上。
window
模块
window
模块支持以下占位符
{title}
或{name}
展开为当前聚焦窗口的标题。{app_name}
是应用程序名称。{pid}
是进程 ID。
请注意,window
模块也会响应非当前窗口的标题更改事件,这是一个特性!例如,假设您的Emacs在1号工作区聚焦。现在您在那里点击一个链接,这将导致在(不可见的)2号工作区打开Firefox的新标签。这将导致swayrbar
显示Firefox的标题,让您知道您的点击产生了效果。最多3秒后,聚焦应用程序的标题将再次显示。
默认情况下,它有以下点击绑定
左键
执行swayr switch-to-urgent-or-lru-window
。右键
终止窗口的进程。
sysinfo
模块
sysinfo
模块支持以下占位符
{cpu_usage}
是CPU利用率百分比。{mem_usage}
是内存利用率百分比。{load_avg_1}
是过去一分钟的系统平均负载。{load_avg_5}
是过去五分钟的系统平均负载。{load_avg_15}
是过去十五分钟的系统平均负载。
默认情况下,它有以下点击绑定
左键
执行foot htop
。
battery
模块
battery
模块支持以下占位符
{state_of_charge}
是相对于电池当前容量的充电百分比。{state_of_health}
是相对于原始容量的剩余容量百分比。{state}
是当前状态,例如,类似于放电或满电。
pactl
模块
pactl
模块需要安装同名脉冲音频命令行工具。它支持以下占位符
{volume}
是默认声源的当前音量百分比。{muted}
如果默认声源当前静音,则是字符串" muted"
,否则是空字符串。{volume_source}
是默认源的当前音量百分比。{muted_source}
如果默认源当前静音,则是字符串" muted"
,否则是空字符串。
默认情况下,它有以下点击绑定
Left
调用pavucontrol
程序(PulseAudio 图形界面控制)。Right
切换默认声道的静音状态。WheelUp
和WheelDown
增加或减少默认声道的音量。
nmcli
模块
nmcli
模块需要 NetworkManager 和 nmcli
命令行工具。它可以显示关于 WiFi 连接的信息。它支持以下占位符
{name}
WiFi 网络名称。{signal}
无线信号强度(百分比)。{bars}
连接强度的可视化,例如“▂▄▆_”。
iwctl
模块
iwctl
模块需要随 iwd
一起提供的 iwctl
命令行工具。它可以显示关于 WiFi 连接的信息。它支持以下占位符
{name}
WiFi 网络名称。{signal}
无线信号强度(dBm)。{bars}
连接强度的可视化,例如“▂▄▆_”。
date
模块
date
模块通过使用 chrono 的 strftime 格式 定义 format
来显示日期和时间。
cmd
模块
cmd
模块可用于运行 shell 命令并显示其输出。
使用 format
配置选项指定命令。它将通过 sh -c
执行,其输出将在 swaybar
的模块空间中显示。
html_escape
选项控制是否在命令输出显示在栏中之前执行 HTML 实体替换,即如果您的命令输出包含 <
、>
或 &
但不是有效的 pango 标记,则应将其设置为 true
。
此模块没有占位符或默认配置。
版本更改总结在 NEWS 文件中。如果更新后某些内容似乎没有按预期工作,请参阅此文件以检查是否有一些(可能不兼容的)更改需要更新您的配置。
有关提问、发送反馈或补丁,请参阅 我的公开邮箱(邮件列表)。请在主题中提及您所引用的项目,例如 swayr
或 swayrbar
(或不同存储库中的其他项目)。
它可以编译,因此没有错误。哦,如果您仍然找到了一个或想要请求一个功能,您可以在 这里 做到。
Swayr 和 Swayrbar 根据 GPLv3(或更高版本)授权。
依赖关系
~7–17MB
~224K SLoC