在 pyim/emacs-rime 里都有“探针/断言”函数来在特定的状态下自动切换到英文状态,省去手工切换的动作。

但是我在使用中偶然发现在打开 Hydra 菜单的时候不能自动切换到英文模式,有点儿影响体验。我一直以为 Hydra 激活时是一个 “button” 模式,看来不是这样。

试图搜索一下与 hydra 有关的 mode ,却一无所获,莫非 hydra 不是以一种特定 mode 的方式来实现的?查看官方文档和 google 搜索也都没有找到类似有一个单独的 mode 的描述,只是说明 defhydra 里会定义一些快捷键。但是注意到一个情况,就是 defhydra 会生成一个 keymap ,可是怎么使得这个 keymap 在需要的时候激活,不需要的时候关闭呢?

无奈英语太烂,实在找不到更详细的信息了,只好去查看代码,终于发现一个函数 hydra-set-transient-map ,它的说明是 Set KEYMAP to the highest priority. 也就 是把需要的 hydra 的 keymap 优先级提到最高,这样其对应的快捷键就生效了,退出时再 恢复到低级。这下明白了 hydra 的实现方式。可是如何判断当前把 hydra keymap 提高到最 高优先级使得快捷键生效了呢?

只好继续看代码,在逐个搜索函数和变量的过程中,终于发现一个变量 hydra-curr-map ,其当前值是 nil ,描述是 The keymap of the current Hydra called. ,可以试一下。

试着写一个断言函数:

1
2
3
(defun +rime-predicate-hydra-p ()
  (and (featurep 'hydra)
       (bound-and-true-p hydra-curr-map)))

加载到 rime-disable-predicates 里试一下,果然有用。 ^_^

找到这个的过程好费劲,各种搜索无果,在群里多次提问也没有回答,不知是这问题太基础还是大家确实都不知道,加上看到找到的这个变量,感觉应该挺容易发现才对,现在自信心挺受打击,总觉得自己绕了很多弯路。

因此就假定也会有同学有我同样的情况吧,所以记录一下备查,也许有人用得着。