ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

WezTerm 配置:用 wezterm.permute_any_mods 批量生成所有修饰键组合的键位与鼠标绑定

WezTerm 配置:用 wezterm.permute_any_mods 批量生成所有修饰键组合的键位与鼠标绑定 WezTerm 配置用 wezterm.permute_any_mods 批量生成所有修饰键组合的键位与鼠标绑定【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermwezterm.permute_any_mods是 WezTerm Lua 配置 API 中的一个实用工具函数自版本20201031-154415-9614e117起可用用于自动生成覆盖CTRL、ALT、SHIFT、SUPER全部 15 种非空组合的键位或鼠标绑定条目。在需要无论按住什么修饰键都触发同一动作的场景下它可以把手写十几条重复绑定的繁琐配置压缩为一次函数调用是配置 mouse_bindings 与key_bindings时最值得掌握的高效写法。为什么需要这个函数WezTerm 的键位与鼠标绑定通过mods字段精确匹配按下时的修饰键状态。以鼠标中间键粘贴为例若希望中键按下即粘贴与是否按住 Ctrl / Alt / Shift / Super 无关就必须把每个可能的修饰键组合都单独写一条绑定。四个修饰键的非空组合共有2^4 - 1 15种逐条手写不仅冗长易错还会让配置文件的视觉噪音远超有效信息。wezterm.permute_any_mods正是为此设计它接收一张模板绑定表为每种修饰键组合复制一份并写入对应的mods字段最终返回一个包含全部组合的 Lua 数组可以直接解包进绑定表。函数签名与核心语义wezterm.permute_any_mods(table) - array其行为可以概括为三点遍历全部组合对CTRL、ALT、SHIFT、SUPER四个修饰键的所有组合共 15 种分别生成一份输入的 table 副本并在每份副本上设置mods 该组合的字符串表示。不生成 NONE 条目mods NONE无任何修饰键的条目不会被生成——这是它与wezterm.permute_any_or_no_mods的唯一区别。返回数组所有组合副本组成的数组作为返回值可直接通过table.unpack展开进表初始化器或用for循环逐条追加。需要注意的是返回值数组中的条目只是按固定顺序排布依次为 SUPER、ALT、ALT|SUPER、SHIFT、SHIFT|SUPER、SHIFT|ALT、SHIFT|ALT|SUPER、CTRL、CTRL|SUPER、ALT|CTRL、ALT|CTRL|SUPER、SHIFT|CTRL、SHIFT|CTRL|SUPER、SHIFT|ALT|CTRL、SHIFT|ALT|CTRL|SUPER不存在谁覆盖谁的优先级问题——因为每个组合的mods都互不相同最终会作为独立条目存入绑定表。实战示例中键点击粘贴主选区最直接的用法是让permute_any_mods的结果作为唯一绑定或最后一条绑定用table.unpack展开进mouse_bindings表初始化器local wezterm require wezterm return { mouse_bindings { table.unpack(wezterm.permute_any_mods { event { Down { streak 1, button Middle } }, action PastePrimarySelection, }), }, }这段配置的含义是鼠标中键单击按下Downstreak 1button Middle时执行PastePrimarySelection粘贴主选区对应 X11 的 PRIMARY selection并且无论同时按着什么修饰键都生效。event采用{ Down { ... } }的结构对应的触发器类型定义可参见 config/src/keyassignment.rs 的MouseEventTrigger以及 config/src/keys.rs 中event与mods字段的组合方式。如果mouse_bindings中还有其他绑定且不位于末尾则应改用for循环逐条追加避免table.unpack在表初始化器中间展开带来的语法麻烦local wezterm require wezterm local mouse_bindings {} -- 追加一个限定修饰键的常规绑定 table.insert(mouse_bindings, { event { Up { streak 1, button Left } }, mods NONE, action wezterm.action.CompleteSelection(ClipboardAndPrimarySelection), }) -- 追加全部修饰键组合的中键粘贴绑定 for _, binding in ipairs(wezterm.permute_any_mods { event { Down { streak 1, button Middle } }, action PastePrimarySelection, }) do table.insert(mouse_bindings, binding) end return { mouse_bindings mouse_bindings, }函数返回的每个元素都是完整可用的绑定表与手写条目完全等价因此可以安全地与手写绑定混用、排序或覆盖。等价展开它替你写好的 15 条绑定wezterm.permute_any_mods的功能与下面这段手写配置完全等价只是省去了大量重复样板return { mouse_bindings { { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods ALT, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods ALT | SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | ALT, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | ALT | SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods CTRL, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods CTRL | SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods ALT | CTRL, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods ALT | CTRL | SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | CTRL, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | CTRL | SUPER, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | ALT | CTRL, }, { action PastePrimarySelection, event { Down { button Middle, streak 1, }, }, mods SHIFT | ALT | CTRL | SUPER, }, }, }对比之下permute_any_mods将这段约 150 行的重复代码收敛为 5 行模板定义大幅降低了维护成本——后续想改事件或动作只需修改模板表中的一处。源码实现解析permute_mods 与 Modifiers 位标记该函数的实际实现在 lua-api-crates/termwiz-funcs/src/lib.rs#L201-L244。核心是permute_mods通用函数它接收一个allow_none标志控制是否包含空修饰键组合fn permute_modslua( lua: lua Lua, item: mlua::Table, allow_none: bool, ) - mlua::ResultVecmlua::Valuelua { use wezterm_input_types::Modifiers; let mut result vec![]; for ctrl in [Modifiers::NONE, Modifiers::CTRL] { for shift in [Modifiers::NONE, Modifiers::SHIFT] { for alt in [Modifiers::NONE, Modifiers::ALT] { for sup in [Modifiers::NONE, Modifiers::SUPER] { let flags *ctrl | *shift | *alt | *sup; if flags Modifiers::NONE !allow_none { continue; } let new_item lua.create_table()?; for pair in item.clone().pairs::mlua::Value, mlua::Value() { let (k, v) pair?; new_item.set(k, v)?; } new_item.set(mods, flags.to_string())?; result.push(new_item.into_lua(lua)?); } } } } Ok(result) }实现逻辑清晰可见用四层嵌套循环遍历CTRL/SHIFT/ALT/SUPER的有无每层取值NONE或对应修饰键通过位或运算|合成flags当allow_none为false时跳过全空组合这正对应permute_any_mods不生成NONE条目的语义对每个组合将输入的 Lua 表逐字段浅拷贝到新表再写入mods字段值为位标记的字符串形式保证原模板表不被污染两个公开 API 只是permute_mods的薄封装permute_any_mods传allow_none falsepermute_any_or_no_mods传allow_none true。从底层看Modifiers在 wezterm-input-types/src/lib.rs#L491-L511 中是一个基于bitflags!的位掩码结构NONE 0、SHIFT 11、ALT 12、CTRL 13、SUPER 14此外还包含LEFT_ALT、RIGHT_ALT、LEADER、LEFT_CTRL、RIGHT_CTRL、LEFT_SHIFT、RIGHT_SHIFT、ENHANCED_KEY等更细粒度的位。这也解释了为什么函数生成的mods字符串形如SHIFT | ALT | CTRL | SUPER——它正是位标记的字符串化结果。需要注意该函数只组合四个基础修饰键位不会生成包含LEADER或左右修饰键细分位的组合。生成后的绑定最终在 config/src/config.rs#L1320-L1329 的mouse_bindings()方法中以(MouseEventTrigger, MouseEventTriggerMods)为键、KeyAssignment为值构建成查找表供运行时精确匹配事件与修饰键状态。与 permute_any_or_no_mods 的区别姐妹函数wezterm.permute_any_or_no_mods见 docs/config/lua/wezterm/permute_any_or_no_mods.md行为几乎一致唯一区别是它会额外生成mods NONE的条目即完全不带修饰键的情况也被覆盖因此返回 16 个组合而非 15 个。两者如何选择取决于绑定语义希望无论如何都触发包括不按任何修饰键→ 用permute_any_or_no_mods希望按了修饰键才触发或已有单独的mods NONE绑定需要保留其精确行为 → 用permute_any_mods避免NONE条目与既有绑定冲突或覆盖默认行为。适用场景与注意事项鼠标绑定是最高频的使用场景中键粘贴、侧键切换 Tab、滚轮缩放等不应被修饰键干扰的交互都适合用permute_any_mods展开。键盘绑定同样适用比如希望Copy/Paste动作在所有修饰键组合下都可用。但需谨慎——若某个动作与 WezTerm 默认键位冲突disable_default_key_bindings与disable_default_mouse_bindings见 config/src/config.rs#L438 与 config/src/config.rs#L456需要一并考虑。绑定顺序敏感若permute_any_mods的结果不是绑定表中唯一或最后一条务必改用for循环迭代插入并把它放在更具体的绑定之后避免遮蔽其他限定修饰键的规则。只覆盖四个基础修饰键生成的组合仅来自CTRL/ALT/SHIFT/SUPER四个位不会生成含LEADER或左右细分键的条目如需 Leader 键行为请直接手写mods LEADER绑定。借助wezterm.permute_any_mods你可以用最少的样板代码写出覆盖全部修饰键组合的健壮绑定配置把配置文件的注意力留给真正有差异的交互逻辑。【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表