有人尝试了在 Emacs 的 buffer 中运行 GTK 程序

纯探讨,直接用elisp绑定QT是否可行?

理论上可行,但是经济上不可行,我2008年左右是 gtk2hs 的开发者,目前也是 gtk2hs 提交代码最多的开发者。

外部语言绑定 Gtk 或者 Qt, 不仅仅只是 FFI 绑定,针对一些复杂的API,比如某个复杂函数包含控件列表参数,传入的是控件的引用,而不是拷贝,在函数执行完之前内存都无法释放,需要开发者做手动内存管理。

2008年我把整个 Gtk 2.28 全部API都绑定到 Haskell 语言 (Gtk2hs),花了我每天晚上4个小时,整整三个月的时间,手动绑定一次太费劲,这还是 Haskell 有 c2hs 这个基础设施的情况下。

Gtk虽然有GIR的基础设施,但是也需要语言本身支持GIR中各种对象的内存管理,这只是Gtk, 还有 VTE, Pango、WebKit, Poppler 等库,还不包括 Cairo 这种就不支持Gobject的库(GIR没法加速),我当年把 Haskell 支持 Gtk、VTE、 WebKit、Pango、 Cairo等库耗费了我半年的时间,如果下次升级呢?还要再搞一遍。

Elisp的死穴(目前看)是多线程的基础生态还不够好,GUI开发在Linux下,Elisp自身多线程不好,一旦要后台准备数据的时候,怎么做到和Gtk/Qt主循环线程 ‘并发’ 的后台线程。从我多年经验看,Elisp多线程支持还不够好。在这种情况下,耗费大量时间和人力去做 Elisp 绑定 Qt 有必要吗?

Elisp是函数式语言,Gtk和Qt都是面向对象的OOP语言,用Elisp语法风格的代码去写Gtk/Qt API, 还要用函数式语言去写 Gtk/Qt 的状态处理,我相信做出来,大家写 Elisp/Qt 代码都会写吐。

那为啥不就用PyQt呢? Elisp什么都不用做,效果一样的。

程序员都有一个心结,喜欢一个语言恨不得用这个语言去重写所有模块,但是世界是多元化的,人的时间和精力是有限的,为了同样的效果(可以跑浏览器和GUI程序),用PyQt可以节省大量时间学习新的知识和陪伴家人,不应该为了洁癖浪费自己的时间。

11 个赞

理解了。因为我没有做过UI库到其他语言的绑定工作,不清楚具体的细节。看了你的解释清晰了 :+1:t2:

说到语言洁癖,这个倒不是。我只是觉得Python的性能也并不算好,看看有没有更好的方式。要说生态Python肯定是不错的,但基于以前使用Python UI库的经验看并不佳。

1 个赞

qt 估计有困难,不过 GTK 可能实现(主要因为 Emacs 内置有 GLib event loop,所以那方面不存在有问题。)

用GTK实现的话跨平台有障碍吗?GTK在Windows和macOS表现并不好。

肯定有障碍,GTK 只有在 freedesktop 系统上才能正常表现。

千万别绑定GUI, 太复杂而且跨平台是个累赘, IPC多爽啊

选择python主要是平衡考虑,生态不错,同时跨平台安装相对容易。

用其他编程语言会面临生态库自建,跨平台门槛高的问题。

1 个赞

您好,我想请教一下 posframe 和 popweb 在创建悬浮框的原理区别:posframe 是创建了一个新的 emacs frame 然后在里面显示东西,达到悬浮的效果。popweb 这边似乎是让 python/qt 去创建了一个新的窗口,然后在里面显示东西?

对,你这样理解没错

1 个赞

搞不懂为啥还有人用windows、mac os这种不自由的平台,eaf这种非盈利的项目不应该考虑这些小众需求啊

太年轻了吧,公司发的就是 mac,要不你给我买个电脑?

因为我喜欢用什么是我的自由 :smirk:

1 个赞

因为工作需要,只能用windows。mac没有用过,以后应该也不会用,一直比较羡慕那些可以完全用自由平台、自由软件生活工作的人