karabiner-element 的配置文件,是以karabiner 10.22 版本的自定义配置为基础来实现的,虽然配置文件一个是xml,一个是json,软件也基本可以认为是两个了,但定义的功能基本差不多,主要围绕着hyper键定义以及键的长按模式为基础,在这个基础上定义更多的功能扩展.
hyper键是 cmd,option,shift,control这四个键的组合.
很多功能都是以hyper键+key的组合,为了方便,hyper键有多个,方便不同场景使用. 我按自己的习惯把 tab, \ ,g 这几个键的长按模式映射为hyper键. Tab,\ 更习惯用左右手的无名指,之所以映射到g键,是在不外接键盘直接使用笔记本自带键盘的时候,食指相对更为舒适,纯属个人习惯.
配置中有很多hyper+key的功能我又使用left_control键重新定义了一便,原因很简单,我使用filco外接机械键盘,使用左手的外侧手掌压ctr键作为hyper键来进行组合更为方便,但如果直接把left_control直接映射为hyper键会导致常用的跟ctrol的组合键受影响.所以干脆重新把这些功能重新复制了一次,同样,也是个人习惯.
下面说说这些定义的项都做了些什么事情.
这个窗口居左居右的功能并不是karabiner el自己实现了,我用的是sizeup来管理窗口,窗口的居左居右是我最常用的功能,在sizeup里也是分别有两个快捷键来完成的. 当然,我也使用了left_control + 左右方向键来映射这个功能,但在打字输入场景下我希望能更方便做这样的切换,使用一个快捷键来toggle切换窗口的左右位置.因为不是左就是右,对于快捷键的使用更多的是惯性,不需要考虑哪个键是居左,哪个键是居右,而且一般两个窗口并排的情况下,前一个居左了,下一个同样的键正好是居右. 这里面只是做了同一个组合键的toggle切换,这个状态切换可以用于很多其他的情况.
left_control+key
=> hyper(⌘⌃⌥⇧)+key
// (h,j,k,l) | (n,p) | o | y | return | ... => 方向键 | 翻页 | 退格 | 粘贴板历史 | 切屏 | ...
上面说了,只是因为使用机械键盘我更喜欢把left_control当成hyper键来使,所以做了个映射,个人习惯
这个要说说,打字输入状态需要短暂使用修饰键时,总是需要把手离开主键区,现在好了,直接把SDF JKL这几个键按修饰键的位置做了映射,可以手在原地很方便的按下各种组合键.
特别是我把option键+key作为各个APP的热启动键(热启动实现是用keyboard maestro实现的),在持续输入的情况下需要临时切换应用查看信息就会变得特别有效,在这之前,我也是重度依赖 CMD+Tab.
顺带说一下,ctr键在macOS下大多数的软件里都有保留emacs的文字编辑默认键,这样的映射对于文字的编辑非常快捷.行首,行尾,删除到行尾几乎可以无缝切换.
这个前面说了,不再赘述.
同样是为了不同场景实现相同的功能,对于非输入场景,左边的capslock与右边的回车键几乎是我使用control键的首选了,macbook的右侧的control键的缺失,以及外接键盘的右侧的control键有些远是这个定义的最初目的. 另外capslock的短按会映射到ESC,这个对于Vim党来说也是很重要的,左上角的ESC已经很久不用了.
现在输入上档字符我已经基本不会用小指来按Shift了.
这是一个高频操作,但确是用力量最弱也最没效率的小指来完成的.
这个映射非常重要,解放了小指,同时也使得cpaslock键变的没有意义,连续的输入大写字母,按下空格键后,连续输入反而比capslock这样的开关键要方便.
copy,cut,paste,这几个超高频操作,在右手握着鼠标,左手孤立无援的情况下更为有用.
个人习惯 ,alfred里的action快捷键的映射,对于超高频的一些操作更喜欢单手一键完成.
这个没啥说的,不喜欢macbook的fn+Delete键而已
切换输入法,又是一个超高频的操作,只是一个快捷键的映射,这个快捷键是在系统设置里自己定义的.
切换输入法这个事情想来想去,最方便的还是一键,虽然中文输入法中也有一键shift切换中英文状态,但是对于coding来说我没有安全感,有时候中文状态下的一些字符与英文下的总是会混在一起.
同时配合 karabiner el 同家出的ShowyEdge这个app,效果更好.
总之,切换输入法应该是一个下意识的肌肉操作,不应该需要眼睛定焦,也不能对当前的行为有暂停的影响.
最后
上面的这些定义也是反反复复,不停在变,最近的这个配置估计后面应该会有很长时间不会变了,因为对于个人来说已经基本是肌肉记忆了.这些配置说起来基本也挺无聊的,只是因为有一天发现写程序可以抽象,封装,提供复用性,对于平常的这些高频的操作,是不是也需要进行一些抽象封装,也是一种效率的提升.
这里再把自己键盘上的一些快捷键使用习惯罗列一下,有些快捷键只是做了一些映射和开关,具体的功能是其他软件实现的,无所谓了,主要还是看看使用键盘如何将平常高频的操作进行抽象分类,便于形成肌肉记忆.
hyper就是四个修饰键 ctrl+shift+option+command映射至某一个键上
hyper在配置中是这3个键
Tab
\
g
,tab和\主要是考虑左右手的对称及可以使用无名指操作,g键完全是为了在笔记本自带键盘的舒适习惯考虑.功能等价.
hyper+h,j,k,l
四个方向键
hyper+y
剪切板历史,alfred里的功能
hyper+u
浏览器打开当前选中的URL
hyper+i
shortcat的启动快捷键,shortcat是一款用键盘替代鼠标操作的效率软件,跟chrome里的vimium插件类同.
hyper+o
退格键,使用它是因为我习惯用右手无名指打退格键,这样映射符合条件反射
hyper+;
回车键,原因同上条
hyper+g
以当前选中的文字作为关键词进行google搜索
hyper+b
以当前选中的文字作为关键词进行bing搜索
hyper+t
以当前选中的文字作为关键词进行淘宝搜索
hyper+n
下翻页
hyper+p
上翻页
hyper+m
最大化窗口,窗口管理使用的sizeup
hyper+enter
将当前窗口在不同显示器上切换(如果有多个显示器),使用sieup
hyper+ |
将当前窗口进行左右分屏上面hyper的大部分定义使用left_control又重新copy了一次,原因前面已经说明.主要是使用外置机械键盘左手小鱼记更方向按压而已,个人习惯.
x,c,v cut
, copy,paste
+
alfred的action
space
shift
capslock,return
control, caps lock 单击映射至ESC
SDF,JKL
分别映射至左边和右边的control,option,command,位置排列顺序对应,这几个键也可以多个组合option+key,快速启动app,key基本都是app的首字母,方便记忆.功能是keyboard maestro,这个跟karabiner没啥关系. 这里的option可以是前面定义的
d
或k
,对文字输入的场景中适用.
-
单个按键的几种方式
一个键可以有单击,长按,双击,甚至是3击,其中单击一般不会做重定义,长按是可以做很好的扩展的,基本所有的可打印字符以及function功能键都是可以做这样的扩展的,因为键很多所以扩展的范围很广,可以好好利用. 而双击,三击对于单键来说一般扩展性不好,一般用于非打印字符更为合适. 如果需要,配合下面第二点说的状态开关来使用可能效果会更好一些.
-
上下文开关状态
可以使用karabiner-el中的变量定义来做一些上下文相关的开关状态定义,以及可以使用开关状态来进一步扩展具体的功能使用.
比如说,按下某个组合键,打开某种功能的上下文开关状态变量, 后面在这个状态下,就可以定义n多功能操作,不使用的时候再通过组合键关闭,这样的定义就好像程序中的命名空间一样,很多的操作快捷有自己的命名空间和生命周期,可以有效避免快捷键冲突并得到几乎是无限的具体专项功能扩展的能力.
Karabiner 10.22 版本的配置,现在是9012年了,应该没人会需要这个配置了吧.