Emacs Application Framework

Emacs Application Framework 的折腾之路

用了Emacs将近13年了, Emacs的使用时间几乎等于我的编程生涯, 可以说这么多年的编程能力和专注力都是靠Emacs来帮我提升的.

Emacs最大的威力是, 一旦你配置好了编程所需的一切, 它可以让你完全生活在里面, 打开电脑只用Emacs, 关闭Emacs就直接睡觉, 所有的专注力都放在高效的编程环境中, 只需要思考, 条件反射式的动手指, 运行即可.

使用Emacs时间长了, 就希望所有的事情都能够让Emacs完成, 不仅仅是编程.

其实Emacs几十年的发展, 除了编程以外, 还可以听音乐(EMMS), IRC聊天(ERC), 甚至是终端(Multi-Term) 等等, 如果你是一个 old-school 风格的黑客, 其实Emacs内置的功能已经够你使用了.

但是我这十几年的折腾 ( https://www.emacswiki.org/emacs/AndyStewart ), 完全不满足于此, 我希望Emacs能编程程序员的操作系统, 没有过多的界面装饰, 只用最简洁的设计, 全键盘操作程序员希望的一切程序, 比如图形化浏览器, 视频播放器, Markdown实时阅读器, 邮件客户端等等.

这个小小的梦想, 十几年前就有了, 但是限于当时的编程能力, 走了很多弯路:

  1. 第一次尝试: 2007年, 使用了Haskell编写了一个类似 Emacs 的操作系统: Manatee & 截图, 当时一口气写了编辑器, 终端, 浏览器, 音乐播放器, 文件管理器, 新闻阅读器等十几个应用, 几乎就要达到我梦想中的样子了, 但是最后放弃了, 有两个重要的原因: 第一、因为不知道怎么使用图形混合技术, 导致多个浏览器窗口无法共用一个buffer, 最直接的问题就是一个视频浏览器页面一旦分屏以后就会有两个进度和两个声音; 第二、编辑器模块怎么写也不可能有Emacs那么强大 (Manatee这个项目最大的贡献就是, 因为Manatee要使用很多Gtk+控件库, Gtk2hs 都没有, 我贡献了几万行代码给Gtk2hs, 使得Gtk2hs成为当年为数不多的Gtk+ Language Binding)

  2. 第二次尝试, 2015年, 我用Vala写了一个类似 Manatee 的项目: MrKeyboard, 但是最后也放弃了, 最主要的原因是曹哥的 Deepin-WM 窗口管理器专克我的 Xlib Reparent 黑科技, 导致我没法在 deepin 操作系统中运行 MrKeyboard, 加之当时工作也非常忙, 没有时间写图形混合器, 画面同步都是在 XClient 端拷贝图像实现的, 导致看视频的时候非常卡.

  3. 第三次尝试, 2018年, 从 deepin 退休后, 花了一个月的时间用 PyQt5 编写了一个新的框架 EAF, EAF使用了 DBus/QtGraphicsView/XReparent 三种技术实现了多进程通讯, 图形混合器和粘贴窗口到Emacs, 利用这三种技术, EAF可以让任何图形化的程序都可以直接在Emacs中运行, 包括浏览器, PDF阅读器, 图片查看器, 视频播放器, 摄像头, Org/Markdown实时预览, 文件传输等等应用. 这个项目彻底的实现了十几年前我期望改造Emacs的小目标.

Emacs Application Framework 的目标

  1. 增强Emacs的图形化能力, 所有需要高性能图形绘制的功能都用EAF来实现
  2. 让Emacs专注于文本编程环境的开发, 并保持 Elisp 现有的生态不会因为引入图形化功能发生重大的变化
  3. 通过增强Emacs的图形化插件来获得现代IDE的很多能力, 使得Emacser能够永久的生活在Emacs中.

Emacs Application Framework 的架构设计

EAF 架构设计

用最通俗的话来讲, EAF其实做的工作和手机贴膜差不多, 就是先把 PyQt5 的图形程序运行起来, 然后通过 XReparent 的技术把PyQt5的窗口粘贴到Emacs窗口对应的位置.

EAF整体架构的关键技术有以下几点:

  1. 通过 QtGraphicsView/QtGraphicsSence 来实现实时图形混合, 多个窗口可以共用一个进程的绘制内容, 这样就可以适应 Emacs 的 Window/Buffer 架构设计, 从而最终让 PyQt5 窗口可以像 Emacs Elisp Buffer 那样集成和切换, 顺利的解决了当年 Manatee 两个浏览器窗口有多重音视频的问题.
  2. 通过 X11 Reparent 技术, 粘贴 PyQt5 的窗口到 Emacs EAF Buffer 的坐标上, 实现多个进程的窗口看起来是一个程序里面的不同部分, 不清楚 X11 技术的同学, 可以想象一下 Chrome 的多进程架构设计. X11 Reparent 的技术除了达到贴膜的作用外, 还变相的实现了多进程沙箱的设计, EAF图形化的程序运行在单独的进程中, 即使出现了意外情况, 也不会影响Emacs本身的稳定性.
  3. 在Emacs端实现了一个事件监听循环, 当用户在 EAF Buffer按下任何按键, 都会通过 DBus 发送事件消息给 Python 进程, Python 进程再伪造相应的事件来模拟Emacs端用户的键盘输入.

通过这种简单粗狂的设计, EAF已经实现了包括浏览器, 图片浏览器, PDF阅读器, 视频播放器, 摄像程序, Org/Markdown实时预览器, 文件共享程序等模块.

5分钟就可以写好一个插件

只要你会基本的 Python 和 Qt 编程, 5分钟就可以写一个 EAF插件

如果你不会 Qt 也没有关系, 看这个Qt教程, 几天就会了.

未来的目标

  1. 完善浏览器插件
  2. 实现更多的插件, 比如邮件客户端, 新闻阅读器, 终端模拟器等
  3. 移植EAF到 MacOS 平台 (主要的障碍是 MacOS 平台上怎么实现 X11 XReparent 类似的技术)
  4. 面向社区开发更友好的架构设计和文档工作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容