13

问题:

如何为次要模式创建自定义键绑定?像这样的东西。

这是我到目前为止所拥有的。我试图让一个自定义键绑定工作:

(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”并验证它在迷你缓冲区中打开后在数字键盘上点击“1”时,我收到错误消息<kp-1> is undefined。我想要发生a的是在我点击时打印出指针所在的位置<kp-1>。(只是一个测试)

语境:

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

默认情况下,我的数字键盘上的键是未定义的。我<kp-0>用来<kp-9>定义数字键盘键的键绑定。

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

谢谢你的帮助!

4

3 回答 3

21

简答

问题线:

'(((kbd "<kp-1>") . "a"))

解决方案(强制评估宏):

;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))

长答案

define-minor-mode宏允许您相对容易地创建次要模式(就 Emacs 而言)。

首先我将展示它是如何完成的,然后我将解释它是如何工作的:

一般形式:

(define-minor-mode NAME-mode
  "DOCUMENTATION"
  INIT-VALUE
  "LIGHTER"
  ;; keymap
  '(
    (KEY-SEQUENCE . DEFINITION)
    (KEY-SEQUENCE . DEFINITION)
    ... ETC ...
   )
  ;; other options
  :KEYWORD-ARG VALUE
  :KEYWORD-ARG VALUE
  ... ETC ...       
)

在 alist 中强制评估宏的具体示例:

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

另一种方法是,如果您希望为键映射使用变量,则在次要模式声明之前定义键映射变量和键映射,如下所示:

(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)

然后,在您的次要模式定义中,简单列出您的键盘映射的变量名称,而不是 alist

(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

这一切是如何运作的

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

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

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

  1. 次要模式变量的初始化值。nil默认情况下将关闭该模式。nil除了默认情况下会启用它之外的其他东西。

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

  3. 键盘映射。键映射可以定义为变量或 alist(关联列表)。由于使用alist更简单更短,这就是我在示例中使用的。alist 的格式应为(key-sequence . definition).

如果您将键映射定义为 alist,则需要注意一些事项,尤其是如果您习惯于定义全局键绑定。首先,命令名称不被引用。其次,如果您想使用宏,则必须强制它进行评估( and on SO )。这是通过反引号(不是单引号)和逗号的组合来完成的。您可以在示例中使用 kbd 宏看到这是如何完成的。如果您不使用 kbd 宏,我还包括了击键定义。如果您只是在键盘映射中引用一个字符串,则在按下定义的组合键时会打印出来(就像定义全局键绑定一样)。

如果您不使用反引号和逗号的组合强制评估 kbd 宏,则键盘映射将无法与 kbd 宏一起使用。像这样:

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

最后,您可以使用 形式的关键字参数添加其他选项:blah。在我使用的示例中:global。我们本可以使用关键字参数定义整个模式,但仅以正确的顺序列出初始值、轻量级和键映射会更短。

于 2010-06-25T07:52:22.447 回答
3

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

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

您可以查看EmacsWiki中提供的许多模式以供参考。

于 2010-06-25T05:40:52.143 回答
2

Have a look at this (just for information about keybindings):

http://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Bindings.html#Key-Bindings

http://www.gnu.org/software/emacs/manual/html_node/emacs/Local-Keymaps.html#Local-Keymaps

From http://xahlee.org/emacs/reclaim_keybindings.html:

Well written major modes will run hook at the end. So, you can use a hook to define your keybinding. Minor modes usually do not have hooks. In that case, you can call “(require ‹minor mode feature symbol›)” first, then define your keybinding.

Also you might have a look at: http://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#SEC347

Maybe the accepted answer here also helps you.

于 2010-06-25T06:08:04.503 回答