没有太能理解问题,举个具体一点的例子?
就是我在Ctrl-c b 后面绑了许多命令,它作为前缀,如Ctrlc-c b a
、Ctrlc-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解决的问题:
- 一组命令集(比如git命令)占用一个全局按键,这样数千各命令估计才用几十个按键
2.全局按键启动后,只用单键皆可进一步激活命令
3.想不起来按键时,按?按键弹出帮助菜单
相对于hydra的好处是根据命令列表自动生成菜单,不需要在注释里手动维护菜单。
我2008年写了one-key后就没管他了,因为很多人理解不了,其实原理很简单,理解的自然觉得好用。
我觉得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
前缀下也不影响使用。