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

时间:2013-02-27 23:47:06

标签: emacs elisp key-bindings major-mode

我正处于创建major mode for 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")

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

3 个答案:

答案 0 :(得分:5)

您希望使用stack-network-mode定义define-derived-mode(并使其从special-mode派生而来)。

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

  • 使用()而不是nil作为空参数列表。
  • stack-network-next-site需要在docstring之后立即(interactive)使其成为交互式命令,否则它将无法用作键绑定。

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

答案 1 :(得分:2)

在模式定义之前移动stack-network-mode-map的定义。否则define-derived-mode隐式定义此变量,defvar不会更改非零变量的值,因此实际上地图将为空。

请参阅Derived Modes

  

新模式有自己的稀疏键映射,名为variant -mapdefine-derived-mode使父模式的键映射成为新映射的父级,除非已设置变量-map且已有父级。

答案 2 :(得分:0)

您已经定义了一个键盘映射但尚未使用它。变量存在但不捕获任何关键事件。

(use-local-map stack-network-mode-map)