问题:

如何为次要模式创建自定义键订阅? 这样的东西.

这是我到目前为止所拥有的。我正在尝试获得一个自定义的钥匙来工作:

(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”并在Mini缓冲区中验证它后,我在NUM PAD上点击“ 1”时,我会得到错误 <kp-1> is undefined. 。我想发生的是 a 当我击中时指针在哪里打印 <kp-1>. 。 (只是一个测试)

语境:

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

默认情况下,我的数字上的键是未定义的。我用 <kp-0><kp-9> 为了定义NumPad键的键订阅。

我可以创建一个可以调用的次要模式,但是我不能附加任何键框。对于所有关键框架,包括其他任何地方都没有定义的关键框架都是如此。

谢谢你的帮助!

有帮助吗?

解决方案

简短的答案

问题线:

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

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

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

长答案

定义少模式 宏使您可以相对容易地创建次要模式(就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
)

另一种方法,如果您想为KeyMap使用变量,就是定义KeyMap变量和KeyMap 次要模式声明类似:

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

然后,在您的次要模式定义中,简单列出了keymap的变量名称,而不是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

一切如何工作

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

在命令名称之后,我们在引号中列出了次要模式的文档字符串。这几乎可以随心所欲。

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

  1. 次要模式变量的初始化值。 nil 默认情况下会关闭模式。除了 nil 默认情况下会打开它。

  2. 打火机。轻便的只是在您的小模式开启时在底部的模式线中显示的内容。这应该是简短的,并且在格式方面通常会有所帮助,以便从一个空间开始。

  3. keymap。 KEYMAP可以定义为变量或ALIST(关联列表)。自从使用 一个列表 更简单,更短,这就是我在示例中使用的。 alist应该以形式 (key-sequence . definition).

如果将Keymap定义为Alist,则需要注意一些事情,尤其是如果您习惯于定义全球键界。首先,没有引用命令名称。第二,如果您想使用宏, 你必须 强迫它评估 (这样). 。这是通过反向引号(不是单个报价)和逗号的组合来完成的。您可以在KBD宏中查看在示例中如何完成此操作。如果您不使用KBD宏,我还提供了击键定义。如果您只是在keymap中引用一个字符串,则按下定义的键组合时会打印出(就像定义全局键绑定一样)。

如果您不强迫与后引号和逗号的组合对KBD宏的评估,则KEYMAP将不适用于KBD宏。 像这样:

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

最后,您可以使用表单的关键字添加其他选项 :blah. 。在我使用的示例中 :global. 。我们本可以用关键字args定义整个模式,但是只需以正确的顺序列出初始值,更轻和keymap的较短。

其他提示

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

(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 以供参考。

请看一下(仅获取有关关键点的信息):

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

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

写得很好的主要模式将在最后运行钩子。因此,您可以使用钩子定义钥匙夹。次要模式通常没有钩子。在这种情况下,您可以首先调用“(需要×小模式特征符号›)”,然后定义键键。

您可能会看:http://www.cs.utah.edu/dept/old/dexinfo/emacs19/emacs_35.html#sec347

也许是公认的答案 这里 也可以帮助您。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top