drcxd
2022 年8 月 14 日 06:29
1
最近使用了 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 + 两次按钮就调用到功能。
drcxd
2022 年8 月 15 日 06:25
4
我的意思是,能不能不用写额外的配置,就把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)
drcxd
2022 年8 月 15 日 06:48
7
我现在有的就是这种方法,但这等于是增加了一个全局按键的配置,和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?
drcxd:
顺便问一下怎么发elisp格式化的代码片段?
drcxd
2022 年8 月 15 日 07:17
9
同样的内容我发出来就是这样的:
(global-set-key (kbd "C-c ll") 'lsp)
(define-key lsp-command-map (kbd "l") 'lsp)
这个高亮好像是不太稳定,你可以问问管理员。
为什么 minor mode 和全局要一样?
我不太明白你到底想要什么效果。我上面那几行就可以实现你说的 SPC ll 和 SPC lR , 同时也绑了 lsp minor mode 的按键到 SPC l
, 你是觉得哪里不对?
drcxd
2022 年8 月 15 日 11:28
11
假设我没有使用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
”
但是,目前我提到的问题,如果想要同时达到:
较短的按键序列 (不要 SPC c SPC lr
)
概念上统一的命令有统一的按键前缀
不污染全局按键表
没有针对 Meow 的特别设置 (3和4其实是同时被遵守或违背的)
我没有看到解决方法。按你的方法,引入一个新的全局按键,再自己定制一个表确实可以解决1和2,但是就违背了3和4,同时也和 Meow 作者提出的理念有分歧。
这可以用 leader, 放到 C-c l 就行了
drcxd
2022 年8 月 15 日 12:03
13
假如你的设置是,为了让 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
的绑定。