Emacs模式用于flex和bison,或者删除这些模式的自动缩进?

9

Emacs在Flex和Bison的自动缩进方面处理较差。实际上,它似乎没有对flex模式提供支持。那么,Emacs用户该如何应对这些问题呢?我喜欢Vim,但我更喜欢不切换到Vim,因为我在Emacs中速度更快、更舒适。

几个月前,我有一个第三方的Bison elisp模块,但是当它的缩进出现问题时,它永远无法修复。简而言之,它是一个糟糕的hack。

还是有一种方法可以关闭.l和.y文件的自动缩进(因此按下Tab键只进行一个缩进)吗?我也想知道如何仅在Emacs中更改此elisp设置。

如果有一个简洁明了的elisp指南,那会非常有帮助。如果我有正确的文档,我也不介意花几天时间编写自己的flex和bison模式。


我不确定你所说的“关闭.l和.y文件的自动缩进”是什么意思。模型行声称处于什么模式?你可以通过修改auto-mode-alist来调整它。 - zwol
它似乎是在Bison的C模式下。对于Flex,它是在Lisp模式下。 Bison的C模式是可以容忍的,但似乎Emacs没有Lex或Flex模式。 - Kizaru
你可能已经看到了这个问题,但如果没有的话,让我向你推荐以下问题:https://dev59.com/TXI95IYBdhLWcg3www2Y - user181548
2个回答

4

Emacs主要根据文件名扩展名选择主要模式。 .l是一个有争议的扩展名:有些人用它来表示lex,而另一些人则用它来表示lisp(还有一些其他较少见的用法)。 Emacs将.l与lisp相关联,并将.lex与lex相关联(对于此情况使用C模式)。

如果您处理的.l文件更多地是lex而不是lisp,则可以通过在.emacs中添加以下行来更改与.l文件关联的内容:

(add-to-list 'auto-mode-alist '("\\.l\\'" . c-mode))

您可以在文件内部声明 Emacs 打开文件时要使用的模式。将以下代码片段放置在文件的第一行(通常是注释中):
``` -*- mode: desired-mode; -*- ```
请将 "desired-mode" 替换为您想要使用的模式名称。
-*-mode: c-mode-*-

这是一个更通用的功能,提供其他语法和其他可能性; 有关更多信息,请参阅Emacs手册中的“文件变量”。
如果您想开始使用Emacs Lisp,请阅读Emacs Lisp介绍(可能包含在您的Emacs或操作系统发行版中)。一旦您熟悉了该语言的基础知识,可以查看Emacs Lisp参考手册中的模式章节。

我会在家里的Emacs设置上尝试这个...我不是完全确定,但我认为Flex/Lex在C模式下有问题(特别是在规则部分)。例如,如果一行的第一个字符不是空格,Flex会将其解释为要匹配的模式。在C模式下,如果我想放一些对应规则的代码,除非我强制缩进,否则我无法将其放到右侧,这很繁琐。这里有什么简单的解决方案或想法吗? - Kizaru
1
@PlaZmaZ:我认为你不能不写一点代码就解决这个问题。Lex或Yacc模式将派生自C模式(在Emacs Lisp手册中查找“Derived Modes”)。CC模式具有复杂的缩进引擎,我从未深入研究过;我认为“高级定制”部分会引起你的兴趣。对于语法着色,请查找“Font Lock mode”。 - Gilles 'SO- stop being evil'

2

额外提示:你可以决定使用Emacs的通用行为,即当它没有针对文件格式的特殊模式时使用的行为。在emacs术语中,这被称为" Fundamental mode":所以你可以通过M-x fundamental-mode来动态请求它,或者在文件的第一行上放置-*- mode: fundamental -*-,或者像这样自定义auto-mode-alist:

(add-to-list 'auto-mode-alist '("\\.l\\'" . fundamental-mode))

另一个尝试的方法可能是使用 indented-text-mode(可能需要禁用自动换行)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接