Files
emacs/lisp/emacs-application-framework/README.zh-CN.md
2021-01-30 14:52:51 +01:00

15 KiB
Raw Blame History

English | 简体中文

Emacs Application Framework (EAF)

EAF 是一个全新的图形应用框架通过扩展Emacs的多媒体能力最终达到 Live in Emacs 的终极目标。

EAF 应用展示

EAF是一个可编程扩展的框架你可以开发自己的Qt5应用并集成在Emacs中。

浏览器 Markdown预览(支持Mermaid和PlantUML)
图片浏览器 视频播放器
PDF阅读器 摄像头程序
二维码下载文件 (PC到手机) 二维码上传文件 (手机到PC)
无线文字传输程序 Org预览
终端模拟器 RSS阅读器 (集成Elfeed)
Aria2 下载管理器 思维导图
Jupyter 笔记管理系统

EmacsConf2020 - Extend Emacs to Modern GUI Applications with EAF暂无中文字幕

EmacsConf2020 - Extend Emacs to Modern GUI Applications with EAF

安装

  1. 下载EAF:
git clone --depth=1 -b master https://github.com/manateelazycat/emacs-application-framework.git ~/.emacs.d/site-lisp/emacs-application-framework/

你也可以通过Quelpa来下载

(quelpa '(eaf (:fetcher github
               :repo  "manateelazycat/emacs-application-framework"
               :files ("*"))))
  1. 通过M-x install-eaf-dependencies安装EAF依赖

如果你更喜欢手动执行安装脚本,

  • GNU/Linux用户
cd emacs-application-framework
chmod +x ./install-eaf.sh
./install-eaf.sh
  • Windows用户
>>>>>>> Update README and eaf-install-dependencies (need Windows testing)
cd emacs-application-framework
node ./install-eaf-win32.js

脚本里安装的每一个依赖的解释可以在依赖列表找到。

  1. 安装Elisp依赖包:
  1. 从这里开始你可以把EAF加入Emacs的 load-path,然后在 init.el 中写入:
(add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-application-framework/")
(require 'eaf)

或者,如果你使用use-package,下面有一个简单的配置文件供你参考:

(use-package eaf
  :load-path "~/.emacs.d/site-lisp/emacs-application-framework" ; Set to "/usr/share/emacs/site-lisp/eaf" if installed from AUR
  :init
  (use-package epc :defer t)
  (use-package ctable :defer t)
  (use-package deferred :defer t)
  (use-package s :defer t :ensure t)
  :custom
  (eaf-browser-continue-where-left-off t)
  :config
  (eaf-setq eaf-browser-enable-adblocker "true")
  (eaf-bind-key scroll_up "C-n" eaf-pdf-viewer-keybinding)
  (eaf-bind-key scroll_down "C-p" eaf-pdf-viewer-keybinding)
  (eaf-bind-key take_photo "p" eaf-camera-keybinding)
  (eaf-bind-key nil "M-q" eaf-browser-keybinding)) ;; unbind, see more in the Wiki

依赖列表

核心 分类代表必备依赖这些包必须安装好EAF才能工作。其余依赖都可选若想其使用对应的应用时你才需要安装这些依赖。当然我们推荐先把所有依赖都安装好等到真正使用的时候就不用再次折腾。

包名 依赖 解释
python-pyqt5, python-pyqt5-sip 核心 GUI图形库
python-pyqtwebengine 核心 基于Chromium的浏览器引擎
wmctrl 核心 激活Emacs窗口输入焦点
python-pymupdf PDF阅读器 解析PDF文件
python-qrcode 文件上传,文件下载,文字传输 根据文件信息生成二维码
aria2 浏览器 下载网络文件
nodejs 终端模拟器 通过浏览器与本地TTY交互
libreoffice 办公文档阅读器 转换doc文件为pdf格式
filebrowser-bin 文件浏览器 在电脑和手机之间快速共享文件
qtconsole jupyter 提供RichJupyterWidget
java-openjdk Markdown 预览 正常渲染Markdown文档中的PlantUML代码

EAF应用启动命令

应用名称 启动命令
浏览器 M-x eaf-open-browser 在浏览器中打开或搜索
M-x eaf-open-browser-with-history 搜索历史或者打开URL
HTML邮件渲染 M-x eaf-open-mail-as-htmlgnusmu4enotmuch 等邮件客户端中执行
PDF阅读器 M-x eaf-open 输入PDF文件
视频播放器 M-x eaf-open 输入视频文件
图片浏览器 M-x eaf-open 输入图片文件
Markdown预览 M-x eaf-open 输入Markdown文件
Org预览 M-x eaf-open 输入Org文件
摄像头程序 M-x eaf-open-camera
终端模拟器 M-x eaf-open-terminal
二维码下载文件 M-x eaf-file-sender-qrcode or eaf-file-sender-qrcode-in-dired
二维码在线浏览器 M-x eaf-file-browser-qrcode
无线分享 M-x eaf-open-airshare 输入要分享给手机的字符串
思维导图 M-x eaf-create-mindmap or M-x eaf-open-mindmap
微软Office阅读器 M-x eaf-open-office
jupyter M-x eaf-open-jupyter
演示程序 M-x eaf-open-demo
  • EAF浏览器以及PDF浏览器支持Emacs内置书签操作通过使用M-x bookmark-set(默认C-x r m)以及M-x bookmark-bmenu-list(默认C-x r l)。

Wiki

强烈建议使用EAF之前浏览一遍Wiki

Wiki囊括了各种你想了解的EAF相关文档包括了

  1. 按键绑定
  2. 自定义选项
  3. 架构设计
  4. 任务列表

你还会在Wiki发现很多有用的技巧如DockerHelm等

常用问题

EAF是怎么工作的

EAF主要实现这几个功能

  1. 利用QWindow的Reparent技术来实现PyQt应用进程的窗口粘贴到Emacs对应的Buffer区域
  2. 通过Python EPC来实现Emacs进程和Python进程的控制指令和跨进程消息通讯
  3. 通过Qt5的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来控制PythonJavaScript和其他命令行工具实现多语言扩展Emacs的编程模型。在坚持Emacs黑客文化和Elisp社区兼容性的前提下让Emacs的多媒体能力能够跟上时代的发展

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

为什么EAF无法在MacOS下工作

  1. Qt5的QGraphicsScene技术无法在MacOS下正常工作也就无法实现Qt5应用的镜像窗口以支持Emacs的Buffer/Window模型
  2. QWindow Reparent技术无法在MacOS下正常工作也就无法实现Qt应用进程的窗口粘贴到Emacs对应的Buffer区域

为什么EAF的js-video-player在Windows下无法播放视频文件

js-video-player需要qtwebengine编译时链接到ffmpeg才能支持额外的编码如h264/aac.

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

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

我们认为不同的窗口管理器对于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")

EAF社区

下面列表列展示了EAF在Emacs社区的应用。如果我们遗漏你的应用欢迎提交PR来加到下面列表中。

反馈问题

反馈安装和配置问题之前,请一定先阅读Wiki!!!

如果你使用中遇到任何问题,并且问题是git pull后出现的,请先阅读Discussions页面。

关于其他问题,请用命令 emacs -q 并只添加EAF配置做一个对比测试如果 emacs -q 可以正常工作,请检查你个人的配置文件。

如果emacs -q环境下问题依旧,请到这里反馈, 并附带 *eaf* 窗口的内容给我们提交issue那里面有很多线索可以帮助我们排查问题。。

如果你遇到崩溃的问题, 请用下面的方式来收集崩溃信息:

  1. 先安装gdb并打开选项 eaf-enable-debug
  2. 使用命令 eaf-stop-process 停止EAF进程
  3. 重新打开EAF, 并在下次崩溃时发送 *eaf* 的内容

加入我们

你想把Emacs开发成一个操作系统吗

想要在Emacs里面生活的更舒适吗

想要创建下一个激动人心的Emacs插件吗

一起疯吧!

打赏

如果我的作品让你的生活充满快乐,欢迎请我喝瓶啤酒,哈哈哈哈

ManateeLazyCat