先声明一下,本文不是讽刺印度程序员的代码质量差。
我在reddit emacs论坛上看了一篇奇怪的帖子 (https://www.reddit.com/r/emacs/comments/fmxwd6/gnu_emacs_as_a_lightweight_sql_ide/),
一般看到这种帖子我就认为是初学者的文章,直接跳过了。因为semnantic现在不是很流行。而且这个Emacs配置太简单了。
但是这篇文章有些不同寻常的地方,
- 我不记得company-mode有支持sql,而截图自动完成的效果不错
- 配置过于简单了,初学者反而不可能给出这么简单的配置
- gitlab现在用得人不多,一般都是比较硬核的自由软件支持者用gitlab
- youtube视频很简洁
我又去看了他的代码,非常吃惊。这个印度程序员很硬核,直接在Emacs源代码上做修改。让Emacs支持sql的自动完成。而且他选择基于Emacs自带的semantic库的API开发,这个技术难度蛮大的,也很少有人基于此路线开发。
我认为某种程度上他比较闭塞,对于Emacs的最新讯息接受很少,一些地方走了弯路。例如基于semantic开发js/html/java的自动完成确实没必要,semantic效率比较低,现在流行的基于LSP(Language Server Protocol)的方案相对来说功能更强大,而且性能一般好于semantic。LSP是用于支持比如自动补全,定义跳转,查找引用等语言特性的语言服务器之间的一种协议,用于VSCode也可以用于其他编辑器或IDE。
但是他的天才也没有完全浪费,基于semantic和company-mode开发的sql自动完成却是一条创新的路。
这条路线也有实用价值。因为现在大厂开发的开源的能和Emacs完美整合的SQL语法解析器还没有。而且很多web项目SQL脚本不会很多,对性能不会太苛求。
这篇文章也反映了Emacs的一个特点,一些古老的少用的API(这里是semantic的API),可以在合适的场景中得到新的应用。你很少在其他软件中看到这样的例子。
这里我实际上介绍了一个高精尖的技巧,即使很多Emacs专家也未必掌握。但我相信大多数读者还是“中士闻道,若存若亡”。让我再举一个例子。
当我开发插件evil-matchit时,我需要API能准确定位html的匹配的一对tag。Emacs有个插件sgml-mode是用来处理一种比HTML更古老的格式(https://en.wikipedia.org/wiki/Standard_Generalized_Markup_Language),其API也可以用来定位HTML的tag, https://github.com/redguardtoo/evil-matchit/blob/11d98debf8b051b10068137668eb54c2fede0e30/evil-matchit-html.el#L31
SGML是一种我永远不会需要打交道的古老格式,但其对应的插件却可以提供API供我重用于新场景。