Skip to content
Andy Stewart edited this page Jan 25, 2024 · 6 revisions

EAF是怎么工作的?

EAF主要实现这几个功能:

  1. 利用QWindow的Reparent技术来实现PyQt应用进程的窗口粘贴到Emacs对应的Buffer区域
  2. 通过Python EPC来实现Emacs进程和Python进程的控制指令和跨进程消息通讯
  3. 通过Qt的QGraphicsScene来实现镜像窗口,以对应Emacs的Buffer/Window模型

若想了解更多EAF设计背景,请看Wiki

EAF vs EXWM?

  1. EAF和EXWM的共同点都是:“提升Emacs和别的程序的协作效率“
  2. EXWM是一个X11窗口管理器,通过X11协议来控制Emacs和其他程序,但是EXWM只是管理其他程序,但是它并不会修改应用程序的内在行为。
  3. EAF不是一个窗口管理器,EAF只是依赖Emacs自身的窗口管理功能显示自己
  4. EAF的目标是通过PyQt创造新的应用来扩展Emacs的多媒体能力。从Emacs本身的Buffer/Mode设计上看,它和你平常用的 xx-mode 插件没有啥区别,只是它用Qt来绘制内容,而不是Emacs自身的文本库来绘制内容
  5. EAF通过造轮子的方式,把大多数程序员常用的应用写出来以后,达到Live in Emacs的最终目标
  6. 基于EAF的架构设计,我们可以通过Elisp来控制Python,JavaScript和其他命令行工具,实现多语言扩展Emacs的编程模型。在坚持Emacs黑客文化和Elisp社区兼容性的前提下,让Emacs的多媒体能力能够跟上时代的发展

或许EAF和EXWM看起来有点相似,但它们在设计和理念上是两个完全不同的项目。所以请大家多多学习X11和Qt的区别,理解技术的本质,避免无意义的比较和争论。

macOS

EAF当前只能部分支持macOS,不是所有功能都可以正常工作,具体的情况请查看Wiki

为什么通过Linux窗口管理器使用EAF无法接收输入信息?

EAF确认可以工作的桌面环境或者窗口管理器包括:KDE、Gnome2、Gnome3、Mate、Xfce、LXDE、Sway、i3、QTile、Xpra、EXWM.

我们认为不同的窗口管理器对于X11协议的支持不够完善才导致这样的问题。

现在的解决方案是将命令wmctrl -m中Name的值加入eaf-wm-focus-fix-wms,如果还有问题,请在Github提出issue。

代理

可以通过下面设置来通过代理访问互联网:

(setq eaf-proxy-type "http")
(setq eaf-proxy-host "127.0.0.1")
(setq eaf-proxy-port "1080")

如果你使用Socks5代理,你可以设置代理类型为:

(setq eaf-proxy-type "socks5")

基于规则的自定义代理请查看Wiki

按键绑定

全局按键绑定

Key Event
C-h m eaf-describe-bindings
C-c b eaf-open-bookmark
C-c e eaf-open-external
C-c i eaf-import-chrome-bookmarks
M-0 eaf-get-buffer-screenshot
M-/ eaf-get-path-or-url
M-' eaf-toggle-fullscreen
M-[ eaf-share-path-or-url

底部编辑窗口按键绑定

Key Event
C-c C-c eaf-edit-buffer-confirm
C-c C-k eaf-edit-buffer-cancel
C-c C-t eaf-edit-buffer-switch-to-org-mode