前一段时间很意外地在公司内部Slack里发现一只野生的Emacs developer。简单地聊了下,我问他Emacs近年来有没有增加什么知名度不高但非常有用的新功能,他说他觉得SMIE算一个。
今天我有点时间把SMIE的论文找出来读了一遍 (https://arxiv.org/ftp/arxiv/papers/2006/2006.03103.pdf ),然后把自己的djinni-mode的自动缩进用SMIE重做了一遍,果然非常简单清爽。
简单来讲,SMIE就是一个新的自动缩进引擎框架,相比之前大家各自用大团正则表达式胡乱堆砌出的自动缩进,通过SMIE只需定义极少量语法规则和缩进规则,就能给你的语言模式搞出一个相当可用的自动缩进功能。有了这个,现在做个major-mode差不多是前所未有的简单了。
13 个赞
那已有的mode 能兼容么?web-mode大规模缩进太卡了
需要重写缩进引擎。太卡一般是因为缩进引擎试图从头解析整个文档,或者回溯太远。SMIE的整个设计就是基于尽可能少回溯,所以一般不太容易卡。
呃,原来如此。。感觉说明这个东西好像还不够给力,或是用的不好。elixir 这方面的体验不忍直视。
这玩意儿很早就有了吧,wolfram-mode 就是用它缩进。23.7.1 Simple Minded Indentation Engine
而且好像只能缩进,不能格式化
全选 C-M-\ 就格式化了。其实就是逐行indent。如果你读了那个paper就会看到这样设计是为了给使用者提供方便而不是强制使用者必须遵循固定的格式。例如你有一块自己手工对齐的代码,只要你不去上面按Tab,Emacs并不会自动改变它。