多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

WezTerm Lua API 详解:`window:window_id()` 获取窗口 ID 并联动 `wezterm cli`

WezTerm Lua API 详解:`window:window_id()` 获取窗口 ID 并联动 `wezterm cli` WezTerm Lua API 详解window:window_id()获取窗口 ID 并联动wezterm cli【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermwindow:window_id()是 WezTerm Lua 配置 API 中用于获取当前窗口在内部 multiplexer多路复用器中唯一数字标识ID的方法该 ID 既可用于在 Lua 事件回调中精确区分不同窗口也是通过wezterm cli命令行工具对特定窗口执行操作时的定位依据。读完本文你将掌握window:window_id()的返回值语义、底层实现原理以及如何将它与其他窗口对象方法、wezterm cli list输出字段配合使用。一、方法签名与返回值window:window_id()自版本20201031-154415-9614e117起可用其签名与行为如下window:window_id() - integer返回值当前窗口的 ID 数字整数。该 ID 用于在 WezTerm 内部的多路复用器multiplexer中标识窗口因此也被称为窗口 multiplexer id。版本要求首次发布于20201031-154415-9614e117构建版本更早的 WezTerm 版本中此方法不存在。原文档明确指出该 ID 的核心用途The Id is used to identify the window within the internal multiplexer and can be used when making API calls viawezterm clito indicate the subject of manipulation.也就是说window:window_id()返回的 ID 是窗口在 multiplexer 全局命名空间内的身份标识任何通过wezterm cli发出的、需要指定操作目标的 API 调用都可以用这个 ID 指明要操作哪个窗口。二、实现原理GUI 窗口与 Mux 窗口的映射从源码看window:window_id()的 Lua 绑定定义在 wezterm-gui/src/scripting/guiwin.rsmethods.add_method(window_id, |_, this, _: ()| Ok(this.mux_window_id));这里的this是GuiWin结构体它表示一个 GUI 终端窗口区别于抽象的 Mux 窗口内部持有两个关键字段guiwin.rspub struct GuiWin { pub mux_window_id: MuxWindowId, pub window: ::window::Window, }mux_window_idMuxWindowId类型即 multiplexer 层面的窗口 IDwindow底层平台窗口句柄。因此window:window_id()实际返回的就是GuiWin中保存的mux_window_id。在创建GuiWin时GuiWin::new该 ID 直接取自TermWindow的mux_window_id字段见 guiwin.rs。TermWindow是 WezTerm GUI 端每个终端窗口对应的核心结构其mux_window_id贯穿整个窗口生命周期例如窗口关闭时通过mux.kill_window(self.mux_window_id)销毁对应窗口termwindow/mod.rs并在诸多界面操作中反复用于从 mux 中查询活动标签页mux.get_active_tab_for_window(self.mux_window_id)。与window:mux_window()的关系你可能还会在配置中看到window:mux_window()方法自20220807-113146-c2fee766起可用它返回window:window_id()对应窗口的 MuxWindow 表示对象见 mux_window.md。window_id()返回的是纯数字 ID而mux_window()返回的是可继续调用其他方法的对象二者指向同一个 multiplexer 窗口。此外MuxWindow对象本身也提供window:window_id()方法自20220624-141144-bd1b7c5d起返回窗口的 multiplexer id见 mux-window/window_id.md。三、实战用window_id()与wezterm cli联动window:window_id()最常见的落地场景是在 Lua 事件回调中拿到窗口 ID 后把它传给wezterm cli命令。先看wezterm cli list的输出结构其 JSON 格式包含window_id字段docs/cli/cli/list.md$ wezterm cli list --format json [ { window_id: 0, tab_id: 0, pane_id: 0, workspace: default, size: { rows: 24, cols: 80 }, title: wezterm cli list --format json -- wezfoo:~, cwd: file://foo/home/wez/ } ]wezterm cli list的每一行描述一个 pane其中WINID就是包含该 pane 的窗口 ID与window:window_id()返回的值属于同一命名空间。这意味着你可以在 Lua 配置中通过window:window_id()得到当前聚焦窗口的 ID在 shell 中使用wezterm cli list查看当前所有窗口、标签页与 pane 的 ID 映射将窗口 ID 作为参数用于wezterm cli activate-window、wezterm cli set-window-title等以窗口为操作对象的命令。在状态栏 / 标题格式化中使用一个典型示例是在format-window-title或update-right-status事件中显示窗口 ID方便多窗口场景下快速对照wezterm cli list的输出来定位窗口local wezterm require wezterm return { window_close_confirmation NeverPrompt, keys { -- 按 CTRLSHIFTW 时打印当前窗口 ID 到日志并用它设置窗口标题 { key W, mods CTRL|SHIFT, action wezterm.action_callback(function(window, pane) local wid window:window_id() wezterm.log_info(current window id .. wid) -- 也可以据此对特定窗口执行 wezterm cli 操作 wezterm.run_child_process({ wezterm, cli, set-window-title, tostring(wid), 我的窗口 .. wid, }) end), }, }, }注意wezterm cli的多数命令接受窗口 ID 作为可选参数若省略则作用于当前窗口显式传入window:window_id()返回值可以避免歧义尤其在使用--cwd、--class等参数启动多窗口、多工作区时用 ID 精确定位比依赖当前窗口的隐式语义更可靠。四、相关 API 与注意事项版本差异window:window_id()自20201031-154415-9614e117可用MuxWindow:window_id()自20220624-141144-bd1b7c5d可用window:mux_window()自20220807-113146-c2fee766可用。升级配置时应留意所依赖的版本区间。ID 的稳定性从实现看window_id由 multiplexer 在窗口创建时分配窗口关闭后 ID 即失效同一 GUI 窗口GuiWin在生命周期内其mux_window_id不变见 guiwin.rs 中GuiWin::new的取值逻辑。与 pane/tab ID 的区别窗口、标签页、pane 三层各有独立 IDwezterm cli list的 JSON 输出中分别对应window_id、tab_id、pane_id三个字段window:window_id()只返回窗口层级的 ID如需标签页 ID 应使用window:active_tab()返回对象上的方法pane ID 可通过window:active_pane()获取相关对象与方法的源码绑定均可在 guiwin.rs 与 termwindow/mod.rs 中查到。五、小结window:window_id()虽然接口极简一个无参方法、返回一个整数却是 WezTerm 分层对象模型GUI 窗口 ↔ Mux 窗口 ↔ CLI 标识之间互通的关键桥梁。理解了它的返回值语义——multiplexer 中的窗口唯一 ID——你就能在 Lua 配置与wezterm cli命令之间自由传递窗口身份实现精确到窗口的多路复用控制。【免费下载链接】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),仅供参考
返回列表