今天看了 eaf 代码,参照着 caret 的部分,在 core/webengine.py 里的以下两个函数加了一个同步 focus 状态的操作,发现几行代码代码就行了,这个接口封装地真方便,python emacs 一体了 @manateelazycat
@interactive(insert_or_do=True)
def focus_input(self):
''' input in focus.'''
if self.focus_input_js == None:
self.focus_input_js = self.read_js_content("focus_input.js")
self.eval_js(self.focus_input_js)
eval_in_emacs('eaf--sync-text-focus-state', ["'t"])
@interactive
def clear_focus(self):
''' Clear the focus.'''
if self.clear_focus_js == None:
self.clear_focus_js = self.read_js_content("clear_focus.js")
self.eval_js(self.clear_focus_js)
eval_in_emacs('eaf--sync-text-focus-state', ["'nil"])
eaf–sync-text-focus-state 定义在 app/browser/eaf-browser.el 里
(defcustom eaf-browser-text-focus-state nil
"Indicates whether text is being focus"
:type 'boolean)
(defun eaf--sync-text-focus-state (text-focus-status)
"Toggle text focus state given TEXT-FOCUS-STATUS."
(setq eaf-browser-text-focus-state text-focus-status))
这样 emacs 这边就有一个判断是否 text-focus 状态的变量, 绑定按键用以下方式后,focus 时按逗号之类的就不卡了
(defun eaf-insert-or-comma ()
(interactive)
(if eaf-browser-text-focus-state
(eaf-py-proxy-insert_or_zoom_in)
(comma-hydra/body)))
(eaf-bind-key eaf-insert-or-comma "," eaf-browser-keybinding)
有了一个状态标识之后, eaf mode 下本身就相当于有 vim 的 normal 和 insert 状态,可以类似地加一些 hook或 advice 来判断状态变化,例如
参考 根据evil和内置输入法的状态调整modeline的背景色 里根据 eaf 是否 focus 来改变 modeline 颜色
(以上 clear focus 显示有点问题,但主要展示 modeline 变化)
现在新的折腾需求是想把 text-input 内容也同步到某个变量或者隐藏的 buffer 里, 这样用 rime 或 pyim 的一些 predicate 功能就能统一,不用打开 edit buffer, 不知道可不可行。
另外,我用 doom-modeline,一般是用左下角那个小圆点来表示状态, @seagle0128 请教这个怎么根据某个变量值来切换颜色?