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")

但不幸的是,这似乎完全没有效果;像任何其他普通缓冲区一样简单地编辑缓冲区。如果不是这样,我如何实现单键键绑定?(顺便说一句,我敢肯定。这里肯定发生了其他事情。)

4

3 回答 3

5

您想定义stack-network-modeusing define-derived-mode(并使其派生自special-mode,例如)。

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

  • 使用()而不是nil空参数列表。
  • stack-network-next-site 需要(interactive)紧跟在文档字符串之后才能使其成为交互式命令,否则它将无法用作键绑定。

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

于 2013-02-28T01:50:39.783 回答
3

将定义移到stack-network-mode-map模式定义之前。否则define-derived-mode隐式定义了这个变量,并且defvar不改变非 nil 变量的值,所以 map 实际上是空的。

请参阅派生模式

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

于 2013-03-01T16:26:22.230 回答
0

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

(use-local-map stack-network-mode-map)
于 2013-02-28T00:52:57.930 回答