Vimer 的福音:Mac 下 Caps + hjkl 作为方向键

本人所用的键盘是 WASD VP3 61 Key 的 -- Poker 3 方案,可以不借助于软件直接键盘上设置为 Caps + hjkl 来作为方向键。Caps 跳线为 Fn, 并选择一个 Layer, 把原本 Fn + ijkl 的方向键组合键重新映射为 Fn + hjkl 即可。

办公室的 61 键的键盘借于朋友体验,所以又重新把 DAS 87 键摆了出来。由于习惯了 61 键的 Caps + hjkl 的方向键,在 87 键盘上每次按方向键时右手都要离开它的 Home Row,很是不爽。别说是 87 键,即便是有些键盘把方向键压缩在右 Shift 下方,都无法接受右手右下移去按方向键。

Caps 键没什么卵用(只会用 Caps 来输入大写字母的当我没说),却常年占据着黄金位置(左手掌无需移动就能按到),所以主意是如何把 Caps 另作他们,对于 Vimer 来说最理想的方向键是 Caps + hjkl。

Mac 下有个键盘映射的工具 Karabiner, 先前的版本 KeyRemap4MacBook 只支持到 Mac OS 10.8, 而 Karabiner 也只能支持 10.9 到 10.11。而我的 Mac 系统是 macOS Sierra 10.12, 有一个不完全特性的 Karabiner 叫做 Karabiner-Elements, 它不能像 KeyRemap4MacBook 和 Karabiner 那样支持直接组合键的映射。因此在 macOS Sierra 一直未能把方向键映射成某个功能键(如 Caps) + hjkl,不得不用物理方向键。

有两种方法把 Caps + hjkl 映射为方向键



一:启用 "Change right_command+hjkl to arrow keys" 规则,并把  caps_lock 映射为 right_command

我一直在紧跟着最新的 Karabiner-Elements 版本(截止到2017-07-25 时版本为 0.91.9),今天偶然间发现 Karabiner-Elements 配置中多了一个 Complex Modifications 选项卡,点 "Add rule" 可以看到三个规则实例,

从按钮 "Import more rules from the Internet (open a web browser)" 可以找到更多的规则配置,其中有一个 Vi Mode 的规则,使用 S 或 D 作为  Trigger Key, 再配合 hjkl 作为方向键,这仍然不是我想要的。

实际我相当的规则是 "Change right_command+hjkl to arrow keys", 所以启用这个规则。别急,我们并不打算真正光用右手大拇指按住 command 键,同手右手按 hjkl 来使用方向键,反正就是右手腕别扭不过来。

所以下一步就是要把 Caps 嫁接到 right_command 上来,使用基本的 "Simple Modifications" 中的功能,只需加上一行 "caps_lock" 到 "right_command" 的映射

其余三个是键映射与 Caps + hjkl 用作方向键无关。

至此我们就可以在任何键盘上欢快的使用 Caps + hjkl 作为方向键,铵方向键时再也不需要让右手掌作半点移动了。

二:认识 Karabiner 规则文件

Karabiner-Elements 的配置文件是 ~/.config/karabiner/karabiner.json,前面图形界面中配置的规则会产生如下的相应内容:
 1    "profiles": [
 2        {
 3            "complex_modifications": {
 4                "parameters": {
 5                    "basic.to_if_alone_timeout_milliseconds": 1000
 6                },
 7                "rules": [
 8                    {
 9                        "description": "Change right_command+hjkl to arrow keys",
10                        "manipulators": [
11                            {
12                                "from": {
13                                    "key_code": "h",
14                                    "modifiers": {
15                                        "mandatory": [
16                                            "right_command"
17                                        ],
18                                        "optional": [
19                                            "any"
20                                        ]
21                                    }
22                                },
23                                "to": [
24                                    {
25                                        "key_code": "left_arrow"
26                                    }
27                                ],
28                                "type": "basic"
29                            },
30                            {
31                                "from": {
32                                    "key_code": "j",
33                                    "modifiers": {
34                                        "mandatory": [
35                                            "right_command"
36                                        ],
37                                        "optional": [
38                                            "any"
39                                        ]
40                                    }
41                                },
42                                "to": [
43                                    {
44                                        "key_code": "down_arrow"
45                                    }
46                                ],
47                                "type": "basic"
48                            },
49                            {
50                                "from": {
51                                    "key_code": "k",
52                                    "modifiers": {
53                                        "mandatory": [
54                                            "right_command"
55                                        ],
56                                        "optional": [
57                                            "any"
58                                        ]
59                                    }
60                                },
61                                "to": [
62                                    {
63                                        "key_code": "up_arrow"
64                                    }
65                                ],
66                                "type": "basic"
67                            },
68                            {
69                                "from": {
70                                    "key_code": "l",
71                                    "modifiers": {
72                                        "mandatory": [
73                                            "right_command"
74                                        ],
75                                        "optional": [
76                                            "any"
77                                        ]
78                                    }
79                                },
80                                "to": [
81                                    {
82                                        "key_code": "right_arrow"
83                                    }
84                                ],
85                                "type": "basic"
86                            }
87                        ]
88                    }
89                ]
90            },
91            "simple_modifications": {
92                "caps_lock": "right_command",

看到这里我们应该能意识到,其实从技术上并不需要先启用 "Change right_command+hjkl to arrow keys" 规则,然后把 "caps_lock" 映射为 "right_command" 两步。

那么我们去掉 "simple_modifications" 中的 "caps_lock" 到 "right_command" 映射,直接把规则 "Change right_command+hjkl to arrow keys" 中所有 "right_command" 修改为 "caps_lock" 行不行呢?像下面那样修
1"modifiers": {
2    "mandatory": [
3        "right_command"
4    ]

改成
1"modifiers": {
2    "mandatory": [
3        "caps_lock"
4    ]

这样做的话,会有一定的功效,每按一次 caps_lock + hjkl 组合后都必须抬起键,不能一直按着 caps_lock 然后做用 hjkl 作为方向键,因为此时的 caps_lock 仍然担当着原来的 caps_lock 职责,等于是双重功能。

所以有一个解决的办法是,仍然保留 "right_command" + "hjkl" 的方向键功能,只是在规则文件中再加一个 "caps_lock" 到  "right_command" 的映射,效果上是一样的,只是在 Simple Modifications 中并不要 "caps_lock" 到 "right_command"  的映射条目。

最后的效果就是

有这一个规则就足矣。基于此我定制了一个规则文件Change caps_lock + hjkl to arrow_keys,也就是用下面的方式一次性导入即可。

三:直接导入我定制的 Change caps_lock + hjkl to arrow keys 规则

既然我们可以从网络上导入规则,那么当然可以自己预先定制好自己的规则也像他们那样发布一个规则链接。于是我也做了一个 json 规则文件。

请点击链接 Change caps_lock + hjkl to arrow keys, 应该会提示打开 Karabiner-Elements 应用

用 Karabiner-Elements 打开该链接

导入到 Karabiner-Elements 中

现在可以随意的 Enable/Disable 规则 "Change caps_lock+hjkl to arrow keys" 了,启用后的效果与方法一中是一样的。

链接:
  1. Karabiner-Elements complex_modifications rules
永久链接 https://yanbin.blog/vimer-mac-caps-hjkl-as-arrow-keys/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。