萌新的一个问题:关于Emacs图形界面开发

我非Emacs萌新用户,有大概5+ yr的使用历史,但关于Emacs和编辑器的开发属于萌新。

问一个疑惑很久的问题:如果重写个Emacs的现代用户界面(只是个界面:标题栏啊,滚动效果啦,浮动下拉菜单啦<曾经popups的各种神奇bug折磨到我放弃了auto-complete>,好像也没多少),比如类似sublime text的C++版或者基于前端技术的像Atom,然后后端支持(我指具体功能性的,包括什么buffer,window,frame啥的)全部沿用历史。这个会非常困难么?是历史原因导致它们分不太开?

如果有人了解过这些,请解解惑,也可给些博文评论啥的。我拍脑袋想的话,总觉得难度不该大到没办法处理。虽然我使用中已然不在意这些,但把各种编辑器放在一起时,界面总是不那么优雅啊

(if (和-GNU/Emacs-兼容)
   (图形界面是-Emacs-Lisp-语言的一部分)
  (写出来的就不是-Emacs-了))

你里面列的那些图形元素还不是核心, 容易实现, 核心的地方在emacs里叫redisplay engine, 就是绘制编辑区域内容的(包括光标, 文字, 格式, 图片, 排版, 变化重绘等, 包括你说的popup, 应该是用overlay实现的), 这部分代码据说很复杂, 目前没有专门的人负责, 想找人负责但是找不到, 因为太复杂了吧. 主要代码好像在xdisp.c里面, 还有一些代码分散在不同的gui后端中(比如gtk的, macos的, windows的)

2 个赞

如果是这样,那emacs估计要凉了,核心代码成为神话,谁都不愿意改它。

哪里不优雅了哈 你说清楚 :face_with_raised_eyebrow:

最近在看 《The Art of Unix Programming》 上面很多地方谈到 Emacs 说Unix 大部分程序都采用了

“separated engine and interface” pattern

写个interface 应该是可以的。但是谁有那时间

1 个赞

关于浮动下拉菜单,Emacs 26支持child frame,已经有人在实验用child frame实现补全菜单了。

1 个赞

mac版吧,用的brew装的?哪个formula?我默认用的emacs,也装着试了试emacs-plus.

当然不只是指这个基本界面啦,这个界面和别的也没啥差别,挺好的。更多是像一些弹出窗口(比如补全用;popup我报过n多bug,和别的包冲突,甚至和emacs核心的功能;这个图形功能要是有个标准实现就会好很多),fringe上用来标记断点什么的,还有有时显示工具栏用用(这个真心难看的一匹)。其实作为老用户,对这方面也没什么需求,只是纯好奇而已。

恩恩,被你提醒注意到了,这些也是interface部分的,确实不容易,这种基本的图形支持有着天然的复杂性,看看X的烂摊子就知道了,给wayland打call👍

之前看到过Emacs ML里有人提到要Emacs支持Qt这样的GUI。但是里面说到其实Emacs现在局限于GTK是有原因的,里面很多代码是通过callback啥啥啥的看不懂,反正支持Qt都是个问题。而且似乎Qt的GUI 设计不怎么容易符合Emacs的需求。Anyway,这种需求其实也不是没人提过,只是实现问题。其实这种最好能自己考虑下实现,然后开始动手写原型。等有一定基础了,才会被人发展。就像Emacs的众多分支一样,虽然一度有一些人热衷,但是最后都慢慢淡下去了,最后大道归一哈。

嗯, 我个人感觉, 在 emacs 社区,真正引导 emacs 发展方向的,都是行动派,高质量的代码比建议要有说服力的多。。。。。

Emacs 的代码基已经庞大到一定程度了,昨天编译 Emacs 27 时瞥到代码仓库大约为 1.2 G。进行较大的重构工作量恐怕大到惊人,或者换句话说,历史包袱很重。不过,作为一个史前恐龙级的软件,这点也不能过于苛责。开发者们还是很能折腾的,比如新加的 Xwidget-webkit,动态模块等。

我对 Emacs 的怨念之一是,为啥不把一些核心功能内置?比如自动补全、内嵌终端等等。交给第三方来做,插件质量真的很是让人担忧。

这些都不是硬需求,真正的需求是升级正则引擎和提高显示渲染速度,增加外部程序和 buffer 交互的渠道。具体实现留给个人。

代码质量,官方的也不会好到哪里去,同为 GNU 看家项目比如 GCC,比如 GlibC,从来没有见说这些项目代码质量好的

1 个赞

我就盼着超长行卡顿的问题啥时能解决了,现在遇到这种情况都要启动vim来处理。。。

嗯 你提到的几点也是需要迫切解决的。这些都很影响基础体验的。

我听说过一些对 GCC 的吐槽(相对于 clang)。但是不管怎样,GCC 几乎是整个「自由软件」世界的基石?clang 出来时间晚,超越前辈是自然的。GCC 应该没那么不堪。官方代码质量总要比第三方好些,这是我个人的一点「偏见」。

其实我觉得值得借鉴的是neovim那种client-server架构,client无论是命令行还是图形化终端,server返回的都文本格式的内容,而让client自行渲染。