article_image

编注:Vim 式的全键盘操作是一股复古潮流,从 Safari 的插件 Vimari、Chrome 插件 Vimium 到 macOS 下跨软件的全键盘控制工具 Vimac(及继任者 Homerow),多年以来有一批近乎于宗教的拥趸。或许在宽大的书桌上,这些工具看似只是 Geek 的玩具,但当我挤在经济舱中或者摇摇晃晃的山区巴士里,我会感谢还有人在持续开发这类工具。毕竟,工作并非总是在星巴克或能看见城市天际线的落地窗前进行的。最近有讨论重提了这类全键盘控制工具,我便邀请硬核作者 Apus 执笔,介绍他的使用经验。——Minja

本文将介绍:

  • macOS上的全键盘控制软件Homerow,以及一键启动Homerow两个核心功能,从而让Mac进入“全键盘模式”的方案。
  • 上述方案所采用的两个可迁移的通用技巧。
    • 通用技巧1:用Karabiner-Elements实现某一按键与其他按键同时按下时为修饰键,单独按下时实现特定功能。
    • 通用技巧2:用Keyboard Maestro的 tapped n times Trigger 实现同一按键点击不同次数触发不同功能。

Homerow及其功能唤醒方案

近期有朋友在论坛讨论macOS下的全键盘控制方案,在讨论中Minja推荐的软件Homerow解决了全键盘控制的部分痛点。下载体验后,Homerow迅速成为我的Mac上系统级的核心应用,我使用的主要的功能有1

  1. 模拟点击:用键盘实现模拟鼠标点击2屏幕上的特定元素;
  2. 模拟滚动:用键盘实现在选中的特定区域模拟鼠标滚轮滚动。
Alt text
示例1:模拟点击
Alt text
示例2:模拟滚动

更多介绍及下载链接,可见官网:Homerow — Keyboard shortcuts for every button in macOS。Homerow虽然是一个付费软件,但免费版提供的功能已经足够完善,每唤醒50次弹出的付费提示也近乎无感。如果你愿意付费,开发者承诺“一次付费,完全拥有,直到宇宙热寂”("Homerow is a one-time purchase. You own it completely, 'til the heat death of the universe."),可以算是很良心了~~(除了50刀的价格)~~。

想要实现全键盘控制,换言之即尽可能用键盘代替鼠标,至少要求——在轻度鼠标需求的场景下,如看网页时滚动页面、在谷歌搜索结果页跳转搜索结果链接——使用键盘的效率不能低于原来使用鼠标的效率,所以必然要为Homerow的功能唤起设置一枚方便的按键。

模拟点击功能,官方默认配置的快捷键是⌘+⇧+Space,不能说不科学。但在我的设备上,该按键已经被占用3,且需要三个键同时按下,相对还是不够方便。因此我决定将短按Caps Lock设置为唤起该功能的按键。

模拟滚动功能,官方默认配置的快捷键是⌘+⇧+J,但同样是组合键,面临不够方便的问题。因此我考虑短按两次Caps Lock唤起该功能。

短按Caps Lock一次唤起模拟点击

通用技巧1:用Karabiner-Elements实现某一按键与其他按键同时按下时为修饰键,单独按下时实现特定功能。

借鉴Hum的文章征服macOS 快捷键(三)——修饰键的分层和原则中Hyper和小Hyper键的定义,我用Karabiner-Elements将长按Caps Lock映射为⌃+⌥+⇧,我将其称为Super键。4

而Karabiner-Elements其实还支持分别定义一枚按键"与其他键同时按下时"和"单独按下时"的功能。因此,可以设置将单独按下Caps Lock映射为一个实体键盘上并不存在的按键,并将这个按键设置为Homerow模拟点击功能的唤醒键。5具体步骤如下:

第一步,在Karabiner-Elements中设置改键规则。依次点击 Complex Modifications - Add your own rule,在弹出的代码框中删除默认代码,粘贴我给出的代码后点击保存。

Alt text
Karabiner-Elements设置1
Alt text
Karabiner-Elements设置2
{
    "description": "Change caps_lock. Hold to Super (⌃+⌥+⇧), tap to f19",
    "manipulators": [
        {
            "from": {
                "key_code": "caps_lock",
                "modifiers": {
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "left_shift",
                    "lazy": true,
                    "modifiers": [
                        "left_control",
                        "left_option"
                    ]
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "f19"
                }
            ],
            "type": "basic"
        }
    ]
}

以上代码的功能是将Caps Lock键与其他按键同时按下时设置为Super键⌃+⌥+⇧,单独按下时设置为f19。代码中"from""to""to_if_alone"的表述非常容易理解,你也可以根据你自己的偏好另行设置(如使用Shift而不是Caps Lock作为触发键,或修改Caps Lock作为修饰键时映射的组合键)。想要更高级的设置,可以参考官方文档:Documentation | Karabiner-Elements

第二步,打开Karabiner-EventViewer(默认与Karabiner-Elements一同安装)。分别测试Caps Lock单独按下、与其他按键同时按下时的键盘事件,确定上一步设置成功。

第三步,打开Homerow的设置界面。由于唤起模拟点击的快捷键为f19(键盘上实际按下的是Caps Lock),为便于记忆和使用,我把Homerow的搜索可点击元素功能唤起按键设置为Super+F(键盘上实际按下的是‌Caps Lock+F)。先设置Clicking的Search Shortcut,再设置Shortcut。

Alt text
Homerow设置-模拟点击

至此设置完成,此时你点击Caps Lock,可以唤起Homerow的模拟点击功能,屏幕上会出现很多标有字母的小标签,输入小标签对应的字母组合即可实现模拟点击屏幕上的元素。

短按Caps Lock两次唤起模拟滚动

通用技巧2:用Keyboard Maestro的 tapped n times Trigger 实现同一按键点击不同次数触发不同功能。

Homerow为模拟滚动功能默认设置的⇧+⌘+J按键,在键位设计上已经比较合理,因为⇧+⌘是左手非常自然的放置位置,而J键作为Vim风格方向键的下键,使用频率最高。但完成上一节的设置后,为追求逻辑的连贯性,将短按Caps Lock两次作为唤起模拟滚动的方案更为合理,且该方案的按键负担更小。

要完成以上设置,仅需设置一个全局的Keyboard Maestro动作:

Alt text
Keyboard Maestro设置-模拟滚动

如果你的⇧+⌘+J快捷键被占用,还可以在Homerow的"Scroll"设置项下与Keyboard Maestro Macro的Action中同时修改快捷键。

小结

模拟鼠标控制,可以算是一项系统级的功能。将全局性的Super键(以Caps Lock实现)作为其触发的快捷键,恰如其分。

然而,展示个人需求与个人方案终究面临众口难调问题。所幸本文所展示的两种通用技巧之组合不局限于Homerow,可以轻松迁移到其他应用场景中去,在不影响原修饰键功能的前提下拓展出一批新按键,为诸如唤起AI之类的“一键”需求凿通道路。


  1. 除此之外的Search功能,在基于GUI的自动化流程中也有一定的用武之地。
  2. 包括单击左键、单击右键、按住⌘同时单击左键、双击左键。
  3. 我用⇧+Space组合键映射删除键的功能,因此⌘+⇧+Space组合键等于⌘+Backspace,对应的功能是删除整行。
  4. 为啥采取了一个不是很主流的方案呢?因为Caps Lock的这个位置很容易用小拇指按到,同时小拇指在该键位上时大拇指自然地在的位置。因此在不显著增加按键难度的情况下,这套方案不仅实现了原Hyper键的功能(⌃+⌘+⌥+⇧),且拓展出一个Super键(⌃+⌥+⇧),相当于多了一层修饰键。
  5. 这里的思路并不是我的原创,源自Sylv在v2ex发布的帖子。该帖提到的切换输入法的方案也被我稍加改造后自己使用至今。