#窗口管理器 #sway #命令 #lru #名称 #焦点 #配置

bin+lib swayr

为 sway 窗口管理器提供 LRU 窗口切换器(及其他功能)

103 个版本

0.27.4 2024 年 7 月 6 日
0.27.3 2024 年 1 月 25 日
0.27.1 2023 年 10 月 12 日
0.27.0 2023 年 6 月 24 日
0.3.3 2021 年 2 月 23 日

#37 in GUI

Download history 47/week @ 2024-05-02 39/week @ 2024-05-09 44/week @ 2024-05-16 47/week @ 2024-05-23 61/week @ 2024-05-30 1036/week @ 2024-06-06 56/week @ 2024-06-13 61/week @ 2024-06-20 36/week @ 2024-06-27 375/week @ 2024-07-04 188/week @ 2024-07-11 77/week @ 2024-07-18 104/week @ 2024-07-25 75/week @ 2024-08-01 67/week @ 2024-08-08 36/week @ 2024-08-15

每月 289 次下载

GPL-3.0+

210KB
4K SLoC

Swayr & Swayrbar

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

目录

sway

latest release

术语说明:在开始这个项目时,我搞混了最近最少使用(MRU)和最近最少使用(LRU)这两个术语。我的意思是前者,但称之为最后最近使用,其含义与最近最少使用相同,但其缩写 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>:切换到可能不存在的工作空间。 <digit>:<name> 必须是数字、名称或 <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-window & prev-tiled-windownext-window & prev-window 的作用相同,但仅切换包含在平铺容器中的窗口。
  • next-tabbed-or-stacked-window & prev-tabbed-or-stacked-windownext-window & prev-window 的作用相同,但仅切换包含在标签或堆叠容器中的窗口。
  • next-floating-window & prev-floating-windownext-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个窗口时,通常会导致一个布局,其中一个窗口在左侧,其余四个窗口垂直平铺在右侧,而与 shuffle-tile-workspace 结合使用并配合 auto_tile 通常会导致更平衡的布局,即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。命令的结果是一个包含退出代码、stdout、stderr 和系统错误字段的 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 的 regex crates regexes。使用特殊值 __focused__,比较是按字面意思进行的。

除了上述简单标准外,可以使用 andornot 结合使用标准查询,语法如下

  • [and <crit1> <crit2> ...],这等价于 [<crit1> <crit2> ...],即,and 是可选的,以与仅支持此语法且没有 ornot 的 sway 兼容。[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配置(~/.config/sway/config)中启动swayr守护进程(swayrd),如下所示

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的合并,将可以使用绑定到$mod键释放的nop命令关闭一系列非菜单切换命令窗口循环命令。假设您的$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] 部分,您可以使用 executable 名称或完整路径以及要传递的 args(标志和选项)来指定菜单程序。如果某些参数包含占位符 {prompt},则根据上下文将其替换为类似于“切换到窗口”的提示。

[format] 部分,指定了格式化字符串,定义了如何排列选择项。 wofi 支持链接到 pango markup,这使得可以使用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 指定。语法是 {<占位符>:<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 将根据此算法自动垂直或水平分割

  • 对于所有输出
    • 对于该输出上所有(嵌套)容器(除了临时便笺)
      • 对于该容器的所有子窗口
        • 如果容器水平分割,并且创建另一个窗口会使当前子窗口小于最小宽度,则在子窗口上执行 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 更新抑制也适用于在 swayr 外部进行的焦点更改,例如直接使用 sway 命令。

  • 当设置值为 false(默认值)时,swayrd 将以相同的方式处理焦点事件,无论窗口循环序列是否正在进行。

注意,键释放绑定解决方案适用于使用 seq_inhibit=true

swaymsg_commands 节

本节配置 execute-swaymsg-command 命令。

  • 选项 include_predefined 定义是否应包含 swayr 提供了很长时间的默认 swaymsg 命令。
  • commands 映射定义了您的自定义命令作为 label = command 对。由于它是一个映射,因此标签(键)必须是唯一的。

从 0.8.0 版本开始,我开始编写一个 新闻 文件,列出新闻、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 是一个用于区分同名模块的任意字符串。例如,你可能想要有两个 sysinfo 模块,一个用于 CPU 利用率,另一个用于内存利用率,只是为了在这些不同类型的信息之间有一个分隔符。这很容易实现,只需给它们不同的 instance 值即可。
  • format 是在 swaybar 中打印的字符串,其中某些占位符被模块特定的值替换。通常,这样的占位符写成 {title} 的形式,即在花括号内。就像在 swayr 一样,格式化(填充、对齐、精度等)是可用的,请参阅 此处
  • html_escape 定义是否应将 <>& 转义为 &lt;&gt;&amp;,因为 format 可能包含 pango 标记。显然,如果你使用此功能,你想要将该模块的 html_escape = true 设置为 true。此选项是可选的,可以省略。
  • on_click 是一个表格,定义了在 swaybar 中点击模块空间时要执行的操作。这里也提供了所有在 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 模块还会对非当前窗口的标题更改事件做出反应,这是一个功能!例如,考虑你在工作区 1 上的 Emacs 聚焦。现在你点击其中的一个链接,这会导致你的 Firefox 在(不可见的工作区)2 上打开一个新标签。这将导致 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",否则为空字符串。

默认情况下,它有以下点击绑定

  • 左键调用pavucontrol程序(脉冲音频GUI控制)。
  • 右键切换默认声道的静音状态。
  • WheelUpWheelDown增加/减少默认声道的音量。

nmcli模块

nmcli模块需要网络管理器和nmcli命令行工具。它可以显示wifi连接的信息。它支持以下占位符

  • {name} wifi网络名称。
  • {signal}无线信号强度(%)。
  • {bars}是连接强度的可视化,如“▂▄▆_”。

iwctl模块

iwctl模块需要与iwd一起提供的iwctl命令行工具。它可以显示wifi连接的信息。它支持以下占位符

  • {name} wifi网络名称。
  • {signal} 无线信号强度(单位:dBm)。
  • {bars}是连接强度的可视化,如“▂▄▆_”。

date 模块

date 模块通过使用chrono的strftime格式定义format来显示日期和时间。

版本变更总结在NEWS文件中。如果更新后某些功能似乎没有按预期工作,请查阅此文件,以检查是否有一些(可能是兼容性)变更需要更新您的配置。

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

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

builds.sr.ht status

Swayr和Swayrbar受GPLv3(或更高版本)许可。

依赖项

~5–14MB
~163K SLoC