为什么要用模式编辑?
Meow 是一个模式编辑的插件,时间上已有一年多了。虽然有写过文档和解答一些问题,但都是从功能使用的角度。而从我自己的角度来看,探索,思考和设计是自己更在意的部分,所花的时间也数倍于开发时间。这里想简单的聊聊这个过程。
在使用 Emacs 之前我是一个 Vim 用户(因为以为 Emacs 是 Mac 独占的),切换到 Mac 的时候自然就用上了 Evil。但是当时也许是 Evil 不稳定,也许是我不会配,经常会有卡死的情况,体验并不好。我在 Emacs 和 Vim 中摇摆了一段时间之后,因为 Emacs 可以显示大小不同的字体,可以显示图片,对 Clojure 支持更好,和 Elisp 比 VimL 更好等原因选择了 Emacs,一时间也放弃了 Evil 的尝试。
之后大约两年的时间,都在使用 Emacs,缓慢的学习 Elisp,慢慢的手就疼起来了。这大概有很多原因,可能是缺钙,可能是 Macbook C 面热辐射严重,可能是打字太用力,可能是手贱废操作多等等原因。结果就是某天情况很严重,早上因为手疼醒过来,一气之下(起床气可以让人做任何事,是上天赐予的动力)就换到了 Programmer Dvorak。Programmer Dvorak 的很多常用符号键不用 Shift,一开始觉得还是很有帮助。继而又开始对键盘布局各种微调,比如交换单双引号,冒号分号等等。一时间问题仿佛得到了解决,但错觉而已,确确实实 Dvorak 打字在顺手程度上很有帮助,但对于手疼的问题,帮助微乎其微。这所谓 RSI 问题在大量进行文本修改,需要高频使用修饰键的场景会尤其的明显,迫使我不得不重新拾起模式编辑。
模式编辑的选择
这个时候我选择回到 Evil,因为我有信心相信它已经完善,简单的问题我也有能力解决。对于 Vim 的命令布局,因为是 Dvorak 键盘,所以 HJKL 位置变的没有意义。这里就是问题所在,我是不是应该把一些键交换下,把上下左右放到右手的一排?换言之就是
“在个人的工具上是否要追求感观(而不是效率)上完美的方案?”
现在我的答案是 NO,但当时是 YES。
调整 Evil 的时候,当然也要对各种 evil-* 的插件进行配置,还要重做自己的 Leader 系统。之后就陷入了一些奇奇怪怪的问题中,我永远都没有对我的 Evil 配置满意过,不断的处理小问题和纠结按键排列。有两个问题一直困扰着我:
“如果我不是要做个配置的发行版,我重排按键有什么意义?”
“既然不会回到 Vim 为什么要用一个高度模拟 Vim 的方案,效率和代价是否平衡?”
我想起来在我不用 Evil 的时候,我从来就没有在这些问题上花费时间,所以我把这样的时间花费定义成浪费,这两个问题自然有了答案。
这两个问题的答案最终让我选择去看看 Emacs 都有什么样的解决方案。如果只注视一样东西,你很难发现他的好与坏,你甚至很难定义好坏的标准。我先后用了比较长的时间的用了 Xah-fly-keys, Modalka, god-mode, kakoune.el。我最终觉得 Kakoune / Evil + god-mode 的模式应该是我想要的,只是简单组合下就可以得到我认为相对完美的方案。
为什么要写另一个模式编辑?
因为想要简单,想要探索两个问题:
“在编辑上能不能用更少的键做更多的事?”
“能不能用更少的配置构建一套 leader 的系统?”
更少的键意味着他们都可以有好按的位置,更顺手,更高效,当然也可以更好的减轻 RSI 问题。更少的配置,意味着配置集成的成本更低,引入的额外问题更少。所以确切的说,Meow 是在探索想法而不是解决某个特定的问题。
关于减少命令的数量
模式编辑通常包含好几类的命令:切换模式,移动,选择,删除,取消等等。其中移动命令通常占比很高。所以压缩命令数量实际上是在压缩移动命令的数量。当数量压缩以后,这里会产生一个矛盾:
如果想要一套行为专一简单的命令集,例如 Kakoune 的形式,每个命令默认都不会扩展选择,默认也都正向,使用 shift 来扩展,使用 alt 来反向。结果就是真实的使用场景需要高频使用修饰键。
如果想要一套完全摆脱修饰键的命令集,例如 xah-fly-keys 的形式,每个命令有几种行为(DWIM 风格),每个命令的行为依赖于当时的环境有自己的规则。结果就是模式编辑中命令组合的优势被弱化了,每个命令的描述变的复杂。
在中间摇摆很久之后,我的答案是使用 DWIM 但有一致规则的命令。这需要一些概念把这些命令串联起来,所以 Meow 里面有两个概念就是“选择的方向”和“选择的类型”。
如果我们编辑的指针,从一个简单的光标(只有一个位置),变成了一个包含更多信息的选择区域(有两个位置,有方向,有类型),是不是能让命令之间产生更多的联结?
这是 Meow 要回答的第一个问题。
关于减少配置的成本
每个插件,但凡有快捷键的,大部分都有一套默认的快捷键或是一个 keymap 由用户自己安置。在不用模式编辑时,我对这些快捷键没有产生任何异议,我不满足的并不是按键序列而是手指按键的方式。所以个人很赞同 god-mode, Modalka 或是 ryo-mode 的思路。这样的方式当然有自己的缺点,但这些缺点在我眼中是可以解决和克服的,而带来的受益在选择这个方向时瞬间就可以获得。
当我装上 god-mode 时,我马上就明白了在这个模式下,执行原来的那些命令变的多么简单和自然。所以 Meow 中就加入了 KEYPAD 这个状态。
反过来看,高频编辑命令的位置布局怎么安排,是一种主观理解的表现。我认为 Emacs 用户都是燥动爱折腾的,当然包括了我自己,就在这个问题上,大家都有能力提出一个自己满意的方案,但却没办法保证明天会赞同今天的自己。所以 Meow 提供了一个空的 NORMAL 模式,方便别人调整也方便我自己。
NORMAL 模式下的各个单键命令数量少使用频率高,而 C-c 和 C-x 下的命令数量多使用频率低,对前者我们选择“控制”,对后者我们选择“接受”,这样是否更为合理?
这是 Meow 要回答的第二个问题。