Emacs键绑定回退

rej*_*eep 10 emacs elisp

我有一个小模式.如果该模式处于活动状态且用户命中DEL,我想执行一些操作,但仅限于某些条件成立.如果条件成立且执行了操作,我想在此之后不再做任何事情.但如果条件失败,我不想做任何事情,让默认的DEL动作执行.

不知道我怎么解决这个问题.但我想我可以用两种方式做到:

1) 我可以将DEL键重新绑定到次要模式中的函数,然后检查条件是否成立.但是,我怎么知道DEL的默认命令是什么?

2) 我可以像这样添加一个pre命令钩子.执行命令然后断开链.但是我该如何打破链条呢?

(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)
              )))
Run Code Online (Sandbox Code Playgroud)

你会以什么方式解决它?谢谢!

Tre*_*son 12

执行此操作的方法是暂时禁用您的次要模式,然后查找键绑定.

假装你一定'do-thingy要参加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!")))
Run Code Online (Sandbox Code Playgroud)

注意:此行为假定您已将模式绑定设置为次模式标准方式.具体来说,您应该minor-mode-map-alist通过添加元素将键映射添加到变量中(my-minor-mode . my-minor-mode-keymap).这就是上述let语句的工作原理,它会在临时禁用模式的情况下查找所需的绑定.

如果您用于define-minor-mode定义次要模式,则键盘图会自动设置为"正确的方式".

  • 什么是任意后备,你事先不知道你想要回归的关键是什么?如何以编程方式查找用于original-func值的绑定?(没关系:它看起来像是一个使用this-command-keys-vector). (2认同)