Emacs的按键绑定没有定制主要模式

问题描述:

我在浏览创建major mode for Emacs,并与堆栈交换网络交互的早期阶段,我的工作。Emacs的按键绑定没有定制主要模式

在它涉及到几种主要模式,全部采用一键式按键绑定类似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") 

但不幸的是,这似乎完全没有影响;缓冲区就像任何其他正常缓冲区一样简单地编辑。如果这不是他们的方式,我怎么能实现单键键控绑定? (其中,顺便说一下,我敢肯定它是。必须有别的东西怎么回事。)

+0

需要更详细的....我打开你指的是包,它工作得很好。所有主要的模式绑定都可用(虽然未定义)。 – 2013-02-27 23:58:57

+0

不要用'defun'定义主要模式。使用'定义衍生-mode',负责处理所有的样板给你,包括杀害局部变量,切换键映射,设置主要模式乏,运行钩等 – lunaryorn 2013-02-28 00:47:53

你想使用define-derived-mode定义stack-network-mode(并使其从special-mode获得,例如)。

你的代码的其他意见:

  • 使用(),而不是nil空参数列表。
  • 栈网络下的网站需要有(interactive)文档字符串之后,使其成为一个交互式命令,否则它不会作为重点,结合工作。

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

+0

这确实防止缓冲区编辑(感谢'special- mode',我相信),但关键是还没有被绑定:((而且,据我所知,'()=== nil') – 2013-02-28 08:35:36

+0

如果你想看到的代码,因为它主张,这是[这里](https://github.com/vermiculus/stack-mode/blob/71fb0081400bf71abf226fc6cb9e0382e2b7009a/elisp/stack-network-mode.el)(具体提交链接保存以供将来参考使用) – 2013-02-28 08:38:15

+0

@vermiculus'()== = nil'成立,但它是约定使用'()'空参数列表。'nil'在这个地方看起来令人不安大多数的Emacs Lisp编程。 – lunaryorn 2013-02-28 11:54:13

您已经定义了一个键盘映射,但你还没有使用过。该变量存在但不捕获任何关键事件。

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

模式的定义之前移动的stack-network-mode-map定义。否则define-derived-mode隐式地定义这个变量,defvar不改变非空变量的值,所以在地图将是空的实际。

Derived Modes

新模式都有自己稀疏的键盘映射,名为变种-mapdefine-derived-mode使得父模式的键盘映射新地图的父母,除非变种-map已经设置,并且已经有一个父。