创建mode时绑定的快捷键不能生效!

;;定义模
(define-derived-mode learnEn-mode org-mode "learn-En"
  "Major mode for learnEn.
\\{learnEn-mode-map}"
  (read-only-mode 1)
  (define-key learnEn-mode-map "q" 'quit-window))

这样的绑定快捷键~~ 在使用这个mode的时候没有生效 。注意~~ 我是根据org-mode生成的。而且我用的是spacemacs的配置。那么这种问题 有没有人遇到过帮忙解答。谢谢。(注释:我在进入这个mode后按键是我设置过的vim模式。)

如果你用的是 evil 的话应该用 evil-define-key 来定义快捷键

你好! (evil-define-key learnEn-mode-map "q" 'quit-window) 修改这个快捷键时失败报错 然后我换成了 (define-key evil-normal-state-map "q" 'quit-window) 结果所有的 org-mode都改变了按q就关闭 请问我该怎么办? 我只想让我定义的模式 有这个快捷键。 谢谢

evil-define-key 的定义是 (evil-define-key STATE KEYMAP KEY DEF &rest BINDINGS)。也就是说你应该用 (evil-define-key 'normal learnEn-mode-map "q" 'quit-window) 来定义快捷键。

可以按 C-h f 然后输入函数名来查看函数文档的(´・ω・`)

你好 我还是出现了 org模式中的 q 键 也变成了 ‘quit-window的问题

"(ºДº*) 不应该啊

话说你修改之后重启了没?可能之前的设置还在的

额 我试试再

(define-derived-mode learnEn-mode org-mode “learn-En” “Major mode for learnEn. \{learnEn-mode-map}” (read-only-mode 1) ;;(define-key learnEn-mode-map “q” 'quit-window) ;;(define-key evil-normal-state-map “q” 'quit-window) (evil-define-key 'normal learnEn-mode-map “q” 'quit-window)) 这是 我的代码 但是还是 都可以用q关掉啊~~ T_T!

看来 define-derived-mode 用的是原来的 keymap 啊_(:зゝ∠)_

也就是说你的 learnEn-modeorg-mode 现在是共享同一个keymap的(虽然符号不同),修改了一个会影响另一个。其实我也没用过 define-derived-mode _(:зゝ∠)_

那咋整啊?? 我想在里面org格式显示 还有自己的快捷键~~:joy:

试试 copy-keymap

define-derived-mode 应该可以自己指定 keymap 的值吧


EDIT: 这段代码应该是可用的:

(define-derived-mode learnEn-mode org-mode "learn-En"
  "Major mode for learnEn.
\\{learnEn-mode-map}"
  (read-only-mode 1))

(setq learnEn-mode-map (copy-keymap org-mode-map))
(evil-define-key 'normal learnEn-mode-map "q" 'quit-window)

把里面的代码移出来然后在外面覆盖keymap。还有文档的第二行开头应该用两个反斜杠的。

应该是被 evil-mode 覆盖了,M-x describe-key 查看是不是绑定到了 (evail-record-macro)

以下方式我测过是有效的:

(define-derived-mode learnEn-mode org-mode "learn-En"
  "Major mode for learnEn.
\{learnEn-mode-map}"
  (read-only-mode 1))

(evil-define-key 'normal learnEn-mode-map "q" 'quit-window)

\好像是被转义了~~ 源代码料卡里复制过去的

\\{ 在字符串里面是 \{ ,而 \{ 在字符串里是 {。只有写成 \\{learnEn-mode-map} 才能在文档里面显示 keymap 的内容的,你可以用 C-h f learnEn-mode RET 打开对应的文档看看。

顺便一问,快捷键问题解决了吗?

额 还没有 现在还是 要不就不生效 要不就是所有org-mode 都被绑定了 正在看文档~~~ 内心比较崩溃

使用define-key会提示被其他的模式给覆盖了。使用evil-define-key 这个q变成了怎么破?

什么情况_(:зゝ∠)_我在11楼的代码是测试过有效的啊。我再看看


在我的机器上确实是有效的,q键可以生效,也不会覆盖org-mode的按键。不过我在配置里面把 q 键设置成了别的功能,可能是两段代码的共同作用使它生效了。我另一段代码里是这么设置的:

(evil-global-set-key 'normal "q" #'evil-quick-sender)
(evil-global-set-key 'visual "q" #'evil-quick-sender)
(evil-global-set-key 'normal "Q" #'evil-record-macro)

默认 evil 的 evil-record-macro 是绑定在 evil-normal-state-map 里面的,我之前改用 evil-global-set-key 把按键覆盖了。虽然 evil-global-set-key 的源代码也是设置 evil-normal-state-map 的_(:зゝ∠)_

不知道在 11 楼代码的 evil-define-key 前面加一个 (evil-global-set-key 'normal "q" 'evil-record-macro) 行不行

啊 十一楼的代码 我报错是额~~~ 函数未定义~~~ 哥要不我给你我的github地址 你帮我交个MR过来吧:joy:

原来你是把代码写到 funcs.el 里了啊_(:зゝ∠)_

spacemacs 在加载funcs里的代码的时候 org 和 evil 都没有被加载,当然会未定义了。

这种情况的话就只能在文件里 require org 了,或者写一个启动这个 mode 的函数,在函数里面进行初始化(require org 和 定义快捷键),起到延迟加载 org 的功能。


EDIT: 我刚刚交了一个pr