【模式编辑】分享解决自己手疼的终级方案,求建议

自己尝试配了一个模式编辑的方案,当然是为了自己,目前还没有也似乎没有必要搞一个插件,想分享一下一些想法,并收集一些建议。

没有使用vim一样的按键,是因为我自己用的programmer dvorak布局,但布局并不是重点,应该和布局是没有关系的。当然,如果qwerty的话,大概vim就已经够好了。

整个方案是基于如下五个目标来设计的。

I. Prefer the DEFAULT

  • 尽量使用和Emacs默认一致的风格
  • 不为自带快捷键的插件再绑定快捷键

II. DON’t use modifiers

  • 极力避免ctrl和meta
  • 尽量避免shift

III. ONLY switch modal in text edit buffer

  • 只在文本编辑的buffer使用模式编辑

IV. Make the command SHORT

  • 快捷键尽量短

V. TWO modes, NO global leader

  • 两个mode, normal/insert
  • 不设全局Leader Key

权衡了一段时间之后得到的结论,是大体可以用如下手段。

  • god-mode有缺点但是可以满足I, II, IV
  • special mode中有一些键几乎不会被用到,可以用来管理窗口
  • 在基本不会输入符号的地方充份利用符号

方案大致如下

按键位置不重要,功能有无不重要。

只有在有编辑文本的场景下,启动模式编辑,并默认为 normal模式

fundamental-mode 或继承 prog-mode, text-mode, conf-mode 还有eshell/repl的mode。最后这个可以启动,也可以不启动。 如果不启动,那么操作window的时候就先ESC一下就好。

解决ctrl, meta的问题

各个插件的命令,有god-mode的情况下,被放在了m, x, c, space 的序列里。

god-mode有很多缺点,比如不能配合which-key。 但鉴于个人习惯,我要么熟知直接按,要么就直奔M-x

用橙色的这些单键,在normal模式下,或special mode下,直接处理窗口。

回到前一个文件(mode-line-other-buffer)和操作window的使用的频率是很高的。

ESC用来退出INSERT模式,在 normal 模式或 special mode 下则用来回到上一个buffer。实际上相当于充当了special mode里面用其他命令时的leader key。

{, }来在ivy和company中做上下的选择

解决shift的问题

insert模式中用长按的方式输入大写字母,键盘重复是有一个延迟和一个间隔,第2下输入在延迟内,后续在间隔内视为长按,在第三下或第四下的时候,把几个小写的换成大写。

不能解决所有的问题,比如Magit里面push默认是P。 连续多个大写字母的时候,还是caplock好用。

双引号(单引号可能自动配对),或冒号(分号在paredit里面触发注释行为),可以用一些技巧来避免shift,例如;在Elisp中光标不在开头的时候,输入冒号,否则分号;在Rust中则是中间是冒号,末尾是分号等等。

规则有很多细节要靠虑,但使用起来效果极佳。我用这样的方式写Clojure代码时,一个项目可以避免近十万次shift。

其他

可以用chord key ,.代替ESC,等等。

最终体验

似乎效果很好,按起来挺爽的。感觉敲一天代码比写这一篇轻松多了。

5 个赞

很多时候手疼,还真跟坐姿,自己的指法有关。

%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191230092237

3 个赞

用了 programmer dvorak 的键盘布局,qwerty是不是回不去了,如果在两种键盘布局间切换应该很难吧? 毕竟按键都已经形成了本能,完全是下意识的操作,如果中间要停下来想一下显然是不行的,我用的shift是小指和无名指一起按,右shift有时还是三根手指一起按(我发现好多键盘右shift比左shift要长些,不是一样大,回车键也比左边的caps lock键要长些),感觉这个足够解决问题了。

1 个赞

meta 键用大拇指按也手疼吗

我是不按 shift,Ctrl,把 space,分号,a 作为修饰键用,输入标点符号啊,方向键,和常用的大写字母 A,O 等。

我是把单双引号,冒号分号之前用 Karabiner 互换。但用 pd 挺麻烦的是 C-x 1 要用到 Shift 键,而且要保持 C-x 2, 3 的延续性,直接换绑定又感觉不太好,,

别说换了键盘布局,我只是改一个 CapsLock <-> Ctrl 都已经无法在别人电脑顺利上打一行字了。

1 个赞

本质上就是减轻小指头负担,少用小指头按组合键:

  • evil
  • hydra
  • 免不了要按组合键,也尽量让大拇指代劳
  • 摒弃驼峰命名,多写 lisp,少写 Java (雾)
2 个赞

我的指法本身很标准,这个手型确实是个问题。虽然我手腕不痛,也许手顺过来对手指也会有帮助。

可以切换,有点像用两个软件快捷键不同的感觉。但是换过去也会卡一卡,才能顺起来。 多个手指一起shift是个好点子,我要尝试下。

我有试过这个方案,比如按住space是ctrl的话,空格那个键就从按下生效变成抬起生效了,感觉这样很怪异。 还有个问题就是自己这样设置以后,按快了能按出ctrl+space出来,可能和实现的软件有关。 a和分号做修饰键,还是要用小拇指长按,感觉不能解决根本问题。

我这里面有一项是,在emacs里面,输入的时候,根据不同的语言,自动在插入的时候根据位置决定是什么符号。我觉得这很好用,虽然离开emacs就没了,但是习惯了本能上很容易反应过来。 像数字需要shift的话,有一个方案是在右手区域做个小键盘出来,左手放个引导键。 programmer dvorak就是上面一排默认符号,输入括号很方便,数字就麻烦了。如果是hhkb, 可以用手掌shift。如果是其它键盘,我一般ctrl放在capslock,ctrl那个位置用来引导数字键盘,也是用掌根压下去。因为小键盘所有按键在右手,这样配合很轻松。

1 个赞

理想的情况是不对系统键盘做任何调整就能解决问题。

另外可以考虑下我提到的长按大写来解决驼峰的问题,我觉得还算好用。

可以试试老王的这个:

我是指,写驼峰时输入大写字母的问题。 删除的时候我会直接用expandregion,哪边有词就会往哪边选。

单独输数字的话,我是设置在大写锁定的情况下,输入数字而非括号。只是这种方式在有 C-x 的前提下不适用。

在programmer dvorak上面,capslock下,上面一排也是变成数字。所以C-x 1这样的快捷键的里面的数字1,我就是左手手掌按ctrl(或fn)那个位置,右手按m。

如果是qwerty的layout上面,这个甚至可以完全不用切换的来输入16进制,对于输入颜色很有帮助,9个键不包含abcdef。dvorak里面有个c,所以#c8c8c8就不太爽。

我是在 emacs 里才绑定, emacs 之外就不绑定了。 在 emacs 里不怎么按 ctrl+space,按了好像也没有什么问题。我用的是 karabiner 绑定,如果用 hammerspoon 确实有问题。 用 space+j/k 绑定方向键,这样就能把 h/j/k/l 解放出来了。;,a 作为修饰键主要是输入标点符号,这样手就不用来回的移动,;+f 输入括号这样子。 然后就是用 evil,绑定了 M-e 在 emacs-state 执行命令,M-i 在 insert-state 执行命令,还有分号,逗号,space,s-space 作为 leader,基本上所有命令都是用 Meta 配合模式和 leader 绑定

大小写,我是用右 alt 键 toggle 光标前输入的字符的大小写 按第二次是把前面的单词首字母大写 进入 normal-mode 时,;+ 与插入模式的绑定也不同,为了方便输入 A,O,G 这样evil 中常用的大写键。

intellisense才是解决方案吧