繁体   English   中英

Emacs键绑定回退

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM