我为什么要另开发一套模式编辑?

为什么要用模式编辑?

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 要回答的第二个问题。

15 个赞

我个人按了ctrl+n和ctrl+p十多年,一直用无名指按ctrl键(我比较奇葩的指法)

总是觉得vim那种模式虽然快,但是写代码更多时间是在编辑,而不是查阅后来回切换模式。

meow适合我这种人吗?

2 个赞

感觉还是不太明白Meow,问一个问题,Meow和hydra有相同点吗,hydra我感觉也是一种模式编辑(hydra的文档感觉也写得不错),hydra几乎解决了我所有按键方面的问题

我也用过几年 Ctrl+n Ctrl+p,在我理解中模式编辑是解决手疼问题,不是效率问题。

硬要比效率的话,我觉得差别不大,但是大量编辑的场景和大量输入的场景需要按修饰键的次数差异很大,这点我比较在意。之前自己统计如一整天都在各种改的话,大概要按 1 万次 Ctrl。模式编辑相当于把这 1 万次 Ctrl 分到别的地方去。

meow适合我这种人吗?

我觉得不适合,因为你有一整套自己的插件体系,切换成本应该是很高的。

1 个赞

我以前也会用 hydra 。我觉得 hydra 是在给一个 keymap 上面加额外的自定义的信息,比如帮助的提示。可以用来做模式编辑,不过有这么几个问题。

  • 他并不提供一套命令,而 Emacs 自带的命令我觉得不太适合模式编辑
  • 帮助信息对很高频的命令意义不大,但是这个帮助的机制对速度有些负面作用。

专门用来做模式编辑相似的方案是 ryo-mode 。

是勾起来用指甲的那一面压键?

就用无名指按,手抬起来按,不用指甲

我可以举个对模式编辑最不利的例子:在编辑模式中回到命令模式,向上移动一下,再进入编辑模式;假设需要的按键是 esc k i,也即 esc 返回命令模式,k向上移动,i 进入编辑模式。如果你不使用编辑模式,而是 ctrl+p,依旧需要两个按键(而且还是更容易 rsi 的组合键)。也就是说,即使是对编辑模式最不利的情况下,emacs 原生按键模式的优势也非常的小,更不要说在命令模式下大量执行命令了。

用方向键按一下不就行了吗

只是举个例子而已啦,向上可以换成其他不方便按的命令。

我觉得用ctrl组合来移动更快了,组合键用起来最大问题是激动用力一点就手受伤。后来就用evil加general,因为在终端经常会用到vi,浏览器又有ci插件,这样没转换成本,

不用esc,j,i,c-o,j 两个就行了

C-o j 也是三个键 :joy:

我指法更奇葩,我无名指和小指一起按 caps 做 ctrl

本来也是想就用Emacs的习惯就好了,可是是真的会手痛。后面经历有些类似,狗哥提到的那些模式基本都试过,一直觉得Evil太重想跳出,又没有狗哥的水平,所以配置也就变来变去,希望狗哥能走出一条新路来 :+1:,我们就等着躺平 :grinning:

来试试我的 meow,也许这方向是对的。

试试用小拇指下面的那块关节按压。

你们按control主要是哪些操作? 上下左右移动光标吗? 我感觉自己平时按control几率不高

上下 C-c C-x C-v

1 个赞

个人经验,只要抬起手腕像弹琴一样敲键盘就会好很多。