如何在Emacs中为自定义次要模式创建键绑定

如何在Emacs中为自定义次要模式创建键绑定,emacs,keyboard-shortcuts,elisp,minor-mode,Emacs,Keyboard Shortcuts,Elisp,Minor Mode,问题: 如何为次要模式创建自定义键绑定 这是我到目前为止所拥有的。我正在尝试只使用一个自定义键绑定: (define-minor-mode num-mode "Toggle the Num pad keys. With no argument, this command toggles the mode. Non-null prefix argument turns on the mode. Null prefix argument turns off

问题:

如何为次要模式创建自定义键绑定

这是我到目前为止所拥有的。我正在尝试只使用一个自定义键绑定:

(define-minor-mode num-mode
       "Toggle the Num pad keys.
     With no argument, this command toggles the mode.
     Non-null prefix argument turns on the mode.
     Null prefix argument turns off the mode.

     When Num mode is enabled, the num pad inserts the
     keys you see on the pad. This may over ried existing
     definitions, and is probably only usefule if you aref
     running Emacs through a terminal."
      ;; The initial value.
      nil
      ;; The indicator for the mode line.
      " NumPad"
      ;; The minor mode bindings.
      ;; This doesn't work right now!!!!
       '(((kbd "<kp-1>") . "a"))
      :global 1
)
(定义次要模式num mode
“切换数字键盘键。
在没有参数的情况下,此命令切换模式。
非空前缀参数打开模式。
空前缀参数关闭模式。
启用Num模式时,Num pad将插入
你在键盘上看到的按键。这可能会覆盖现有的按键
定义,并且可能只有在您
通过终端运行Emacs。”
初始值。
无
;模式行的指示器。
“努帕德”
次要模式绑定。
现在不行!!!!
"(((kbd)"a")
:全球1
)
当我在调用我的自定义次要模式“num mode”并验证它在迷你缓冲区中处于打开状态后,在num pad上点击“1”时,我得到错误
未定义
。我想做的是,当我点击
时,指针所在的位置会打印出一个
。(只是一个测试)

上下文:

因此,我通常使用num pad在缓冲区之间移动(箭头键将我移动到适当的方向)。这是全局设置的。我想创建一个次要模式,当我想使用我的数字键盘简单地输入数字时,我可以调用它

默认情况下,“我的数字键盘”上的键未定义。我使用
来定义numpad键的键绑定

我可以创建一个可以调用的次要模式,但不能附加任何键绑定。这适用于所有键绑定,包括未在其他任何地方定义的键绑定


谢谢你的帮助

在次要模式定义中需要这样的代码:

(defvar your-mode-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map parent-mode-shared-map)
    (define-key map "\C-c\C-a" 'some-defun)
    (define-key map "\C-c\C-b" 'some-other-sexp)
    map)

(use-local-map your-mode-map)
您可以查看中提供的许多模式以供参考。

请查看以下内容(仅了解有关键绑定的信息):

发件人:

编写良好的主要模式将在最后运行hook。因此,可以使用钩子来定义键绑定。次要模态通常没有挂钩。在这种情况下,您可以首先调用“(要求è次要模式特征符号›)”,然后定义键绑定

此外,您还可以查看:


也许被接受的答案对你也有帮助。

简短的答案

问题线:

'(((kbd "<kp-1>") . "a"))
列表中强制计算宏的具体示例:

;; Custom Minor Mode
(define-minor-mode custom-mode
  "Doc description, yada yada yada."
  ;; The initial value - Set to 1 to enable by default
  nil
  ;; The indicator for the mode line.
  " CustomMode"
  ;; The minor mode keymap
  `(
    (,(kbd "C-c C-a") . some-command)
    (,(kbd "C-c C-b") . other-command)
    ("\C-c\C-c" . "This works too")
   )
   ;; Make mode global rather than buffer local
   :global 1
)
另一种方法是,如果希望为keymap使用变量,则在次要模式声明之前定义keymap变量和keymap,如下所示:

(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)
然后,在次要模式定义中,简单列出键映射的变量名,而不是列表

(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
;; Num pad enable
(define-minor-mode custom-mode
...

      ;; The minor mode bindings.
      custom-mode-keymap
这一切是如何运作的

从上到下,在定义次要模式之后,我们定义了一个命令名来切换次要模式<代码>自定义模式
在这种情况下(
M-x自定义模式
切换模式)。这也定义了一个同名的变量

在命令名之后,我们在引号中列出次要模式的文档字符串。这几乎可以是你想要的时间

接下来我们有几个选择。最简单的选择是简单地列出三件事,然后列出任何附加选项。这三件事必须按以下顺序列出。这三件事是:

  • 次要模式变量的初始化值<默认情况下,代码>无将关闭模式。默认情况下,除
    nil
    之外的其他内容将启用它

  • 打火机。打火机只是当您的次要模式打开时,底部模式行中显示的内容。这应该很短,而且在格式方面,用空格开头通常会有帮助

  • 钥匙图。键映射可以定义为变量或列表(关联列表)。由于使用更简单、更短,所以我在示例中使用了这一点。列表的格式应为
    (key sequence.definition)

  • 如果您将keymap定义为一个列表,那么有几件事需要注意,特别是当您习惯于定义全局键绑定时。首先,命令名不被引用。其次,如果要使用宏,必须()。这是通过后引号(不是单引号)和逗号的组合来完成的。您可以在kbd宏的示例中看到这是如何实现的。如果不使用kbd宏,我还提供了一个击键定义。如果您只是在keymap中引用一个字符串,那么当按下定义的键组合时,该字符串将打印出来(就像定义全局键绑定一样)

    如果不强制使用后引号和逗号组合对kbd宏求值,则键映射将不适用于kbd宏。如下所示:

    `((,(kbd "C-c C-a") . some-command))
    

    最后,您可以使用
    :blah
    格式的关键字args添加其他选项。在示例中,我使用了
    :global
    。我们本可以用关键字args定义整个模式,但只按正确的顺序列出init值、lighter和keymap要短一些。

    感谢上一个答案的最后一个链接给了我所需的提示。我尝试使用如下格式:在示例中。如果您可以显示该格式的完整定义,那就太好了。clojure-mode使用此样式来设置本地键绑定-请在此处查看其源代码-嗯。。。是的,我想所有这些例子都使用了不同的格式。我正在尝试使用更紧凑的格式,其中keymap只是在define minor模式中的列表中列出。我无法使kbd宏在列表中工作。
    (define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
    ;; Num pad enable
    (define-minor-mode custom-mode
    ...
    
          ;; The minor mode bindings.
          custom-mode-keymap
    
    `((,(kbd "C-c C-a") . some-command))