0

有没有办法建议键映射或在键映射前缀之后但在键映射中的命令之前运行函数?

假设我有一个带有绑定的键映射,但这些绑定仅在激活hideshow后才有用。在输入前缀之后,但在调用地图中的函数之前hs-minor-mode如何运行?(hs-minor-mode)

我认为制作一个前缀命令并建议它可能会起作用,但这是一个错误(如下)。

例子:

(let ((map (define-prefix-command 'my-activate-fold 'my-fold-map)))
  (define-key map "a" #'hs-hide-all)
  (define-key map "s" #'hs-show-all)
  (define-key map "l" #'hs-hide-level)
  (global-set-key (kbd "<f6>") 'my-activate-fold))

;; error: wrong-type-argument commandp my-activate-fold
(define-advice my-activate-fold (:before (fn &rest r) "activate-hideshow")
  (hs-minor-mode)
  (apply fn r))
4

2 回答 2

0

如果我理解正确,我认为您可能会错误地处理这个问题。对于您的具体问题,不,没有办法定义一个函数,该函数将在调用前缀键之后但在运行绑定到键的命令(交互式函数)之前运行。但是,我不确定这是否真的是您所追求的。您当然可以定义可以包装另一个命令并做任何您想做的事情的命令。但是,我也不确定这是否是您想要的。您可能想要准确地说明您想要什么,而不是您认为是您想要的解决方案的一部分。

通常的做法是使用次要模式来定义键映射,然后在模式初始化挂钩中将特定于模式的键绑定添加到该映射。在 hs-minor-mode 的情况下,这称为 hs-minor-mode-map。此映射仅存在于运行 hs-minro-mode 的缓冲区内,并且优先于全局映射。所以这是您要放置模式特定绑定的地方。为此,创建一个函数,将绑定添加到映射并将其附加到 hs-minor-mode-hook,它在加载 hs-minor-mode 时运行。

(add-hook 'hs-minor-mode-hook (lambda ()
                                (define-key 'hs-minor-mode-map "a" #'hs-hide-all)
                                ...))

只有当 hs-minor-mode 在缓冲区中处于活动状态时,上面定义的键绑定才会存在。如果它未激活,则绑定中使用的键将绑定到模式中的下一个最高映射或全局映射或什么都不绑定(有关完整详细信息,请参阅 elsip 手册中的键映射部分)。

如果您想要让特定的 hs-minor-mode 绑定仅存在于特定模式中,那么您可以在该模式的键盘映射中定义这些绑定。例如,如果您希望 hs-minor-mode 绑定仅在您在 js2-mode 中运行 hs-minor-mode 时存在,但在您在 c-mode 中运行 hs-minor-mode 时不存在,那么您可以将绑定添加到js2-mode-map 并加载 hs-minor-mode 作为 js2-mode-hook 的一部分

如果这是你追求的其他东西,你需要澄清。

于 2019-09-12T03:09:48.943 回答
0

FWIW,您可以简单地建议命令本身:

(defun my-ensure-hs-minor-mode (&rest _args)
  "Ensure `hs-minor-mode' is active."
  (unless (bound-and-true-p hs-minor-mode)
    (hs-minor-mode 1)))

(advice-add 'hs-hide-all :before #'my-ensure-hs-minor-mode)
(advice-add 'hs-show-all :before #'my-ensure-hs-minor-mode)
(advice-add 'hs-hide-level :before #'my-ensure-hs-minor-mode)

然后你的键盘映射就可以工作了:

(require 'hideshow)

(let ((map (define-prefix-command 'my-activate-fold 'my-fold-map)))
  (define-key map "a" #'hs-hide-all)
  (define-key map "s" #'hs-show-all)
  (define-key map "l" #'hs-hide-level))

(global-set-key (kbd "<f6>") 'my-activate-fold)
于 2019-09-12T22:44:37.870 回答