尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

niri 工作区(Workspaces)完全指南:动态工作区模型、索引寻址与多显示器行为

niri 工作区(Workspaces)完全指南:动态工作区模型、索引寻址与多显示器行为 niri 工作区Workspaces完全指南动态工作区模型、索引寻址与多显示器行为【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri本指南以 niri 官方 Wiki 的 Workspaces 文档 为主体结合 命名工作区文档 与仓库源码系统讲解 niri 的动态工作区模型工作区如何在显示器上垂直排列、如何聚焦与移动、空工作区如何自动消失、工作区如何在多显示器之间迁移并记住原显示器以及基于索引与名称的两种寻址方式。读完本文你将掌握 niri 工作区的完整心智模型并能正确配置按键绑定、命名工作区与示例工作流。动态工作区模型每个显示器拥有一组垂直排列的工作区niri 的工作区是动态的并且可以跨显示器移动。这与传统平铺窗口管理器tiling WM中全局一组工作区、任意映射到某台显示器的静态模型有本质区别。在 niri 中每个显示器monitor包含一组相互独立的工作区这些工作区按垂直方向排列。显示器与工作区的关系在源码结构中有直接体现monitor.rs 中的Monitor持有workspaces: VecWorkspaceW而每个 Workspace 又各自持有一个ScrollingSpace可滚动平铺布局与一个FloatingSpace浮动布局即每个工作区内部才是真正的可滚动平铺内容。你可以用focus-workspace-down和focus-workspace-up在显示器上的工作区之间切换。工作区的动态性体现在两个关键行为上中间的空工作区会自动消失当你切走一个空工作区后它会被自动回收。这一逻辑在 monitor.rs 的clean_up_workspaces()中实现从后往前遍历跳过当前激活的工作区凡是!workspaces[idx].has_windows_or_name()既没有窗口也没有名称的工作区都会被移除。测试 workspace_cleanup_during_switch 验证了切换过程中清理工作区的行为。每台显示器末尾始终保留一个空工作区当你在这个空工作区上打开窗口时新的空工作区会立即出现在它下方。对应源码逻辑是每当向最后一个工作区添加窗口后add_workspace_bottom()会被调用以追加新的空工作区见 monitor.rs。结合empty-workspace-above-first布局选项niri 也支持在顶部保留一个空工作区。下面这张来自官方文档的示意图展示了两个显示器的工作区排布——左侧显示器有 3 个工作区2 个含窗口 1 个空右侧显示器有 2 个工作区1 个含窗口 1 个空仓库同时提供了适配深色主题的 workspaces-dark.png 版本浅色版为 workspaces-light.png。在中间位置创建新工作区动态工作区没有独立的新建工作区操作。要把窗口放进一个位于中间的新工作区标准做法是把窗口放到最后一个空的工作区上用move-workspace-up把这个工作区向上移动到你需要的位置。移动工作区由move-workspace-up/down动作驱动。在源码层面这两个动作会调用Monitor::move_workspace_up()/move_workspace_down()见 mod.rs它们通过调整工作区在Vec中的索引来实现位置交换并在移动后执行clean_up_workspaces()清理空工作区见 monitor.rs。按键绑定的定义位于 binds.rs 的MoveWorkspaceDown/MoveWorkspaceUp。思维模型转换从全局工作区到显示器拥有工作区[!TIP] 如果你从其他平铺 WM 迁移过来过去你可能这样思考这是我所有的工作区。我可以把工作区 X 显示在我的第一台显示器上把工作区 Y 显示在第二台显示器上。 在 niri 中请换一种思路我的第一台显示器包含这些工作区包括 X 和 Y我的第二台显示器包含另外这些工作区。我可以把第一台显示器切到 X 或 Y。我可以把工作区 Y 移到第二台显示器上显示。 即工作区属于显示器而不是显示器展示全局工作区集合中的某一个。工作区在显示器之间移动工作区可以在显示器之间迁移对应的按键绑定见 binds.rs包括move-workspace-to-monitor-left/right/up/down把工作区移动到指定方向相邻的显示器move-workspace-to-monitor-next/previous把工作区移动到下一个/上一个显示器move-workspace-to-monitor 输出名把工作区移动到指定名称的输出binds.rs。上述动作最终由Layout::move_workspace_to_output_by_id见 mod.rs实现测试 move_workspace_to_output 对该行为进行了验证。显示器热插拔工作区的记忆行为当显示器断开连接时它的工作区会自动迁移到另一台显示器上同时这些工作区会记住自己的原始显示器源码中的original_output字段见 workspace.rs。当原显示器重新连接时工作区会自动迁回。但记住原显示器有一些细节值得注意它们均由 tests.rs 中的测试固化空工作区不会迁回测试 empty_workspaces_dont_move_back_to_original_output 验证了空工作区不更新/保留原始显示器归属——因为空工作区本身随时可能被清理。普通工作区在添加新窗口后归属原显示器当一个未命名工作区收到新窗口时original_output会被更新为当前输出见 monitor.rs 等处的 After adding a new window, workspace becomes this outputs own 注释与代码。命名工作区更粘命名工作区在打开新窗口时不会更新original_output测试 named_workspaces_dont_update_original_output_on_adding_window 验证了这一点而显式把命名工作区移动到另一台显示器仍会更新其原始显示器见 workspaces_update_original_output_on_moving_to_same_output。这体现了命名工作区更强的永久性。按索引寻址工作区索引是位置而非身份niri 中的若干动作支持按索引寻址工作区例如focus-workspace 2、move-column-to-workspace 4。这里的索引指的是此刻恰好处于聚焦显示器上该位置的工作区因此focus-workspace 2永远把你带到显示器的第二个工作区——无论它当前是哪一个。这与静态工作区系统有重要区别niri 的工作区本身没有索引。索引只是一个瞬时位置描述。如果你把第一个工作区向下移动那么focus-workspace 1会把你带到另一个工作区即原来排在第一个工作区下方、现在上移到顶的那个。源码中的动作定义印证了这一点FocusWorkspace(WorkspaceReference)、MoveColumnToWorkspace(WorkspaceReference)接受的是引用binds.rsWorkspaceReference既可以是索引也可以是名称在解析时按聚焦显示器上的当前位置计算。当你需要永久的工作区时应该使用命名工作区。命名工作区让工作区永久存在要获得更持久的工作区可以在配置中声明命名工作区或通过set-workspace-name动作动态命名。详情可参考 Configuration:-Named-Workspaces.md这里给出与本文直接相关的要点与普通动态工作区不同命名工作区即使没有窗口也始终存在。这在clean_up_workspaces()中有直接体现清理条件为!workspaces[idx].has_windows_or_name()——只要工作区有名字就不会被当作空工作区移除见 monitor.rs。你可以按名称引用工作区例如focus-workspace browsermove-column-to-workspace chat等动作同样支持名称。命名工作区可以声明open-on-output让该工作区在指定输出上打开也可以在配置中为命名工作区单独设置layout {}覆盖如 gaps、struts、border 等但不支持empty-workspace-above-first与insert-hint。配置中的命名工作区按声明顺序出现热重载配置时新增的命名工作区会出现在显示器最顶部。从配置中删除命名工作区后它会变回普通未命名工作区若此时没有窗口会被作为普通空工作区移除。自 25.01 起可用set-workspace-name/unset-workspace-name动作动态命名/取消命名工作区对应 binds.rs 中的SetWorkspaceName/UnsetWorkspaceName。用命名工作区模拟静态工作区[!TIP] 你当然可以把工作区命名为 one、two、three……然后把按键绑定到focus-workspace one、focus-workspace two……来近似模拟静态工作区。这在一定程度上可行但会变得有些令人困惑——因为你仍然可以上下移动这些工作区、把它们挪到别的显示器上。 如果你来自静态工作区 WM建议不要这么做而是尝试niri 之道使用动态工作区用上/下聚焦与移动代替按索引切换。得益于可滚动平铺scrollable tiling你通常比传统平铺 WM 需要更少的工作区。推荐的示例工作流以下是官方文档作者的个人工作流也是动态工作区模型的典型用法把浏览器放在最顶部的工作区然后每个项目或一件事各占一个工作区。单个工作区上通常放 1–2 个经常切换、能塞进显示器内的窗口偶尔把一些窗口滚动到视野外——通常是不常用或很快会关闭的临时窗口。需要新的永久窗口时把它放到一个新工作区上。工作中主动上下移动工作区让需要的东西一步可达。例如经常在浏览器和当前任务之间切换那就把当前正在做的东西移到浏览器正下方这样一次focus-workspace-down就能到达一次focus-workspace-up就能回到浏览器。这种一个动作直达的编排方式正是 niri 动态工作区 可滚动平铺设计的目标用更少的工作区、更少的按键覆盖同样多的任务上下文。结合配置实践将工作区动作绑定到按键KDL 语法的典型配置如下完整绑定语法参考 Configuration:-Key-Bindings.mdbinds { ModComma { focus-workspace-down; } ModPeriod { focus-workspace-up; } // 移动整个工作区 ModShiftComma { move-workspace-down; } ModShiftPeriod { move-workspace-up; } // 把工作区移到相邻显示器 ModShiftLeft { move-workspace-to-monitor-left; } ModShiftRight { move-workspace-to-monitor-right; } // 按索引与名称聚焦 Mod1 { focus-workspace 1; } Mod2 { focus-workspace 2; } ModB { focus-workspace browser; } // 把当前列移到指定工作区 ModShift1 { move-column-to-workspace 1; } } // 命名工作区永久存在且绑定到特定输出 workspace browser { open-on-output DP-2 }注意focus-workspace 1聚焦的是聚焦显示器上的第一个位置而focus-workspace browser聚焦的是名为 browser 的具体工作区——二者语义不同按需选用。小结niri 的工作区是动态的空工作区自动消失每台显示器末尾始终有一个空工作区兜底。工作区属于显示器并按垂直方向排列可在显示器之间迁移断开/重连显示器时工作区会记住并迁回原显示器命名工作区更粘。按索引寻址工作区 按当前位置寻址需要永久身份时用命名工作区按名称寻址。结合可滚动平铺动态工作区通常比静态工作区系统更省工作区、操作更直接。【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表