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

6
我正在创建一个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")

但不幸的是,这似乎完全没有效果;缓冲区就像任何其他正常的缓冲区一样被编辑。如果这不是方法,我怎样才能实现单键绑定呢?(顺便说一句,我确定这就是方法。这里肯定还有其他问题。)


需要更多细节... 我加载了你提到的包,它运行得很好。 所有主要模式绑定都可用(尽管未定义)。 - Trey Jackson
不要使用 defun 来定义主模式。请使用 define-derived-mode,它会为您处理所有样板文件,包括清除本地变量、切换键映射、设置主模式变量、运行钩子等。 - user355252
3个回答

4
你想使用define-derived-mode来定义stack-network-mode(例如,使其派生自special-mode)。
有关您的代码的其他注释:
  • 对于空参数列表,请使用()而不是nil
  • stack-network-next-site需要在文档字符串后面立即添加(interactive)以使其成为交互式命令,否则它将无法作为键绑定工作。
如果您不想使用special-mode,可以在创建make-keymap后立即调用supress-keymap

这确实防止了缓冲区编辑(我想要感谢 special-mode),但是键仍然没有绑定 :( (另外,据我所知, () === nil。) - Sean Allred
如果您想查看代码的当前状态,可以在此处查看(https://github.com/vermiculus/stack-mode/blob/71fb0081400bf71abf226fc6cb9e0382e2b7009a/elisp/stack-network-mode.el)(链接到特定提交以保留将来参考的用途)。 - Sean Allred
@vermiculus () === nil成立,但惯例是在空参数列表中使用(). 在这个位置使用nil会让大多数Emacs Lisp程序员感到不安。 - user355252
3
stack-network-mode-map的定义放在define-derived-mode表达式之前。否则,define-derived-mode会隐式地使用新创建的按键映射定义stack-network-mode-map。然而,defvar不会改变已经设置的变量的值。 - user355252
@lunaryorn 这是公平的。这同样是解决方案的一部分 - 我不会轻易地将 defvar 有点傻和 define-derived-mode 有行为联系在一起。从本质上讲,点赞是一种表达“感谢”的方式。 - Sean Allred
显示剩余5条评论

3
stack-network-mode-map的定义移到模式定义之前。否则,define-derived-mode隐式定义此变量,而defvar不会改变非nil变量的值,因此实际上该映射为空。
请参见派生模式
新模式具有自己的稀疏键位图,命名为variant-mapdefine-derived-mode使父模式的键位图成为新映射的父级,除非variant-map已经设置并且已经有一个父级。

0

你已经定义了一个按键映射,但是你没有使用它。这个变量存在,但是没有捕获任何按键事件。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接