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

没有太能理解问题,举个具体一点的例子?

就是我在Ctrl-c b 后面绑了许多命令,它作为前缀,如Ctrlc-c b aCtrlc-c b b…,为方便少按键,我想在normal模式下按SPC-b 时相当于按Ctrl-c b,就像Ctrl-c b 的KEYPAD模式这样

这种情况下不需要 KEYPAD,你需要做一个 keymap ,然后绑在 leader 的 b 上面。你可以参照

这个 +magit-keymap 的定义和下面 48 行的使用。


这种方式,我使用的很少量。

KEYPAD 是用来在不用修饰键的情况下执行普通的命令的,如果要自定义一套 leader 的按键规则,直接在 leader 上绑定按键即可。不过我不建议弄一套很复杂的 leader,只需要找出几个最高频的命令,放在最好按的位置,其它命令就用默认的 KEYPAD 就好。

哦,谢谢。这也是一个方式,但是个人理解上觉得要是有能够直接等同的方式可能会更方便点。这样的话KEYPAD模式可以都可以并入LEADER模式中,更简单清晰些

用one-key ,你的Ctrl-c b a 可以用SPC b a 触发。其他的也是类似SPC b b 等等。

看了下one-key是能实现这种情况,但是会和meow应该会有冲突吧?还有就是用meow本来就想轻量少侵入,所以暂时不考虑再引入另一套机制。

不会有任何冲突,放心食用。one-key和meow不是一个东西啊,one-key类似general。你试试就知道了。

好的,谢谢,去试用下

用one-key分组管理b后面的按键,b在meow中设置。

能把one-key 和 meow 一起用的代码贴些上来不。one-key 的文档有点少,谢谢

感觉 one-key 挺重量级的,代码量和 meow 已经相当了。。如果想轻量的话,定义个按键做些绑定就可以吧。

one-key其实非常轻量,大部分代码都在绘制菜单。

one-key的核心就是根据当前key-binding list生成菜单,菜单里面所有按键公用一个全局按键。

高级的用法是,菜单里按键可以递归绑定到子菜单。

但是原理很简单。


    (meow-leader-define-key
       ;; SPC j/k will run the original command in MOTION state.
       '("t" . one-key-menu-tools))

    ;; TOOLS
    (defvar one-key-menu-tools-alist nil
      "The `one-key' menu alist for TOOLS.")

    (setq one-key-menu-tools-alist
          '(
            (("m" . "Mail") . mu4e)
            (("s" . "Shell") . vterm)
            (("t" . "Treemacs") . treemacs)
            (("r" . "Restart") . restart-emacs)
    	))

    (defun one-key-menu-tools ()
      "The `one-key' menu for TOOLS."
      (interactive)
      (one-key-menu "TOOLS" one-key-menu-tools-alist t))

通过按SPC t m打开mu4e。

可以更改one-key-menu-tools中的tools为其他的内容,如buffers啥的。

话说可以去copy大神lazycat的配置啊,github上有,https://github.com/manateelazycat/lazycat-emacs/blob/master/site-lisp/config/init-one-key.el

相当于任意的一个 sub keymap 提到一个全局按键的位置?

one-key 和 meow的结合,真的特别好用啊,对于我这种不想同时按多个键的特别友善。

完美替代了Evil, General, hydra的配置。

new bee!!!

不是,one-key的原理:

1.可以把任意数量的命令弄成一个kv的列表

2.这个列表的启动菜单绑定一个快捷键

3.one-key根据命令列表生成一个帮助菜单,全局按键启动菜单后按单按键激活对应的命令

one-key解决的问题:

  1. 一组命令集(比如git命令)占用一个全局按键,这样数千各命令估计才用几十个按键

2.全局按键启动后,只用单键皆可进一步激活命令

3.想不起来按键时,按?按键弹出帮助菜单

相对于hydra的好处是根据命令列表自动生成菜单,不需要在注释里手动维护菜单。

我2008年写了one-key后就没管他了,因为很多人理解不了,其实原理很简单,理解的自然觉得好用。

1 个赞

我觉得hydra其实没有one-key好用,还需要手动写注释生成菜单,按键改了还要改注释,麻烦。

evil我一直没用,所以体会不到meow的好,哈哈哈哈。

那和手写个普通的 keymap,然后借助 which-key 来提示相比呢?

one-key和keymap没关系,你可以随意组合,keymap受到模式的限制。

one-key的目的就是名字意思:一系列全局命令只占用一个全局快捷键

你不用记所有快捷键,你只用给一组命令几一个快捷键,剩下的单按键靠肌肉记忆。

最开始创建的初衷是,几百个插件的命令导致全局快捷键不够用,互相打架,我写one-key后把全局快捷键的数量降低到原来的1/100,解救我记忆力不好的问题。

谢谢分享。以前只用过Hydra,不知道那么早就有One-key了,懒猫的理念是很先进,就是缺乏宣传了。不过Hydra在界面显示和那种连续模式按键的时候还是有一些进步的。

这两种方法都很好,但是这两个方式都需要重新维护一套自己的分类按键组。我现在考虑的是Meow模式下,就我个人理解的使用理念就是比较少的做键绑定,尽量使用包自己键。

Emacs一般同一个包维护键绑定都会放在同一个前缀后面,问题是这个前缀键可能比较难按,或者不太好记忆。而主触发键的使用一般含义比较明确,容易理解和记忆,所以保留包命令的主按键绑定,仅只变更前缀按键方式以解决帮助记忆、减少手疼等原因就算是用较少的工作得到较好的效果。

所以比如我使用了tab-bar包,它的相关的键都绑定在Ctrl-x t 前缀下,而我不想按那么长的前缀,就希望把Ctrl-x t 绑定 到SPC-t 上,最好狗哥能提供类似kbd-macro string 的方式,我就只需要一个绑定就理想了。比如:

(meow-leader-define-key
   '("t" . "C-x t")) ;绑定前缀

这样即可以不用再重新维护一个 tab-bar的菜单或者keymap就可以快捷地易理解的操作;又可以继续在Insert模式下使用Emacs包的默认绑定。而且也不会产生两种方式下的可操作内容不一致,即使有其他的包按键绑定在Ctrl-x t 前缀下也不影响使用。