我有一个次要模式。如果该模式处于事件状态,并且用户按下了DEL,则我
想要采取某种行动,但前提是必须满足某些条件。如果
条件成立并且执行了 Action ,我只想做些什么
之后。但是,如果条件失败,我什么也不想做
并执行默认的DEL操作。

不知道如何解决这个问题。但是我想我可以通过两种方式做到这一点:

1)
我可以在次要模式下将DEL键重新绑定(bind)到一个函数,然后
检查条件是否不成立。但是那我怎么知道
DEL的默认命令是?

2)
我可以像这样添加一个预命令钩子(Hook)。执行命令,然后
打破链条。但是,我该如何打破束缚?

(add-hook 'pre-command-hook
          (lambda()
            (when (equal last-input-event 'backspace)
              ;; Do something and then stop (do not execute the
              ;; command that backspace is bound to)
              )))

您将以什么方式解决它?谢谢!

最佳答案

这样做的方法是暂时禁用次要模式,然后查找按键绑定(bind)。

假设您已将'do-thingy绑定(bind)到DEL。然后,这将达到目的(假设您要触发的条件是(equal last-input-event 'backspace):

(defun do-thingy ()
  "Do something, unless last event was backspace."
  (interactive)
  (if (equal last-input-event 'backspace)
      (let* ((my-minor-mode nil)
             (original-func (key-binding (kbd "DEL"))))
        ;; original-func is whatever DEL would be if
        ;; my-minor-mode were disabled
        (call-interactively original-func))
    (message "Here's my minor mode behavior!")))

注意:此行为假定您已将key bindings设置为standard way a minor-mode would。具体来说,您应该通过添加元素minor-mode-map-alist将键盘映射添加到变量 (my-minor-mode . my-minor-mode-keymap) 。上面的let语句就是这样工作的,它会在临时禁用模式的情况下查找所需的绑定(bind)。

如果使用 define-minor-mode 定义次要模式,则将自动以“正确方式”设置键盘映射。

关于Emacs key 绑定(bind)回退,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2494096/

10-11 02:34
查看更多