一些关于General与key-chord的疑问

最近又再次尝试攒自己的配置,但是在General和key-chord方面遇到一些小问题,请高手指教

  1. 由于之前使用的是doom emacs,不少与leader-key相关的配置想要直接抄过来,不过就是在这个问题上犯了难。

我想要模仿SPC h对应的帮助菜单,在doom当中的实现方法是这样的:

  • (defalias 'define-key! #'general-def) 我理解为define-key!事实上就是在调用general-def
  • 重新定义help-map
(define-key! help-map
  ;; new keybinds
  "'"    #'describe-char
  "u"    #'doom/help-autodefs
  "E"    #'doom/sandbox
  "M"    #'doom/describe-active-minor-mode
......
)
  • 最后把新的help-map绑定到SPC h键位上
(map! :leader
      :desc "help"                  "h"    help-map

上面的操作我大概能够理解,但是我自己模仿的时候却出了问题,下面是我的做法

  • 定义我的leader-key
(general-create-definer w1/leader-key1
:keymaps '(normal insert visual emacs)
:prefix "SPC"
:global-prefix "C-,")
  • 接着把help-map绑定到SPC-h
(w1/leader-key1
"h" '(help-map :which-key "Help"))

这么做之后,得到的结果却是,当我使用SPC h之后,跳出错误Wrong type argument: commandp, help-map

正确的做法应该是什么?另外我不太能理解help-map究竟是一个什么东西,与evil-window-map类似,help-map是一个variable,但是当我使用

(w1/leader-key1
"w" '(evil-window-map :which-key "Window"))

的时候,却是成功的,为什么会有这样的现象?然后doom这么做为啥就行了?


  1. 另一个问题则有关于generalkey-chord,我想把jk设置为从insert退出到normal的按键,在general的主页上有相关代码:
(general-define-key :keymaps 'evil-insert-state-map
                    (general-chord "jk") 'evil-normal-state)

不过按照general的说法,general-defgeneral-define-key的wrapper,并且推荐直接使用general-def。然而无论我使用

(general-def 'insert
                    (general-chord "jk") 'evil-normal-state)

还是

(general-def evil-insert-state-map
                    (general-chord "jk") 'evil-normal-state)

都不能成功绑定,这是什么原因呢?

问题有点多,排版可能有些乱,见谅!

help-map 是个变量,之所以 evil-window-map 可以正常使用是因为它在 evil 中定义时用了 define-prefix-command (里面用了 fset),即它是一个函数。

如果仅仅是想用的话,可以把 help-map 替换成 help-command,它也是通过 (fset 'help-command help-map) 定义来的。

或者把 '(help-map :which-key "Help") 换成

`(,help-map :which-key "Help")

第 2 问不清楚,非 key-chord 用户。

感谢,涨知识了,原来evil-window-map既是个变量也是个函数,第一次接触到fset,果然elisp像魔术。

general.el里面用key-chord要用general-key-dispatch

(general-imap "j"    ;; 换成general-def,general-define-key都行
              (general-key-dispatch 'self-insert-command
                "k" 'evil-normal-state))