Emacs键绑定无法在自定义主模式下工作

Sea*_*red 5 emacs elisp key-bindings major-mode

我正处于为Emacs创建主要模式以便浏览和与Stack Exchange网络交互的早期阶段.

参与其中的是几种主要模式,都具有类似的一键键绑定dired.我查看了源代码dired,并提取了我认为可行的内容:

(defvar stack-network-mode-map
  (let ((map (make-keymap)))
    (define-key map "n"     'stack-network-next-site)
    (define-key map "p"     'stack-network-previous-site)
    (define-key map ","     'stack-network-move-site-up)
    (define-key map "."     'stack-network-move-site-down)
    (define-key map "j"     'stack-network-jump-to-bookmarks)
    (define-key map "\C-m"  'stack-network-do-enter-site) ; ret
    (define-key map "o"     'stack-network-do-enter-site)
    (define-key map "u"     'stack-network-do-profile-summary)
    (define-key map "\C-uu" 'stack-network-do-profile-summary-for-user)
    (define-key map "i"     'stack-network-do-inbox)
    (define-key map "b"     'stack-network-toggle-bookmark)
    (define-key map "?"     'stack-network-list-functions) ; [1]
    (define-key map "\C-i"  'stack-network-display-details) ; tab
    map)
  "Keymap for Stack Exchange: Network Browser major mode")
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这似乎完全没有效果; 简单地编辑缓冲区就像任何其他普通缓冲区一样.如果不是这样,我怎样才能实现单键键绑定?(顺便说一下,我确定是这样的.这里还有其他事情发生.)

Ste*_*fan 5

您想要定义stack-network-mode使用define-derived-mode(special-mode例如,从中派生).

关于您的代码的其他评论:

  • 使用()而不是nil空参数列表.
  • stack-network-next-site需要(interactive)在docstring之后才能使它成为一个交互式命令,否则它将不能用作键绑定.

如果您不想使用special-mode,可以supress-keymap在创建后立即致电make-keymap.

  • 在`define-derived-mode`表单之前移动`stack-network-mode-map`*的定义.否则`define-derived-mode`使用新创建的键映射隐式定义`stack-network-mode-map`.但是,defvar`不会更改已设置的变量的值. (3认同)