ARTICLE DETAIL

资讯详情

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

wezterm 窗口标签信息遍历:`window:tabs_with_info()` 详解与实战

wezterm 窗口标签信息遍历:`window:tabs_with_info()` 详解与实战 wezterm 窗口标签信息遍历window:tabs_with_info()详解与实战【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermwindow:tabs_with_info()是 wezterm 中MuxWindow多路复用器窗口对象提供的方法用于以数组表形式一次性返回当前窗口内全部标签页tab的扩展信息包括 0 基索引、是否激活状态以及对应的MuxTab对象。本文以该 API 为核心结合仓库内 Lua API 实现 与相关文档深入讲解其字段语义、底层实现、与tabs()/active_tab()的协作方式并给出可直接运行的实战示例帮助你编写窗口级标签管理脚本。一、方法签名与版本window:tabs_with_info()该 API 自 wezterm 20220807-113146-c2fee7662022 年 8 月版本起可用与window:tabs()同时引入。调用者只需持有任意MuxWindow对象例如在事件回调中通过wezterm.mux.get_window(window_id)获得或直接使用回调传入的window参数即可调用。返回值为一个 Lua 数组表array table其中每个元素描述窗口中的一个标签页。数组顺序与窗口内标签页的拓扑顺序一致索引从 1 开始Lua 惯例而每个元素内部的index字段则是 0 基的标签索引。二、返回字段语义每个元素是一个 Lua 表包含以下字段字段类型说明index整数0 基的标签页索引数组中第 1 个元素其index为 0is_active布尔该标签页是否为当前窗口的活动标签页tabMuxTab对应标签页的 MuxTab 对象可继续调用其方法其中tab字段携带完整能力拿到它之后可以继续调用 MuxTab 对象 的系列方法例如tab:get_title()见 get_title、tab:panes()、tab:panes_with_info()见 panes_with_info、tab:activate()见 activate、tab:set_zoomed(true)见 set_zoomed等从而构建完整的遍历标签 → 获取标题/窗格 → 执行操作链路。三、底层实现原理从 lua-api-crates/mux/src/window.rs 的源码可以看出其实现细节methods.add_method(tabs_with_info, |lua, this, _: ()| { let mux get_mux()?; let window this.resolve(mux)?; let result lua.create_table()?; let active_tab_idx window.get_active_tab_idx(); for (index, tab) in window.iter_tabs().enumerate() { let info MuxTabInfo { index, is_active: index active_tab_idx, }; // ... 将 info 转为 Lua 表并写入 tab 字段 result.set(index 1, info)?; } Ok(result) });关键点活动状态判定实现通过window.get_active_tab_idx()取得当前活动标签索引遍历时逐项比较index active_tab_idx得到is_active。也就是说一个窗口在任意时刻最多只有一个标签的is_active为true。数据结构返回的元信息对应源码中的MuxTabInfo结构体见 lua-api-crates/mux/src/lib.rs只包含index与is_active两个字段tab字段是拿到MuxTab(tab.tab_id())后在 Lua 表上动态附加的。1 基 vs 0 基Lua 数组中元素位置使用index 11 基而字段index保持枚举计数0 基两者务必区分。线程安全整个遍历在窗口的只读锁MappedRwLockReadGuard保护下进行快照一致不会出现遍历过程中标签变化导致的数据错乱。四、与tabs()及active_tab()的对比方法返回内容适用场景window:tabs()见 tabs仅返回MuxTab对象数组无索引与激活信息只需要标签对象、不关心状态时window:tabs_with_info()返回index、is_active、tab三元信息需要判断激活标签、按索引遍历时window:active_tab()见 active_tab直接返回活动标签的MuxTab可空只需活动标签对象本身后者的文档明确说明在 20230408-112425-69ae8472 之前的版本获取活动标签需要手动遍历tabs_with_info()实现function active_tab(window) for _, item in ipairs(window:tabs_with_info()) do if item.is_active then return item.tab end end end该代码段同样是官方在 active_pane 文档中展示的历史兼容写法可视为tabs_with_info()最经典的用法范例。五、实战示例5.1 列出窗口内所有标签的索引与标题local wezterm require wezterm function list_tabs(window) for _, item in ipairs(window:tabs_with_info()) do local title item.tab:get_title() local state item.is_active and [ACTIVE] or [idle] wezterm.log_info(string.format(tab #%d %s title%s, item.index, state, title)) end end5.2 找到并激活指定标题的标签function activate_tab_by_title(window, want) for _, item in ipairs(window:tabs_with_info()) do if item.tab:get_title():find(want, 1, true) then item.tab:activate() return true end end return false end5.3 结合panes_with_info()下钻到窗格拿到tab后可继续调用 panes_with_info 获取窗格级信息含left/top/width/height/pixel_width/pixel_height/is_zoomed等function dump_tab_layout(window) for _, item in ipairs(window:tabs_with_info()) do for _, p in ipairs(item.tab:panes_with_info()) do wezterm.log_info( string.format( tab#%d pane#%d active%s zoomed%s size%dx%d, item.index, p.index, tostring(p.is_active), tostring(p.is_zoomed), p.width, p.height ) ) end end end该函数可与tabs_with_info()组合实现窗口 → 标签 → 窗格的三级布局巡检。六、相关 API 一览MuxWindow 对象本方法所属对象另含tabs()、active_tab()、active_pane()、get_title()、set_title()、get_workspace()、set_workspace()、spawn_tab()、window_id()、gui_window()等方法。MuxTab 对象tab字段返回的对象类型可继续调用标题、窗格、激活、缩放等操作。tab:panes_with_info()标签级带信息遍历返回窗格的拓扑索引、激活/缩放状态与尺寸与tabs_with_info()构成完整的遍历体系。window:active_tab() 与 window:active_pane()为常见取活动元素需求提供的便捷方法其历史实现正是基于tabs_with_info()遍历。七、注意事项窗口内标签变化新建、关闭、切换后is_active与index均以调用时点的窗口快照为准建议在事件触发时实时调用避免缓存过期信息。若窗口中无任何标签极端情况下窗口即将关闭返回表为空。MuxWindow表示的是多路复用器层mux 层管理的窗口若需包含 GUI 覆盖层overlay中的窗格应参考 gui_window 相关 API详见 window:active_pane() 的说明差异。【免费下载链接】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),仅供参考
返回列表