如何让 Meow KEYPAD 能够快捷使用 minor mode map 中的按键?

最近使用了 Meow,挺喜欢它的设计思路,但是发现一个问题,就是它的KEYPAD只对全局绑定的按键有快捷方式。

例如:

(global-set-key (kbd "C-c ll") 'lsp) ;; press SPC ll to invoke
(define-key lsp-mode-map (kbd "C-c lr") 'lsp-workspace-restart)
;; SPC lr does not work, have to press SPC c SPC lr or directly C-c lr

这就让在 minor mode map 里面定义快捷键很不方便,有没有解决的办法?

另外,使用 Meow 的话,是不是要尽量回避定义 C-c x/h/g/m/c 前缀的按键呢?如果不是的话,如何通过 KEYPAD 快速使用这些按键呢?

如果有使用 meow 的用户的话,请分享一下你们的配置或者思路吧?

(global-set-key (kbd "C-c l") lsp-mode-map)
(define-key lsp-mode-map (kbd "r") 'lsp-workspace-restart)

eg.

我是使用meow加hydra来实现多级按键绑定的。 一般leader key + 两次按钮就调用到功能。

我的意思是,能不能不用写额外的配置,就把minor mode map里面的快捷键 像 全局快捷键 一样 暴露 到 KEYPAD 里面。

我例子的意思是,如果我只写一行 (global-set-key (kbd "C-c ll") 'lsp) 那么通过使用KEYPAD,可以用 SPC ll使用这个命令。 类似地,能否在只写一行 (define-key lsp-mod-map (kbd "C-c lr") 'lsp-workspace-restart) 的情况下,在 lsp-mode 加载后,通过使用 KEYPAD, 用 SPC lr 使用这个命令。

(define-key mode-specific-map (kbd "l") lsp-command-map)
(define-key lsp-command-map (kbd "l") 'lsp)
(define-key lsp-command-map (kbd "R") 'lsp-workspace-restart)

我现在有的就是这种方法,但这等于是增加了一个全局按键的配置,和Meow暴露全局按键的方式不一样,你写全局按键的配置

(global-define-key (kbd "C-c ll") 'lsp)

不用再写额外配置,直接 SPC ll 就可以使用。 但是写特定模式下的按键配置

(define-key lsp-mode-map (kbd "C-c lr") 'lsp-workspace-restart)

就不能直接SPC lr使用。

我想知道的是,为什么minor mode和全局不同? 顺便问一下怎么发elisp格式化的代码片段?

global-set-key 有什么特别的好处? 这不是一样在全局绑定了 C-c l?

2022-08-15_14-54

同样的内容我发出来就是这样的:

(global-set-key (kbd "C-c ll") 'lsp)
(define-key lsp-command-map (kbd "l") 'lsp)

这个高亮好像是不太稳定,你可以问问管理员。

为什么 minor mode 和全局要一样?

我不太明白你到底想要什么效果。我上面那几行就可以实现你说的 SPC llSPC lR, 同时也绑了 lsp minor mode 的按键到 SPC l , 你是觉得哪里不对?

假设我没有使用Meow,然后我lsp的按键配置是

(global-set-key (kbd "C-c ll") 'lsp)
(define-key lsp-mode-map (kbd "C-c lr") 'lsp-restart-workspace)

我可以通过C-c ll 或者 C-c lr去使用这两个命令,概念上他们都属于lsp相关的命令,按键上都通过C-c l前缀去访问,实现上一个在global map用于激活lsp模式,一个在lsp-mode-map不会在我使用其他模式时污染按键表,我还可以在其他模式的 minor mode map 里面绑定 C-c l 前缀的快捷键去别的功能。

现在,我开始使用Meow,并且只做了最少限度的配置:

;; qwerty layout configurations
(require 'meow)
(meow-setup)
(meow-global-mode 1)

没有额外针对 Meow 特别定制配置。

现在,我可以用 SPC ll 使用 lsp 命令,但是即使在激活了 lsp-mode 后,我想要使用 lsp-restart-workspace,我不能用 SPC lr,需要用SPC c SPC lr (按键序列太长),或者还是使用 C-c lr(按键上不统一)。

我看到作者对Meow的设想是这样的 add mode and meow state specific keymaps by turbana · Pull Request #126 · meow-edit/meow (github.com) :“

That is:

  • meow must not be invasive
  • meow’s configuration can be and should be limited in a single .el file, just like other packages
  • remove meow from your configuration should be as simple as deleting a single file

Additionally, these cases are what I’m trying to avoid:

  • configure meow for every major/minor modes
  • removing meow = giving up the effort you spend to organize your keybinding
  • introducing meow = rebuilding your keybind system

但是,目前我提到的问题,如果想要同时达到:

  1. 较短的按键序列 (不要 SPC c SPC lr)
  2. 概念上统一的命令有统一的按键前缀
  3. 不污染全局按键表
  4. 没有针对 Meow 的特别设置 (3和4其实是同时被遵守或违背的)

我没有看到解决方法。按你的方法,引入一个新的全局按键,再自己定制一个表确实可以解决1和2,但是就违背了3和4,同时也和 Meow 作者提出的理念有分歧。

这可以用 leader, 放到 C-c l 就行了

也许你愿意读一读我在 如何让 Meow KEYPAD 能够快捷使用 minor mode map 中的按键? - #11,来自 drcxd 里面写的内容?

假如你的设置是,为了让 SPC l 可以直接用

C-c l l -> lsp
C-c l -> lsp-map

我想你缺少的是这么一个设置,

(setq meow-keypad-leader-dispatch "C-c")

如果你在 global-map 中,去覆盖一个子 keymap 中的一个位置,会形成一个比较复杂的 keymap 结构。meow 默认的行为是以 mode-specific-map 做为 leader 的 keymap 来寻找对应的命令。在这种情况下,只能通过按键去找。

至于 SPC c l 不能用的情况,我也不是很清楚,除非是有 C-c C-l 的绑定。