我有一个次要模式。如果该模式处于事件状态,并且用户按下了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/