英文原文:Steve Losh - A Modern Space Cadet
原文写于:2012年10月3日。
我每天都有大量时间在使用键盘(经常每天超过8小时)。就像你看我之前写的关于 Vim 和 Mutt 后所猜的那样,我并不反感花一些时间来改善那些接下来几年会花成千上万个小时的环境,所以我的键盘会被我深度调整也不显得奇怪了。
这篇文章就是关于我如何让打字体验变得更舒服和更有效率的。
如果你对自定义十分不屑的话,你不会喜欢这篇文章。假如我不得不用别人的机器呢?自从我五年前有 iPhone 后,我不得不用别人的电脑的次数我用一只手就能数得过来。我喜欢配置我的机器来节省我的时间。的确,这是个麻烦事,但这并不只是为了打得更快,它也很有趣!
起源
自从第一款键盘出现之后,世界上已经创造出许许多多的键盘了。最著名的键盘之一,至少在编程圈子里,是 Space Cadet(太空军校生)键盘。
由于最初被用在 Lisp 机器和其他一些系统上,所以它并不适合极简主义者。它有四个“元键(bucky keys)”,即修饰键:Control,Meta,Super 和 Hyper(当然还要加上 Shift)。还有一些特殊的键让你来输入希腊字母和数学符号。
Space Cadet 键盘中的典范,给那些愿意投资时间来获取工作效率的人而设计的。
而且它超级华丽。配色和版面设计都很美。
可以说是我打造这个配置的灵感来源。
现代的硬件
我过去几年里尝试过一大堆现代键盘。他们质量都很好,当然也比买台式机附送的 20 美元塑料键盘贵多了。但是我每周至少 60 个小时在使用键盘,大概只有一个小时在我的车里。所以我在键盘上花的钱绝对比车更划算!
我会按照时间顺序来罗列我所使用过的键盘。我不会写很多关于机械键盘和键轴相关的基本问题。如果你想了解这方面的东西,看这篇博客和这个教程会比较合适。
苹果无线键盘
很长时间以来我都在使用苹果无线键盘。
他们很轻,设计也很紧凑,同时由于他们的金属结构又感觉很结实。
因为键距很小,不容易脏,不像有些键盘漏斗形的空隙使得脏东西直接堆积在底部。
你可以方便地在任何苹果商店里买到他们,当然无线这一点也很赞。
而且触感和苹果的笔记本电脑上的键盘完全一致,所以如果你经常在他们之间切换使用,你可以完美保持你的肌肉记忆。
不幸的是,他们的打击触感跟这个列表里的其他任何一款键盘都不一样。在我看来,苹果键盘只有2毫米的键程,而且你必须触底才能触发按键。
Das Silent Ultimate
我所拥有的第一款机械键盘就是 Das Silent Ultimate.
(这个照片实际上是我的 Das Clicky,因为我的 Silent 已经没了,但是外观是一样的。)
和苹果键盘的按键相比,Das Silent 的按键(Cherry 茶轴)感觉软得多。每个按键都没有在敲击金属的感觉。
总体来说,Das Silent 不坏。造的像坦克一样结实,我确信它的使用寿命会很长。而且也有我所喜欢的无刻版。
这款键盘我并没有用很长时间。第一,它那光滑的表面在箱子里看上去还不错,之后再看就非常糟糕了。它实在是太容易脏了。
按键对于我来说总感觉什么地方“不对”,特别是我试过这个列表里其他键盘之后。我不知道该用什么词来形容,那感觉“黏糊糊的”(mushy)。
Das Clicky Ultimate
下一个尝试的键盘是 Das Clicky Ultimate。
这跟 Das Silent 除了键轴以外完全一样,它用的是“咔哒咔哒(clicky)”的 Cherry 青轴。对我来说这个感觉比茶轴感觉好太多了。我之前说的 Silent 的粘滞感这里完全不见踪影。
人们说它很响绝对不是说着玩的。如果你敲击很多的话会产生一个稳定的底噪。但是对我来说它能抚慰人心,特别是当你的敲出一种韵律之后。你的同事不太可能会喜欢,所以选用请谨慎。
很不幸,Das Clicky 还是有着糟透了的光滑表面。后来我决定试试人们经常鼓吹的 Topre 键轴(电容式键轴)。
Happy Hacking Keyboard Professional 2
我的下一款键盘是 Happy Hacking Keyboard。它比 Das 系列都贵多了,所以到手挺曲折的,但是我很高兴最后入手了它。
HHKB 使用的便是 Topre 键轴,对我来说这种键轴的感觉跟 Cherry 茶轴一模一样。它没有蓝轴的那种“咔哒”的感觉,也没有茶轴那种粘稠感,而是一种很舒服的“撒-克”或是“闪-克”声。这是一个很好的平衡:你有一个很好听的声音而且不会吵到别人。
这款键盘的表面非常完美。有着我见过的最平易,最优美,最漂亮的亚光表面。塑料的纹理刚好让你的手指得到稳重的感受(不像 Macbook 的按键那么滑),也不至于粗糙到像砂纸一样。
如果你没有很多空间,或是想要随身携带键盘的话,HHKB 会很适合你。它很袖珍,但是仍然有坚实的感觉,完全不会轻飘飘的。
HHKB 主要有两个我想抱怨的地方。第一,最下行有两个空间本来可以放修饰键的,但是却没有。右边的那个空间印了 Logo 还能理解,但是左边就只是在那空着,没有任何理由。
另一个抱怨是 fn
键和方向键的位置设定实在是太蠢了。在这种紧凑的布局下,我不介意必须用 fn
键来触发方向键,但是到底为什么要把他们放到一边使得我必须用单手来按他们?
这个问题只要把 fn
键从现在的位置(右 Shift 键的右边)移到左下方空白的角落就可以完全解决。这样你就可以用左手按住 fn
同时右手操作方向键,就不需要那扭曲的单手操作了。
所以使用 HHKB 一段时间后,我实在是被方向键问题搞烦了。但是我仍很喜欢 Topre 的按键,所以下一个选项就显而易见了。
Topre Realforce 103
Topre Realforce 103UB 是我的下一款键盘,也是我直到现在仍在使用的键盘。
我相信我买的那个型号应该已经停产了,但是替代者 104UB 跟它有完全一样的设计理念,只是右边多了些额外的键。如果让我拿我现在的键盘来换这个的话我肯定会换。事实上,如果有人想以折扣价二手买我的 103UB 的话,我会很乐意卖了它来换 104UB。
不过,这款键盘还是有它的缺点的。第一,不像所有其他键盘(除苹果无线键盘)它不是 USB hub。其实这也不是个大问题(我有外置 USB hub),但我还是很惊讶它竟然没有。
第二,它很大。真的很大。如果你的桌面没有很大的空间的话你可能想要看看无小键盘版(tenkeyless)。我的地方很大而且我也喜欢有个小键盘,所以我就买了个巨大的全尺寸版。
还有我实在搞不懂为什么这款键盘没有黑色无刻版。无刻版有青柠绿、粉色、黄色和其他一堆颜色,就是没有黑色!
说点好的地方。这东西造的跟坦克一样结实。如果你需要抵抗你家的入侵者,它是个很合适的钝器来帮助你对抗敌人(而且你很可能之后可以再把它插回去接着用)。
它的表面和 HHKB 一样漂亮,但是我还是要说说有刻键帽。既然我打字的时候不需要看键盘,那为什么要在那完美的表面刻字呢?
Realforce 用的也是 Topre 键轴,但是它巧妙的在外面加了一个套,使得打击感甚至优于 HHKB。我买的版本是“分区压力(variable-weighted)”版,意思是力量小的手指下的按键要比力量大的手指下的键要轻。对于长时间使用键盘的人来说非常美妙。原本总是小手指先累,现在手指的疲劳度几乎一样。Topre 也有一个没有这个修改的“均匀(uniform)”版,但是我个人真的很喜欢分区压力这种设计。
定论
现在我平时都使用 Topre Realforce。我爱上了 Topre 键轴的感觉(相对其他所有键轴,也许不算 Cherry 蓝轴,声音很棒),还有 HHBK 真是太局促了。如果空间拮据的话它很棒,但是我桌面上空间大得很,我干嘛用它呢?
这里有张全家福(跟 13 寸 Macbook Air 放在一起),你可以感受下他们的尺寸。
现代软件
好了我已经讲了关于硬件的部分,下面我们来说说软件。我只用 OS X 所以我下面要说的东西都是面向 OS X 的。但是我确信 Windows 和 Linux 下也有相似的解决方案。
我用三个软件来相互配合,给予了我近乎无限的能力去调整键盘在 OS X 中的工作方式。
Keyboard Maestro
Keyboard Maestro 是一款 OS X 中绑定快捷键和宏的工具。它也许没有最好的用户界面,但是它可以做很多事,而且一旦你配置好快捷键,你再也不用管它了。价格 36 美刀。
现在我用它来切换应用程序,之后我会说明是如何轻松做到这一点的。
我换到 Keymando 有一段时间了。它很赞的用一个文本文件像编程一样来配置它,这样我可以用版本管理器来管理它。但是和 Keyboard Maestro 比起来它很慢,bug 也很多。我现在只用 Keyboard Maestro 了。
PCKeyboardHack
PCKeyboardHack 允许你很底层地将一个键映射到另一个键上。举个例子,你可以只将右边的 Option
键映射到 F19
键上。这个技巧在下个小节里你会看到。这个软件是开源免费的。
KeyRemap4MacBook
KeyRemap4MacBook 是我主要的键盘配置器。像其他的应用一样,用户界面糟透了,但是几乎能做你能想到的任何事。你可以用它来取代 Keyboard Maestro,至少我是这么干的。它也是开源免费的。
这篇文章有很多内容是基于 KeyRemap4MacBook 的。我不想写关于它的教程——如果你想知道怎么用这些东西,你应该去读它们的文档。
Control/Escape
头几个映射并非直接从 Space Cadet 里来的 ,但是他们是受到其打造一个高效的文本编辑器的精神所启发而来的。
现代键盘上的 Capslock 键已经成了一个笑料,而且理由充分:我们没有理由让一个如此重要的键去做切换大小写这种事。很多人都把它重新绑定到更有用的键上,像是 Control,Option,Escape 或是 Backspace。有段时间我把它绑定成 Control 了,后来我意识到可以利用 KeyRemap4MacBook 走的更远。
有一天我想起一个重要的事,我可以将键盘上的按键分为三类:
- 有些按键你按下去是为了改变其他按键的行为,但是单独使用他们的时候没有任何作用(比如 Shift 和 Control)。
- 有些按键你按下去抬起来,但是当你按住他们的时候不希望“重复”他们的操作(像是 Escape 或 Insert)。
- 有些键你有时候按下去抬起来,但是有时候希望重复他们(像是按住 Space 键来插入一堆空格,或是 Backspace 键来删除一堆字符)。
你能看出这意味着什么么?最后一组非常普通,但是前面两组很特殊。具体点说,有两种按键的方式,而他们只在其中一种方式中发挥了作用。
这意味着我们可以将他们组合到一个键上而不会丧失任何功能!
我肯定不是第一个这么想的人,因为 KR4MB 已经内置了这种映射的功能。
首先,我在 OS X 层面上在系统配置的键盘配置页面将 Capslock 映射为 Control,进入系统配置的键盘页,点击右下角修饰键按钮,在下拉菜单中选择键盘(这个很容易忽视),然后修改 Capslock 设置:
然后我在 KeyRemap4MacBook 里开启了下面这个内置选项:
Control_L to Control_L
(+ when you type Control_L only, send Escape)
现在键盘上的 Capslock 键会变为:
- 如果按住并按下其他键,它是 Control。
- 如果单独按下并抬起,它是 Escape。
这将两个非常重要的键(至少对于 Vim 用户来说),绑定到一个位于键盘主要位置的键上!不需要在使劲伸手按键了!
如果你想强迫自己使用它,把原始的 Escape
键禁用。你会学得很快。
更新:我忘记说了,如果你使用了这个(或是下面说的 Shift 调整)你可能会想要在 KR4MB 配置里修改“[Key Overlaid Modifier] Timeout”:
这个设置控制着一个按键作为“单次按键”的最大时长。举个例子比较好理解。默认是 1000ms,这意味着如果你按住 Capslock 键 900ms 并松开,会触发 Escape。如果你按住它 1001ms 再松开,会被当做按下并释放 Control 键。
如果你发现你经常习惯性按下 Control 键并松开,但是它却触发了 Escape,你可能会想要把它调低一点。我把我的设成了 300ms。
这对于等下说的 Shift 键映射尤为重要,所以如果你要调整它,记住这个设置。
Hyper
现代 OS X 支持四个“修饰键”:Control,Option,Command 和 Shift。Space Cadet 键盘有五个:Control,Meta,Super,Hyper 和 Shift。
Shift 和 Control 两者都有,OS X 的 Option 键跟 Meta 键其实非常像(事实上我感觉 Emacs 用户一般会把 Alt 当 Meta 用)。我武断的决定 OS X 的 Command 等价于 Super 键。就剩下 Hyper 了。
既然 OS X 没有对第五个修饰键有原生支持,我得想个办法伪造一个。
首先,我意识到既然我用 Capslock 替代了 Control 键,原本的那个左 Control 键就没有用了。所以第一步就是把它映射成与 Capslock 版本的 Control 所不同其他按键。
这个就需要 PCKeyboardHack 了。我不认为 KeyRemap4MacBook 能做到这一点,因为现在 KR4MB 已经不能分辨 Control 按键事件是由 Capslock 按键触发的还是真正的 Control 键触发的(这是由于前文所述的调整导致的)。然而 PCKeyboardHack 可以分辨。所以我把左 Control 映射到 80
号键:
F19
的键号是 80
。我的键盘没有 F19
键所以不会跟任何东西冲突。现在我可以直接在 KR4MB 里像其他按键一样将 F19
随意映射了。
为了创建一个“伪 Hyper”修饰键,我映射这个键等效于同时按下其他全部四个修饰键,只要在 KR4MB 的设置文件 private.xml
里添加下面的配置:
<item>
<name>Remap Left Control to Hyper</name>
<appendix>OS X doesn't have a Hyper. This maps Left Control to Control + Shift + Option + Command.</appendix>
<identifier>space_cadet.left_control_to_hyper</identifier>
<autogen>
--KeyToKey--
KeyCode::F19,
KeyCode::COMMAND_L,
ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L
</autogen>
</item>
据我所知,OS X 或是任何程序里没有什么快捷键会同时用到全部四个快捷键(怎么说你也不能毫不费力地同时按下他们吧?)但是很多像是 Keyboard Maestro 这样的程序,可以让你自定义快捷键。所以现在我给自己打造了一个提供“作用域”功能的按键来定义我自己的快捷键!
这太棒了。我不必担心它会跟任何已有的快捷键“冲突”了,而且只需要按一个键。
现在我用这个“作用域”键来切换程序。作为常见的 Command-Tab
切换器的替代物,我用快捷键来切换各个常用的程序。举个例子,Hyper-k
切换到 Firefox,Hyper-y
切换到 Twitter,等等。这个比 Command-Tab
要好,因为我不必担心我需要按多少次才能切换过去。Hyper-k
永远都会切换到 Firefox,所以我可以放心的将之存入我的肌肉记忆中去。
还有一个我用在 Keyboard Maestro 里面的小技巧。私人订制,但是我相信很多人会觉得它很顺手。
我经常会一直开着两个 iTerm 2 的窗口。一个分成两个面板(pane)的窗口放 tmux 会话。一个面板放 weechat 聊 IRC 用,另一个面板放 Mutt 来处理邮件。这个窗口会一直保持在我的笔记本屏幕上,其他事情都在外部显示器上做。
第二个 iTerm 窗口几乎永远保持全屏,开启一个 tmux 会话来处理所有事。窗口和面板的数量都随机应变。
我希望能够有种方法让我绑定 Hyper-i
和 Hyper-m
来直接激活我的 IRC 和邮件面板,用 Hyper-j
直接激活第二个“一般事务”的 iTerm 窗口。
解决方案分两部分。首先我配置了 tmux 使得 prefix N
可以选择当前窗口的第 N 个面板,只要把这段配置添加到 ~/.tmux.conf
:
bind 1 select-pane -t 1
bind 2 select-pane -t 2
bind 3 select-pane -t 3
bind 4 select-pane -t 4
bind 5 select-pane -t 5
bind 6 select-pane -t 6
bind 7 select-pane -t 7
bind 8 select-pane -t 8
bind 9 select-pane -t 9
我的 tmux 前缀是 Control-f
,所以我只要按 Control-f 1
就可以切换到面板 1,如此类推。然后我又像这样配置了 Keyboard Maestro:
这个绑定了 Control-Shift-Option-Command-i
(也就是 Hyper-i
)来执行以下动作:
- 激活 iTerm 2。
- 模拟
Command-Option-1
按键来激活 iTerm 2 的第一个窗口(我简单的假设我永远先开我的邮件/IRC 窗口)。 - 模拟
Control-f
按键。 - 模拟
1
按键,和前面一个按键组合起来告诉 tmux 切换到面板 1。
邮件窗口的快捷键当然也是类似的,一般任务的终端窗口就更简单了。
所以现在我有了一个不与任何东西冲突的免费的修饰键,而且我还有了几个非常容易按的快捷键让我的手指产生记忆来快速切换程序。太赞了。
更好的 Shift
Shift 键也是一个只有和其他键配合才有用的键,所以很自然它也是我需要优化的目标键。然而首先我需要先来改正我的一个坏习惯。
Shift 键训练器
我人生大多数时间都在打字,但是我从未好好学过如何正确使用它。我当然可以输入,但是有时候我是用错误的手指在按某些键。
我最为糟糕的毛病是我一直在用左 Shift 键。甚至在我输入 X
的时候我都是用我的左小指头按左边的 Shift 键再用左食指按 x
,这使得我的手不得不离开基本位置(home row)而且一般来说这感觉很糟。
一天我决定不应该继续错误下去了,我应该自己来解决这个问题。最简单的方法来改掉一个坏习惯就是让做到它变得困难一些甚至不可能,所以我创建了自定义的 KeyRemap4MacBook 配置来禁用那些用不正确的 Shift 按下的键。这里是全部的配置:
<item>
<name>Use the correct shift keys.</name>
<identifier>private.correct_shift_keys</identifier>
<autogen>--KeyToKey-- KeyCode::Q, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::W, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::E, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::R, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::T, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::A, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::S, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::D, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::F, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::G, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::Z, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::X, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::C, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::V, ModifierFlag::SHIFT_L, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::Y, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::U, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::I, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::O, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::P, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::H, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::J, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::K, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::L, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::SEMICOLON, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::N, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::M, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::COMMA, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::DOT, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
<autogen>--KeyToKey-- KeyCode::QUOTE, ModifierFlag::SHIFT_R, KeyCode::VK_NONE</autogen>
</item>
我正常使用计算机花了差不多四个小时来忘却这二十年来的错误打字习惯。你会很惊讶当你简单强迫自己的时候你的肌肉记忆能够多快的进行调整。
等我习惯了之后,我便禁用了这个设置,你还是能保持使用“正确”的 Shift 键来输入,同时有时候那些“错误”的按键的确更好按一些。
如果你只用一个 Shift 键我真的想鼓励你去试试这个。它平摊了两个小手指头的压力而且感觉确实好多了。你的手会感谢你的。
Shift 括号
现在我能正确地使用 Shift 键了,是时候看看能映射些什么上去了。有一对键是个完美的候选:左右括号。
括号在现在的编程语言中被普遍使用着(或多或少)。如果你去数数,我可以跟你打赌你会发现他们比方括号和花括号在你大多数代码里要更加普遍,而且他们还被乱放在 Shift-9
和 Shift-0
上面。
我决定重新映射我的 Shift 键成这样:
- 当我按住它并按其他键的时候,它是 Shift。
- 当单独按下并抬起的时候,输入左右括号(对应左右 Shift 键)。
这意味着我可以只按一个单键来输入一个括号。用了一段时间后我真是爱上它了。KeyRemap4MacBook 的配置是这样的:
<item>
<name>Shifts to Parentheses</name>
<appendix>Shifts, when pressed alone, type parentheses. When used with other keys they're normal shifts.</appendix>
<identifier>private.shifts_to_parens</identifier>
<!-- This is the basic mapping. -->
<autogen>--KeyOverlaidModifier-- KeyCode::SHIFT_R, ModifierFlag::SHIFT_R | ModifierFlag::NONE, KeyCode::SHIFT_R, KeyCode::KEY_0, ModifierFlag::SHIFT_L</autogen>
<autogen>--KeyOverlaidModifier-- KeyCode::SHIFT_L, ModifierFlag::SHIFT_L | ModifierFlag::NONE, KeyCode::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_R</autogen>
<!--
Remap the "rolls" of () and )( because it's too easy to hit one
before finishing the other, and there's no other reason to be
pressing both shift keys at once anyway
-->
<autogen>--KeyToKey-- KeyCode::SHIFT_L, ModifierFlag::SHIFT_R, KeyCode::KEY_0, ModifierFlag::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_L</autogen>
<autogen>--KeyToKey-- KeyCode::SHIFT_R, ModifierFlag::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_L, KeyCode::KEY_0, ModifierFlag::SHIFT_L</autogen>
<!--
Remap Rshift+Space to ') ', because when typing an end paren and
then a space I tend to hit space before I let go of rshift.
-->
<autogen>--KeyToKey-- KeyCode::SPACE, ModifierFlag::SHIFT_R, KeyCode::KEY_0, ModifierFlag::SHIFT_L, KeyCode::SPACE</autogen>
</item>
如你所见,除了映射还有些其他东西,因为我发现原始的设置有些可用性上的小问题。
偶尔我会在意图做其他事的时候意外地输入一个括号,但是它发生频率如此之低而好处又如此之大,我仍然强烈建议给所有写很多程序的人。
键的层级
现在我们要谈论的事情是直接受 Space Cadet 键盘所启发的。如果你不会输入很多数学符号也许不会想要搞这些麻烦的东西,但是既然我在 Coursera 上在学习 Introduction to Mathematical Thinking 课程,这些绑定可以让我写作业的时候更为愉快。
希腊字母
Space Cadet 有一个单独的按键来输入希腊字母,我也决定做同样的事。我不知道具体修饰键是如何工作的,但是我可以告诉你我是怎么做的:
- 按下并释放“Greek”键使得下一个字符进入“Greek 模式”。
- 按下合适的拉丁字母来输入对应的希腊字母(区分大小写)。
举个例子,按下 Greek
键然后再按 w
可以得到 ω(omega)
,如果按下 Greek
键,再按 W
可以得到 Ω(大写 omega)。
如果你实际上想输入一个完整的希腊单词,这并不理想,因为你不得不在按每个字母的时候一直按着 Greek
键。但是对于我的需求(数学中的变量)它很完美。
在 KeyRemap4MacBook 中要分两步来实现。首先我需要找一个键来当 Greek
键。我从来不用空格右边的 Command,Option 和 Control 键(另一个我某天可能会去改的坏习惯),所以我选了右边的 Option
键。
如果你确实使用右边的修饰键,那么你应该另选一个键,像是 Insert
或是 Print Screen
键。
此外,既然我用的 Realforce 是个 PC 键盘,这个键其实叫做 PC Application key
。我相信如果你需要的话肯定有办法来调整映射。
这里是映射的第一部分,绑定了 Greek
键:
<item>
<name>Greek Layer</name>
<appendix>Right PC Application key activates the Greek key layer.</appendix>
<identifier>space_cadet.greek_layer</identifier>
<autogen>
--KeyToKey--
KeyCode::PC_APPLICATION,
KeyCode::VK_STICKY_EXTRA4
</autogen>
</item>
我用的是虚拟修饰键 EXTRA4
。这个键只在 KR4MB 内部能够识别,但这不是个问题,因为我其他的关于 Greek
的映射也全部在这里实现。
我写了点 Python 脚本 来帮我生成剩下的映射。这里是完整的 Greek 层映射:https://gist.github.com/3824106
那些 Option
修饰键都是干什么的?好吧,其实还要做一步他们才能被使用。为了能够使用这些映射你需要在 OS X 的“系统设置”→“语言和文本”→“输入法”中切换你的键盘布局到“Unicode Hex Input”:
据我所知它跟 QWERTY 布局完全一致,除了它还能允许你直接按住 Option
并输入字符的 Unicode 码的 hex 值来输入 Unicode 字符。这就是那些映射如何输入希腊字符的。
如果你想用其他键盘布局的话,我不确定是否可行。如果你找到了其他方法,请告诉我我会贴在这里的。
然而,这里有一个问题。Unicode Hex Input 键盘布局不知道什么原因禁用了 OS X 的 Option-Left
和 Option-Right
键盘快捷键,我也不想去猜为何。幸运的是他们可以用另外的映射来恢复:
<item>
<name>Restore [Shift-]Opt-(Left/Right)</name>
<appendix>The Unicode Hex Input keyboard layout disables these keys for some reason.</appendix>
<identifier>space_cadet.fix_opt_arrows</identifier>
<autogen>
--KeyToKey--
KeyCode::CURSOR_LEFT, VK_OPTION | VK_SHIFT,
KeyCode::B,
ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L
</autogen>
<autogen>
--KeyToKey--
KeyCode::CURSOR_LEFT, VK_OPTION,
KeyCode::B,
ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L
</autogen>
<autogen>
--KeyToKey--
KeyCode::CURSOR_RIGHT, VK_OPTION | VK_SHIFT,
KeyCode::F,
ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L
</autogen>
<autogen>
--KeyToKey--
KeyCode::CURSOR_RIGHT, VK_OPTION,
KeyCode::F,
ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L
</autogen>
</item>
Option-Delete
也被 Unicode Hex Input 移除了。我还不知道该怎么修正这个问题,但是我也不是很在乎这个,因为我在我的 ~/Library/KeyBindings/DefaultKeyBinding.dict
文件里绑定了 Control-w
就像命令行中一样:
{
"^w"="deleteWordBackward:";
}
欢迎来到狡兔三窟的键盘绑定自定义的世界!
我配置的 Greek 层跟原始的 Space Cadet 的映射据我所知已经非常相像了。这里是按键和他们对应的希腊字符的表格:
| Key | Alone | Shifted | Notes | |:---:|:-----:|:-------:|:------| | a | α | Α | Alpha | | b | β | Β | Beta | | c | χ | Χ | Chi | | d | δ | Δ | Delta | | e | ε | Ε | Epsilon | | f | φ | Φ | Phi (p was taken and the ph sounds like an f) | | g | γ | Γ | Gamma | | h | η | Η | Eta | | i | ι | Ι | Iota | | j | ϑ | Θ | Theta (with one of the lowercase variants) | | k | κ | Κ | Kappa | | l | λ | Λ | Lambda (Lisp users rejoice!) | | m | μ | Μ | Mu | | n | ν | Ν | Nu | | o | ο | Ο | Omicron | | p | π | Π | Pi | | q | θ | Θ | Theta (with the other lowercase variant) | | r | ρ | Ρ | Rho | | s | σ | Σ | Sigma (with one of the lowercase variants) | | t | τ | Τ | Tau | | u | υ | Υ | Upsilon | | v | ς | Σ | Sigma (with the other lowercase variant) | | w | ω | Ω | Omega (o was taken and the lowercase kind of looks |like a w) | x | ξ | Ξ | Xi | | y | ψ | Ψ | Psi (p was taken and it looks a bit like a y) | | z | ζ | Ζ | Zeta |
数学符号
Space Cadet 还有一个 Top
键来输入按键上方的符号,我想他们是用于 APL(译注:一种编程语言)的。我不用 APL,但是当我处理数学问题的时候如果能够方便的输入一些符号的话也是很不错的。
我增加了一个 Math 层,跟 Greek 层的功能很像。我用右 Control
键来激活它。我不想太具体说它的工作原理,因为跟 Greek 层差不多。如果你想用的话,这里是对应的代码:https://gist.github.com/3824109
当下我只是增添了我觉得有用的数学符号,所以还有很多空位置。我计划根据需要逐步添加。
| Key | Alone | Shifted | Notes |
|:---:|:-----:|:-------:|:------|
| a | ∧ | ℵ | And, Aleph|
| b | | | |
| c | ∘ | ℂ | Composition, Complex numbers |
| d | | | |
| e | ∈ | ∉ | Element of, Not element of |
| f | ∫ | | Integral (i was taken and it looks like an f) |
| g | | | |
| h | | | |
| i | ∩ | ∞ | Intersection, Infinity |
| j | | | |
| k | | | |
| l | | | |
| m | | | |
| n | | ℕ | Natural numbers |
| o | ∨ | | Or |
| p | | | |
| q | | | |
| r | √ | ℝ | Root, Real numbers |
| s | | | |
| t | | | |
| u | ∪ | | Union |
| v | | | |
| w | | | |
| x | ⊻ | | Xor |
| y | | | |
| z | | ℤ | Integers |
| - | ¬ | | Not (looks like a minus) |
| = | ≠ | ± | Not equal, Plus or minus (Shift-=
is normally +) |
| / | ÷ | | Division |
| , | | ≤ | Less than or equal to (Shift-,
is normally <) |
| . | | ≥ | Greater than or equal to (Shift-.
is normally >) |
| 1 | | | |
| 2 | | | |
| 3 | | | |
| 4 | | | |
| 5 | | | |
| 6 | | | |
| 7 | | | |
| 8 | | × | Times or cross product (Shift-8
is normally *) |
| 9 | | | |
| 0 | ∅ | | Null set |
| ` | | ≈ | Approximately equal to (Shift-`
is normally ~) |
| [ | ⊂ | ⊄ | Proper subset of, Not proper subset of |
| ] | ⊃ | ⊅ | Proper superset of, Not proper superset of |
| Left | ← | ↚ | |
| Right | → | ↛ | |
| Up/Down | ↔ | ↮ | |
此外,最后五行还支持用 Control
键来输入更多变体:
| Key | Ctrl | Ctrl-Shifted | Notes | |:---:|:----:|:------------:|:-----:| | [ | ⊆ | ⊈ | Subset of, Not subset of | | ] | ⊇ | ⊉ | Superset of, Not superset of | | Left | ⇐ | ⇍ | | | Right | ⇒ | ⇏ | | | Up/Down | ⇔ | ⇎ | |
结论
如果你想要我完整的 KeyRemap4MacBook 配置文件,你可以在我的 dotfiles 项目里找到最新的版本。
我在我的机器上做了一些疯狂而琐碎的事情。无须怀疑 Hacker News 上总有一大堆人会嘲弄和吹嘘自己如何只使用默认配置。我不在乎。想到我每周在键盘上花 60 个小时以上,即使他们只节省了我 0.01% 的时间,一两年后也会值回成本。更不用提他们还会防止手指疲劳损伤。此外,折腾并看你能走多远(有时候)是很有趣的!
我对我的硬件和布局都相当满意。我的梦想是搞一套印着我的键标的自定义键帽,并用 Space Cadet 的配色和版面设计放到白色的 Realforce 上。那绝对会很漂亮,但是我也知道搞一套自定义键帽非常昂贵。改天再说吧!