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日

#190GUI

Download history 6/week @ 2024-04-29 5/week @ 2024-05-06 5/week @ 2024-05-13 9/week @ 2024-05-20 19/week @ 2024-05-27 2/week @ 2024-06-03 450/week @ 2024-06-10 15/week @ 2024-06-17 11/week @ 2024-06-24 51/week @ 2024-07-01 8/week @ 2024-07-08 10/week @ 2024-07-15 151/week @ 2024-07-22 111/week @ 2024-07-29 36/week @ 2024-08-05 36/week @ 2024-08-12

每月 335 次下载

GPL-3.0+

120KB
2K SLoC

Swayr & Swayrbar

builds.sr.ht status License GPL 3 or later dependency status Hits-of-Code

目录

sway

latest release

术语说明:当开始这个项目时,我意外地将最近使用(MRU)和最少使用(LRU)这两个术语搞混了。我的意思是前者,但是错误地将其称为最近未使用(LRU),其含义与最近使用相同,但其缩写 LRU 实际上是相反的。因此,现在有很多命令的名称中包含 lru,它始终表示最近使用(MRU),而不是最少使用(LRU)。已经太晚了,无法重命名这些命令。也许我会在某个时候添加别名并弃用旧名称...

Swayr 由一个守护程序和一个客户端组成。swayrd 守护程序使用 sway 的 JSON IPC 接口记录窗口/工作区创建、删除和焦点更改。swayr 客户端提供子命令,请参阅 swayr --help,并将它们发送到守护程序执行。

swayr 二进制文件提供了许多不同类别的子命令。

这些是切换一系列窗口的命令,其中序列是

  1. 所有带有紧急提示的窗口。
  2. 所有匹配的窗口,其中哪些窗口匹配特定于每个命令。
  3. 序列开始时最近使用的窗口。
  4. 回到原始窗口,即序列开始时具有焦点的窗口。

在每次序列中,不会有任何窗口被访问两次,例如,如果某个窗口具有紧急提示、匹配命令规范并且也是 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-windowswitch-workspaceswitch-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-workspacescurrent-workspace 定义是否考虑所有工作区的所有窗口或仅当前工作区的窗口。
  • next-tiled-windowprev-tiled-window 的功能与 next-windowprev-window 相同,但仅切换包含在平铺容器中的窗口。
  • next-tabbed-or-stacked-windowprev-tabbed-or-stacked-window 的功能与 next-windowprev-window 相同,但仅切换包含在标签或堆叠容器中的窗口。
  • next-floating-windowprev-floating-window 的功能与 next-windowprev-window 相同,但仅切换浮动窗口。
  • next-window-of-same-layoutprev-window-of-same-layout 的功能类似于 next-floating-windowprev-floating-window,如果当前窗口是浮动的;如果当前窗口在标签或堆叠容器中,则类似于 next-tabbed-or-stacked-windowprev-tabbed-or-stacked-window;如果当前窗口在平铺容器中,则类似于 next-tiled-windowprev-tiled-window;如果不是以上情况,则类似于 next-windowprev-window
  • next-matching-windowprev-matching-window 都需要一个 查询标准

布局修改命令

这些命令会改变当前工作区的布局。

  • tile-workspace exclude-floating|include-floating 将当前工作区上的所有窗口平铺(排除或包含浮动窗口)。这是通过将所有窗口移至某个特殊工作区,将当前工作区设置为 splith 布局,然后将窗口移回实现的。如果使用 auto_tile 功能,请参阅下面的配置部分,它将在重新插入时从水平分割变为垂直分割。
  • shuffle-tile-workspace exclude-floating|include-floating 打乱并平铺当前工作区上的所有窗口。打乱部分意味着(a)在重新插入之前对窗口进行打乱,并且(b)在重新插入另一个窗口之前,会先聚焦一个随机选择的已重新插入的窗口。因此,在典型水平方向的屏幕上使用 tile-workspace 并有 5 个窗口时,通常会得到一个布局,其中左侧有一个窗口,其余四个窗口垂直平铺在右侧;而结合 auto_tileshuffle-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-matchswaymsg <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_idwindow_properties.classwindow_properties.instance(哪个填了就匹配哪个)。

所有正则表达式都是Rust的正则表达式crate的正则表达式。使用特殊值__focused__,比较是按字面意思执行的。

除了上述简单的标准外,还可以使用andornot将标准查询组合起来,语法如下

  • [and <crit1> <crit2> ...],这与[<crit1> <crit2> ...]等价,即and对于与sway兼容性是可选的,sway只支持这种语法,没有ornot。空集合[and][]总是匹配。
  • [or <crit1> <crit2> ...],其中[or]从不匹配。
  • not <crit>,后面的标准将被否定。

组合器也可以全部大写书写,即ANDORNOT,或者作为&&||!

显然,标准可以嵌套,因此以下是一个有效的示例

[|| [app_id="firefox" tiling]
    [&& !app_id="firefox" floating workspace=__focused__]]

还存在布尔字面量 truefalse,它们也可以全部大写。

A screenshot of swayr switch-window

A screenshot of swayr switch-workspace-or-window

一些发行版已经打包了 swayr,因此您可以使用您发行版的软件包管理器进行安装。或者,使用 cargo 自己构建和安装它也很简单。

发行版软件包

以下 GNU/Linux 和 BSD 发行版已打包 swayr。感谢各位包维护者!有关详细信息,请参阅 repology 网站

Packaging status AUR swayr-git package status

使用 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=1RUST_LOG=swayr=debug 和将输出重定向到某个日志文件是可选的,但在某些东西不起作用时非常有帮助。特别是,如果您在特定情况下遇到崩溃并且想报告一个错误,如果能够以 debug 级别的回溯和日志来重现问题并附加到您的错误报告,那就非常有帮助了。从记录更多到记录更少的有效日志级别顺序是:tracedebuginfowarnerroroff

除了启动守护进程之外,您可能还想将 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 菜单程序一起使用。

应该很容易将默认配置适配以用于其他菜单程序,如 fuzzeldmenubemenurofi、一个使用 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_formatwindow_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
        • 否则,对此容器不做任何事情。这意味着堆叠或标签式容器永远不会受到自动平铺的影响。

有一个注意事项:当窗口或容器大小调整时,也很希望同时触发自动平铺,但遗憾的是,调整大小不会通过IPC引发任何事件。因此,自动平铺是由新窗口事件、关闭事件、移动事件、浮动事件和焦点事件触发的。后者是一种变通方法,如果存在调整大小事件,则不需要。

焦点部分

[focus] 部分中,您可以配置窗口保持焦点以影响LRU顺序的时间,即 lockin_delay(以毫秒为单位)。如果某个窗口只是短暂地被聚焦,例如,通过使用sway的 focus_follows_mouse 设置为 yesalways 时将鼠标移到它上面,那么其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命令或配置选项的更改。如果在更新后某个功能似乎不符合预期,请查阅此文件,以检查是否有一些(可能是不兼容的)更改需要更新您的配置。

latest release

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命令)。

目前有以下模块:

  1. window模块可以在sway中显示当前窗口的标题和应用程序名称。
  2. sysinfo模块可以显示诸如CPU/内存利用率或系统负载等信息。
  3. battery模块可以显示当前的充电状态、状态(例如,正在充电)和健康状态
  4. date模块可以显示当前的日期和时间!
  5. pactl模块可以显示当前的音量百分比和静音状态。点击可以增加/减少音量或切换静音状态。
  6. nmcli模块使用NetworkManager的nmcli命令行工具来显示当前连接的Wi-Fi及其信号强度。
  7. iwctl模块使用iwctl命令行工具来显示当前连接的Wi-Fi及其信号强度。

我相信随着时间的推移,会有更多的模块。当然,欢迎补丁

A screenshot of swaybar running with swayrbar

一些发行版有swayrbar软件包,您可以使用您发行版的包管理器安装它,有关详细信息,请参阅repology网站。或者,使用cargo构建和安装它非常简单。

Packaging status

通过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 是模块的名称或类型,例如 windowsysinfobatterydate、...
  • instance 是一个任意字符串,用于区分具有相同 name 的两个模块。例如,您可能希望有两个 sysinfo 模块,一个用于 CPU 利用率,另一个用于内存利用率,仅仅是在这些不同类型的信息之间有一个分隔符。这很容易实现,只需为它们分配不同的 instance 值即可。
  • format 是要在 swaybar 中打印的字符串,其中某些占位符会被模块特定的值替换。通常,这样的占位符写成 {title},即在大括号内。就像在 swayr 中一样,格式化(填充、对齐、精度等)是可用的,请参阅这里
  • html_escape 定义了是否应该将 <>& 转义为 &lt;&gt;&amp;,因为 format 可能包含 pango 标记。显然,如果您使用此功能,您希望将该模块的 html_escape = true 设置为 true。此选项是可选的,可以省略,其含义与将其设置为 false 相同。
  • on_click 是一个表格,定义了在您点击 swaybar 中模块的空间时要执行的 shell 命令。这里也提供了在 format 中可用的所有占位符。每个鼠标按钮的动作指定为一个数组 ['command', 'arg1', 'arg2',...]。可分配的按钮名称有 LeftMiddleRightWheelUpWheelDownWheelLeftWheelRight

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 切换默认声道的静音状态。
  • WheelUpWheelDown 增加或减少默认声道的音量。

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 文件中。如果更新后某些内容似乎没有按预期工作,请参阅此文件以检查是否有一些(可能不兼容的)更改需要更新您的配置。

有关提问、发送反馈或补丁,请参阅 我的公开邮箱(邮件列表)。请在主题中提及您所引用的项目,例如 swayrswayrbar(或不同存储库中的其他项目)。

它可以编译,因此没有错误。哦,如果您仍然找到了一个或想要请求一个功能,您可以在 这里 做到。

builds.sr.ht status

Swayr 和 Swayrbar 根据 GPLv3(或更高版本)授权。

依赖关系

~7–17MB
~224K SLoC