news 2026/5/14 3:52:25

Chrome垂直标签页快捷键设置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Chrome垂直标签页快捷键设置

用 Hammerspoon 给 Chrome 侧边栏加一个快捷键

Chrome 有个内置的垂直标签页侧边栏(Vertical Tab Sidebar),体验不错,但有一个致命问题:没有键盘快捷键来切换它。每次想收起或展开侧边栏,都得用鼠标去点那个小按钮。

作为一个键盘流用户,这无法忍受。于是我写了一个 Hammerspoon 脚本来解决这个问题。

思路

macOS 有一个 Accessibility API(无障碍 API),可以遍历任何应用的 UI 元素树,找到按钮并模拟点击。Chrome 的侧边栏切换按钮在无障碍树中的标识是"Expand Tabs""Collapse Tabs"

所以核心逻辑很简单:

  1. 通过hs.axuielement.applicationElement()获取 Chrome 的 AX 根元素
  2. 递归遍历窗口的子元素,找到目标按钮
  3. 调用performAction("AXPress")模拟点击

这个方案参考了 ChromeSidebarToggleRaycast 的思路,但把它移植到了 Hammerspoon 上,并增加了鼠标触发的支持。

两种触发方式

脚本提供三个 scheme,通过顶部的SCHEME变量切换:

Scheme触发方式
仅键盘1Cmd+S切换侧边栏
仅鼠标2鼠标悬停屏幕左边缘展开,移出 380px 收起
键盘 + 鼠标3两种都生效(默认)

鼠标触发的原理是每 50ms 轮询一次鼠标位置。当鼠标进入屏幕左边缘 2px 范围内并停留超过 0.15 秒,触发展开;当鼠标移出 380px,触发收起。

关键实现细节

Grace Period 防误触

切换应用时,鼠标位置和按键事件可能被误判。脚本在 Chrome 获得/失去焦点、系统唤醒/休眠时都会设置一个 grace period(宽限期),期间所有触发都被忽略。

看门狗机制

鼠标轮询器偶尔会意外停止。键盘事件处理器中内置了一个看门狗:如果超过 5 秒没有收到鼠标轮询的心跳,自动重建所有服务。

生命周期管理

脚本监听了三个层面的事件:

  • 应用层:Chrome 激活/失焦/启动/退出
  • 系统层:系统休眠/唤醒
  • 初始化层:启动时检测当前是否在 Chrome 中

每个状态转换都会正确地启动或停止对应的监听器,避免资源浪费和误触发。

安装

# 安装 Hammerspoonbrewinstall--caskhammerspoon# 复制脚本cpinit.lua ~/.hammerspoon/init.lua# 授权辅助功能# 系统设置 → 隐私与安全性 → 辅助功能 → 添加 Hammerspoon

然后在 Hammerspoon 菜单栏图标点击 “Reload Config” 即可。

自定义快捷键

默认快捷键是Cmd+S。改这里就行:

-- Cmd+S -> toggle sidebarifflags.cmdandnotflags.ctrlandnotflags.altandnotflags.shiftandkeyCode==keycodes.map["s"]then

比如改成Ctrl+Shift+B

ifflags.ctrlandnotflags.cmdandflags.shiftandnotflags.altandkeyCode==keycodes.map["b"]then

调试

三个调试快捷键:

  • Cmd+Alt+D:显示服务状态(scheme、监听器运行状态、事件计数)
  • Cmd+Alt+B:dump Chrome 所有 AX 按钮到 Console
  • Cmd+Alt+R:强制重启所有服务

文件结构

项目只有两个 Lua 文件:

  • init.lua— 完整版,支持三种 scheme
  • init-keyboard-only.lua— 纯键盘版,没有鼠标检测,代码更简洁

如果你不需要鼠标边缘触发,用 keyboard-only 版本就好,少了一半代码,也少了轮询的开销。

写在最后

这个脚本解决了一个很小但很烦的问题。Hammerspoon + Accessibility API 的组合在 macOS 上非常强大,几乎可以给任何应用的任何 UI 元素绑定快捷键。

项目地址:Chrome-Vertical-Tab-Sidebar-Toggle

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 3:51:47

人机环境系统认知对抗中如何以跳频和猝发方式干扰态、势、感、知

在人机环境系统的认知对抗中,利用跳频和猝发技术来干扰敌方的“态、势、感、知”,核心在于打破其OODA(观察-调整-决策-行动)循环。通过制造电磁频谱的“迷雾”与“盲区”,不仅阻断其物理层面的信息传输,更在…

作者头像 李华
网站建设 2026/5/14 3:50:05

半导体制造中的金属填充技术:原理与应用

1. 金属填充技术概述在半导体制造工艺中,金属填充(Metal Fill)是一项至关重要的后端工艺技术。简单来说,就是在芯片设计的空白区域(White Space)添加非功能性金属结构,以达到平衡整个芯片金属密…

作者头像 李华
网站建设 2026/5/14 3:47:26

Python工程实战进阶:从语法到高效编程的核心技巧与避坑指南

1. 项目概述与核心价值最近在GitHub上看到一个名为“heamlk/Python-Skill”的项目,点进去一看,发现这并非一个传统的、功能单一的库或框架,而是一个内容相当丰富的Python技能知识库。作为一名在数据分析和自动化领域摸爬滚打了十来年的老码农…

作者头像 李华
网站建设 2026/5/14 3:47:24

S.A.M.U.R.A.I.:用MCP协议与ADT API打通AI助手与SAP ABAP开发的桥梁

1. 项目概述:当AI助手遇见SAP ABAP开发如果你是一位SAP ABAP开发者,那么对SE80、SE38这些事务代码的界面一定不会陌生。日复一日地在这些略显陈旧的工具里穿梭,复制粘贴、激活、检查语法、释放传输请求,构成了我们工作的日常。这套…

作者头像 李华
网站建设 2026/5/14 3:43:58

从零构建个人AI知识库:Quivr开源项目实战解析

1. 项目概述:从零构建你的个人AI知识库最近在折腾AI应用落地的朋友,估计都绕不开一个核心痛点:如何让大语言模型(LLM)更“懂”我,或者说,更懂我手头那些非公开的、特定领域的资料?无…

作者头像 李华
网站建设 2026/5/14 3:34:03

Next.js主题切换解决方案:next-themes库深度解析与实战指南

1. 项目概述:为什么我们需要一个“主题”管理器?如果你正在使用 Next.js 构建一个现代化的 Web 应用,并且希望支持深色模式(Dark Mode),那么你很可能已经听说过或者正在寻找一个解决方案。手动实现主题切换…

作者头像 李华