我有一个小模式.如果该模式处于活动状态且用户命中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
定义次要模式,则键盘图会自动设置为"正确的方式".
归档时间: |
|
查看次数: |
658 次 |
最近记录: |