eaf 和 evil 的磨合

今天看了 eaf 代码,参照着 caret 的部分,在 core/webengine.py 里的以下两个函数加了一个同步 focus 状态的操作,发现几行代码代码就行了,这个接口封装地真方便,python emacs 一体了 @manateelazycat :+1: :+1:

    @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 颜色 output-2022-08-09-14:41:41

(以上 clear focus 显示有点问题,但主要展示 modeline 变化)

现在新的折腾需求是想把 text-input 内容也同步到某个变量或者隐藏的 buffer 里, 这样用 rime 或 pyim 的一些 predicate 功能就能统一,不用打开 edit buffer, 不知道可不可行。

另外,我用 doom-modeline,一般是用左下角那个小圆点来表示状态, @seagle0128 请教这个怎么根据某个变量值来切换颜色?

1 个赞