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

刚刚给 GitHub - manateelazycat/one-key: Many commands share one key. 写了一个 one-key-create-menu 的宏。

你上面的代码可以写成下面的简化格式:

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

    (one-key-create-menu
      "TOOLS"
      '(
        (("m" . "Mail") . mu4e)
        (("s" . "Shell") . vterm)
        (("t" . "Treemacs") . treemacs)
        (("r" . "Restart") . restart-emacs))
       t)
1 个赞

添加了个新的 feature,现在你可以这样做了。

C-x t 之后会通过 KEYPAD 来执行后续的内容。如果不想用 KEYPAD 而是用默认执行方式(C- 依然要按 control)的话,可以

(setq meow-use-keypad-when-execute-kbd nil)

我的用法是这样的,先构造了一组 magit 的按键绑定。

(global-unset-key (kbd "C-x g"))
(global-set-key (kbd "C-x g s") 'magit-status)
(global-set-key (kbd "C-x g b") 'magit-blame)
(global-set-key (kbd "C-x g l") 'magit-log)
(global-set-key (kbd "C-x g d") 'magit-diff)

然后把其中的公共部分绑定到 leader

(meow-leader-define-key '("v" . "C-x g"))

耶,狗哥太棒了,正是我想要的东东 :+1: :+1: :+1:

这样就可以简单的按Emacs方式正常绑按键,最后在Meow中进行快捷映射就可以了。以后不管包维护者增加或变更了新的命令,还是在特定Mode里增加特定的按键都不需要调整,直接适应,原有的Emacs操作特性可以完整保留。。。

狗哥辛苦了,太谢谢了 :smiley: :+1:

1 个赞

通过global-set-key重新绑定了按键,随便作者怎么改,当然是不用管原来包设定的什么按键啊。

这个生产力。。。 :+1:

学习了你的用submodule管理配置文件。目前的配置能用,那就一直不用改了。 :grin:

他的意思并不是用 global-set-key 绑定,而是说对于比较长的默认的按键序列,怎么缩短。比如原本是 C-x t … 的按键,现在让 SPC t 等于这个,后续的按键都不用处理。

这个可能我表达的不够清楚,理解上有点分岐。我的本意是甚至不用global-set-key再重新绑定按键,就用原来包的原始绑定,当然有些包默认没有绑,那还是要自己绑定的。但是这样也有保持操作一致性的好处。

比如 在doom 里Ctrl-c t 下面绑定了些toggle 命令,如果你在init文件中启用不同的feature 这个下面的命令数量会变化,甚至在不同的MODE里也会变化。如果用自定义菜单或者keymap,那就必须对这些变化做更改,不然假如我把 SPC-t 绑定为这个前缀,那么按 SPC-tCtrl-c t出现的命令是不一致的,操作时思想就会考虑究按哪个。meow本身好像也不支持不同mode下的绑定吧,而且用one-key维护不同mode下的自定义菜单也是一笔负担。而现在完全不用考虑这些,继续在需要的时候按emacs绑定就可以了。

可能还是表达不清楚,对我而言最直接的影响是,如果你也使用Doom的话,仅仅只需要把:EDITOR 下的Evil 特性去掉,增加Meow的基本配置,添加几行代码:

(meow-leader-define-key
 (cons "v"  (concat doom-leader-alt-key " g"))
 (cons "p"  (concat doom-leader-alt-key " p"))
 (cons "f"  (concat doom-leader-alt-key " f"))
 (cons "s"  (concat doom-leader-alt-key " s"))
 (cons "o"  (concat doom-leader-alt-key " o"))
 (cons "b"  (concat doom-leader-alt-key " b"))
 (cons "w"  (concat doom-leader-alt-key " w"))
 (cons "q"  (concat doom-leader-alt-key " q"))
 )

就实现了从Evil模式到Meow的无痛转换,对我而言几乎同时拥有了Emacs和Evil的好处,却几乎没有对Emacs有什么损失(当然现在用的还不多,肯定会有些BUG会出现的),就像以前用Evil感觉是Emacs+VIM=1.3Emacs,现在用Emacs+Meow=1.6Emacs(仅指按键效率部分)

相对于以前的使用Evil,我更多的感觉到逻辑清晰,以前操作时经常要从Normal模式到Insert模式转变的时候停顿考虑使用哪个模式的键,因为不同模式的键绑定变化很大。现在流畅多了,能按哪个就按哪个,理解上就只是前缀键不同,多了normal 模式下的快捷键而已,而Emacs模式下的键可以完全的继续使用。

2 个赞

感觉是个比较可行的和 Doom Emacs 做集成的方案,看起来成本相对低。

如果有一些测试的反馈,确认可行性的话,也许给 Doom 加个 Meow 的支持也能被接受?

我就是觉得Meow的切换成本低,希望有人给Doom加个Meow的module,那么Doom用户改个特性就可以轻松的选择Evil 或Meow了。

Doom对PR还比较欢迎的,我刚开始提过两个简单的PR很容易就合并了。我也想做个PR增加Meow支持,不过我才用这个还不怎么熟悉,可能有些地方都还没有理解,虽然目前集成的代码少,我在本地库中的逻辑也都有了,但关键是这个PR要准备Module的文档,我一般提PR就两句话的水平,超过这长度估计我得用拼音 :face_with_hand_over_mouth:

感觉自己是骑着牛找牛。一直在找可以不使用KEYPAD按默认方式绑定前缀KEYMAP的方式,其实狗哥在这里已经实现了。 :sweat_smile:可能是因为狗哥说的太轻描淡写了,文档里也没有说,而我也没有看代码,这里又有个小坑,所以一直以为没有这功能,昨天还网上找了些代码做替换,其实Meow中已经完美完成了。

先说下小坑:在用(setq meow-use-keypad-when-execute-kbd nil) 后 使用meow绑定前缀键的时候(meow-leader-define-key '("v" . "C-c v")) ,代码中是用set-transient-map来完成的,而我当时不确定狗哥是否实现该功能时,试了下这种绑定和操作,结果是没有反应,which-key 也不显示,我直觉以为没有实现,也就没有再试,特别是后面沟通的时候感觉自己停留在自以为的环境里。其实这里已经实现了,只是这里小坑就是 which-key 的默认设置不显示transient-map,所以这时候which-key没有显示,对一直启用which-key的人感觉就像没有反应一样。(还是要看代码呀 :joy:

所以在调整了下which-key的设置后,终于完美适应了。

(setq which-key-show-transient-maps t)
(setq meow-use-keypad-when-execute-kbd nil)

(meow-leader-define-key
 '("x" . "C-x")
 '("h" . "C-h")
 (cons "v"  (concat doom-leader-alt-key " v"))
 (cons "p"  (concat doom-leader-alt-key " p"))
 (cons "f"  (concat doom-leader-alt-key " f"))
 (cons "s"  (concat doom-leader-alt-key " s"))
 (cons "o"  (concat doom-leader-alt-key " o"))
 (cons "b"  (concat doom-leader-alt-key " b"))
 (cons "w"  (concat doom-leader-alt-key " w"))
 (cons "q"  (concat doom-leader-alt-key " q"))
 (cons "n"  (concat doom-leader-alt-key " n"))
 (cons "t"  (concat doom-leader-alt-key " t"))
 (cons "t"  (concat doom-leader-alt-key " t"))
)
3 个赞

也许未来你可以给 meow 一个 PR,实现一个更好的 KEYPAD 模式。。 :smiley:

这倒不会,并不是KEYPAD不好,对喜欢KEYPAD模式的人来说那是很大的效率提升,只是我有了以前的习惯,在效率和习惯之间我选择了习惯。而且你的实现已经提供了自由的选择呀,只是Which-key的一个小设置我没注意,是我的问题。

再次感谢狗哥的辛劳,现在使用感觉很不错 :+1: :grinning:

我尽量用右手按右边的 Ctrl 和 Alt 。虽然速度有点慢,但左手手腕压力小多了。 :smiley:

有一个很实用的功能不知道怎么实现,就是再跳转代码之后返回起跳前的位置,经常追的很深入然后不方便回来。vim里有个ctrl o效果挺好,现在看代码有时还得用evil来做这个。其他确实不错,选中便捷,按键不冲突方便的,不用频繁ctrl z了,确实挺轻量而且融入emacs很好,

还有一个问题,pyim和meow如今有没有实现比较好的兼容模式呀,比如自动切换输入探针(刚翻了一下meow代码,meow已经有很好的实现了,赞)或者拼音搜索之类的

是指 M-. 的跳转还是任意的?

M-. 的跳转是可以用 M-, 回来的,可以多次。

学到了,我试了试M-.和M-, doom 里面有封装lookup对应的函数,用的better-jump.el,可能行为很类似,我没有进一步解耦这个包做测试。M-.跳转到定义,M-,跳转到之前的返回,还有个M-?跳转到引用,已经能满足使用了

其实就是多文件的起始mark跳转,不一定是用的M-.,有时切换到多个文件,然后一键回到先前的一系列文件的位置

并没有使用 better-jump 里面的那些功能,或许可以和 better-jump 配合起来用。如果是单单的一个到任意地方的回退,可以用 meow-grab,这个命令会记住当前位置或当前选择,之后 meow-pop 的默认的 fallback 行为 meow-pop-grab 会让光标回到之前的位置或是恢复之前的选择。

如果我们在跳转命令上做些处理或借用 better-jump 的话,是可以做到和 evil 里面的 C-o 一样的。我个人更想接助一些 emacs 自带的东西来实现这个功能,比较直接的想法是利用 emacs 的 mark 功能。但是现在只要有选择就会有 mark,除非我们把移动时的选择换成绘制的假的选择,那样 mark 这个概念就可以复用了。我个人倾向于让 emacs 中的每个概念都是原本的概念。

2 个赞

关于跳转的问题,better-jumper.el看起来是维护了一个jump context list,然后可以在这条线上jump-forward和jump-backward,在一大堆源码中移动和阅读确实很方便。 我很认同meow的设计理念,更改一些基本概念会引发后续的大量问题,而且我也赞同尽可能使用emacs已有方案的做法,因此从evil转到设计更native也更稳定的meow,不用担心太多的抽象问题