[英]Emacs key binding fallback
我有一个小模式。 如果该模式处于活动状态且用户命中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)
)))
你会以什么方式解决它? 谢谢!
执行此操作的方法是暂时禁用您的次要模式,然后查找键绑定。
假装你已经把'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!")))
注意:此行为假定您已将模式 绑定设置为次模式的标准方式 。 具体来说,您应该通过添加元素(my-minor-mode . my-minor-mode-keymap)
minor-mode-map-alist
(my-minor-mode . my-minor-mode-keymap)
将键映射添加到变量minor-mode-map-alist
。 这就是上面的let
语句的工作原理,它会在你暂时禁用的模式下查找你想要的绑定。
如果使用define-minor-mode
来定义次要模式,则keymap会自动设置为“正确的方式”。
这就是我用于smart-tab
包的功能。
(defun smart-tab-default ()
"Indents region if mark is active, or current line otherwise."
(interactive)
(if mark-active
(indent-region (region-beginning)
(region-end))
(call-interactively
(or
;; Minor mode maps for tab (without smart-tab-mode)
(cdar (assq-delete-all 'smart-tab-mode (minor-mode-key-binding "\t")))
(cdar (assq-delete-all 'smart-tab-mode (minor-mode-key-binding [(tab)])))
(local-key-binding "\t")
(local-key-binding [(tab)])
(global-key-binding "\t")
(global-key-binding [(tab)])))))
在命令smart-tab
(在次要模式下绑定到选项卡的那个)中,它具有以下内容:
(if (smart-tab-must-expand prefix)
;; use smart tab
(smart-tab-default))
它首先检查是否有任何针对选项卡的小模式绑定(不包括smart-tab-mode
),然后是本地,最后是全局键绑定。
似乎没有办法可靠地做你想要的。 如果您的新命令绑定到DEL,那么在当前键映射之前绑定到DEL的任何内容都不再存在。 您提出的另一种方法不起作用,因为预命令挂钩不会阻止发生以下操作。 您可能还会考虑使用^ G(键盘退出)中断进一步执行,但这是一个不受控制的中断,可能会阻止比您想要的更多的事情。
即使您设置新绑定的过程比仅仅重新绑定更复杂,并且记住之前绑定的内容,所以您可以在之后调用它,但实际上并没有您想要的内容。 如果有人想要重新绑定“默认”操作,则必须通过修改功能而不是替换键绑定来执行此操作。
你想做什么不符合Emacs关键绑定如何工作的模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.