不得不说,我真是那种非常喜欢折腾的人,可能我有一点自虐倾向吧(?)。
Vim
我刚上大学的时候用了 vim, 折腾了半天,一反思好像写代码的时间还没有搞 vim 配置的 时间长。最后的结果是直接 clone 了一个 amix/vimrc, 然后除了安装新插件,基本上没怎 么动过 vim 的配置了。
我现在浏览器基本都会安排上一个绑定 vim 按键的插件,一开始用的是 vimium, vimium 基本能满足使用需求,但我看到别的人推荐,又下了 surfingkeys, 又用surfingkeys-conf 这个配置模版加了一些自己的配置,这样我一个浏览器里面的快捷键就己经有几百个(常用 的可能十几个)。
浏览器
现在接触了 emacs, 一个副作用就是看 youtube 上的 emacs 博主们的时候顺便看到了他们 推荐的 qutebrowser 和 nyxt. 这两个浏览器也都是一堆的配置与快捷键设置。
qutebrowser 我己经配置了很多了,我估计我花了得有 20 个小时在配置上面,但我最近还 是用回了 surfingkeys + surfingkeys 作者维护的 chrome 版本—— qutebrowser 不能看视 频,有些网站用不了还是有点影响体验。 nyxt 吸引我的点是它用 lisp 编写,我估计我迟 早有一天也会忍不住下下来体验一番,然后最后又用回 chrome.
输入法
除此之外,大一的时候看了一个介绍双拼的视频,就心血来潮学了小鹤双拼。花了两周时间 熟练,明明体验挺好的,看小鹤的用户基本都一直在讨论小鹤音形,于是又出于玩心切到了 小鹤音形。(在此之前我还试过注音键盘,想来和小鹤有些相似。)
小鹤音形确实比小鹤双拼用起来要舒服不少。学起来基本没有什么负担,而且因为用了一半 形码,重码率比小鹤双拼要低,因此打字速度要快上不少。并且,和小鹤双拼一样,小鹤音 形所有的输入一律四码,节奏感拉满,打字的时候特别爽,就好像在弹奏一样。这个切换我 觉得是值的。
但我又因为闲得慌切到了五笔,这就是一个大坑了,五笔学起来比小鹤要复杂多了,而且打 字速度比小鹤音形并没有长足进足,我怀疑我现在打五笔的速度可能也就和我几年前打小鹤 音形的时候差不多,甚至还要更慢——因为我最近切换词库了,从原本的默认词库切换到了现 在的单字词库,这样单个字的打字的编码更短,但要想恢复打字速度需要多练习,习惯新的 单字的简化编码。
我其实感觉到花这么多时间练五笔对我没有什么用,但又下不定决心回到小鹤音形。
键盘
英文键盘方面,因为我学了法语,其实有时候用的是 azerty 键盘,我有想过完全删除 qwerty 键盘,但因为我在 ubuntu 上用的是 rime, 而 rime 本身不控制键盘的排布,也就 是说如果我删除了英文键盘,那 rime 打字也会是用的法语键盘,这就很难受了。
我听说还有一些布局更合理的英文键盘,比如 dvorak, 但是没有实用过。我之前学俄语的 时候,还使用过俄语键盘,但最后俄语学不下去了,遂放弃。
键位 - keyd
我感觉 emacser 应该都有改键位的经验,毕竟如果不改键位的话, control 键的位置真的 会让人手部畸形发育。就是在为了 emacs 改键位的过程中,我又发现了新大陆。
我先是用 xmodmap 把 ctrl 映射成了现在己经不再存在的 hyper 键。多了一个修饰键以后, 就可以绑定类似于 hyper+a 这样原本不存在的键位,而且还可以和其他的按键组合,emacs 可以说再也不愁键位冲突的问题了。
但是我意外看到了有人推荐 rvaiya/keyd, 于是我又屁颠屁颠跑去试用了。
keyd 很有用,可以称得上是神器了。我写到这里兴之所至,有点想要详细介绍一下 keyd.
keyd 不仅可以对全局进行设置,而且其自带的程序 keyd-application-mapper
还可以对
**某个 app 的符合某个正则的页面**。
[main]
# Maps capslock to escape when pressed and control when held.
capslock = overload(leader, esc)
control = oneshot(hyper)
# control = hyper
# comma = overload(shift, comma)
#; = overload(capital, ;)
# Remaps the escape key to capslock
esc = `
# oneshot 点击shift/meta,然后再按下小写字母
shift = overload(capital, C-\)
[ = overload(window, [)
j+k = esc
[leader:C]
[capital:S]
esc = ~
[hyper:C-M-S-A]
a = C-a
v = C-v
x = C-x
c = C-c
h = left
j = down
k = up
l = right
d = backspace
m = toggle(motion)
[window:M]
a = M-1
s = M-6
层
如以上代码块中所示,我建立了 [main] [capital] [hyper]与 [leader] 四个层,其中 [main] 层是默认的层,什么修饰键都不按激活的就是 [main] 层。 capital 层基于 shift, leader 层基于 control, hyper 基于 control-alt-shift-super. 也就是说, leader-c 就想当于 control-c, 但是可以自已在其下更改,比如我把 hyper-a 改成了等价 于 control-a.
其实默认是有叫作 shift, control 的层的,但是一方面这容易混淆,另一方面在
keyd-application-mapper
(后面介绍) 中似乎没法用 shift, control 当作层名称,
因此我创建了新的层,命名为 capital 与 leader.
hyper 层是一个伪 hyper, 将其映射为 control-alt-shift-super 可以让使其变成一个修 饰键使用,但可惜的是这样不支持组合使用。不过还好,这样己经够用了。
除此之外,代码里面出现的 motion 和 window 是两个特殊层。
motion 这个层里面 w,s,a,d 被映射成上下左右, h,j,k,l 也是上下左右, p,n,f,b 还是 上下左右。在*只读模式下*,如在 zotero 读论文的时候,这个层使用起来很爽。
window 基本与 super 相同,按需要加了一些小修改,绑到了 [ 键上,方便使用。
函数
overload, oneshot 与 toggle 是三个有用的函数。
capslock = overload(leader, esc) 的意识是按住 capslock 相当于激活 leader, 松手回 到 main, 按一下 capslock 相当于按了 esc. *这是一个相当有用的设置*。我现在己经没 法离开这个设置了,在所有的其他电脑上我都会想念这个设置。
oneshot(hyper) 使得我可以按一下 control 触发 hyper 层,而后下一个按键就会 hyper 层下激发,再下一个按键就又会回到 main 层。如,我先按 control, 再按 1,就相当于 hyper-1. 再按 a, 其结果就与按了 a 等同。这个我使用频率不高。
toggle 的意思就是持续激活一个层,比如正常的 capslock 就相当于 toggle(shift).
还有 j+k = esc 的意思是说,连按 j,k 键,相当于 esc. 这个功能其实可以用于输出一些 特殊字符。但我没太尝试过。
keyd 还支持很多函数,比如宏(macro),可以一些输出多个按键,不过我用不太到。
还有一个函数 command 理论上可以执行终端命令,但我没有实验成功。
keyd-app-manager
keyd 支持对某一个 app 的某一个界面设置专门的快捷键。keyd-app-manager 开启verbose 模式以后会在 log 里面输出当前的界面的名称。在指定的界面下配置界面专属快捷键即可。
以下是我对 zotero 论文阅读界面做的快捷键映射。按下 1 以后就可以进入 motion 层, 从而快速移动。
我给 emacs 配置了一个专门的 emacs-motion layer, 绑定了一些快捷键,使用 hyper-m 激活。如果某些时候我不需要编缉的时候就可以打开这个 layer。我感觉如果只是想要加入 一个类似 vim 的 normal-state 的东西用于在 buffer 内只用单手操作光标快速移动,应 该使用这个功能就可以做到。
[zotero|*-*-zotero]
1 = toggle(motion)
meta.e = M-e
main.d = right
alt.s = A-s
capital.x = C-S-t
sxhkd 与 bspwm
前文提到 keyd 中运行终端命令不成功,这个问题在 Unable to use keyboard shortcuts · Issue #864 · rvaiya/keyd 中亦有记载。有人推荐了 sxhkd.
于是,我第一次知道了窗口管理器以及快捷键管理器的概念。
sxhkd 是一个快捷键管理器,专门用来管理使用快捷键调用命令的功能。 bspwm 则是一个 专门用来进行窗口管理的软件。我当时把 bspwm 下载下来以后,重启计算机只能看到一个 大黑屏,我当时还以为安装出错我的电脑坏了。
我上网搜了很久也没有文章提醒我这不是电脑坏了,单纯 bspwm 就是这样的(也可能是提 醒了,但我心里己经有了一个预设的答案就是我的电脑坏了。)
其实真正的原因是, bspwm 的功能真是太专一了,它能做的就只有窗口管理这一件事。需 要安装上 sxhkd 来管理快捷键,安装上 feh 来设置壁纸,安装 alacritty 来当终端模拟 器,安装 dunst 来接收通知,安装 picom 来管理透明度等窗口属性,安装 polybar 来得 到状态栏。大概率,安装了这一套的人还会顺路安装一个 rofi 或 dmenu 作为启动器。
这一套安装下来,又是不小的功夫。我那天晚上安装的时候还一不小心运行了 rm -rf ~
指令,让我崩溃了很久。
sxhkd 我也做了一些配置,但基本上是抄的原代码,自己写了几个脚本,让 sxhkd 也可以 在不同的应用上执行不同的指令。
顺带一提, sxhkd 还有一个类似于 emacs 的链式快捷键。我把 hyper-p;p 绑定为了 mpc play
; hyper-p;t 绑定为了 mpc toggle
hyper-p;n 绑定为了 mpc next
, 这样就可以
方便地听音乐而不用浪费过多的快捷键。(此处 hyper 是前面 keyd 设置的假 hyper, 实
际写在 sxhkd 里要展开成 control + super + alt + shift + p 这种格式。)
Emacs
Emacs 的快捷键配置我其实反而没有什么可以说的,其实基本上也都是在论坛上抄了,就不 好意思拿出来说了。
总结
经过这一番折腾,我的键盘操作逻辑己经是过度自定义化了,我现在如果在一台不熟悉的电脑上打字,甚至哪怕就是在我自己的 macbook 或者是 windows 上打字,都会有一种水土不服的感觉。
(By the way, 有人知道运行了 fill-paragraph 以后如何把段落恢复原状吗?这篇文章里面很多空格都是断行造成的。)