是否可以根据上下文更改 emacs 语法表?

Posted

技术标签:

【中文标题】是否可以根据上下文更改 emacs 语法表?【英文标题】:Is it possible to change an emacs syntax table based on context? 【发布时间】:2012-07-09 15:19:13 【问题描述】:

我正在努力改进 UnrealScript 的 emacs 主模式。 (许多)怪癖之一是它允许使用这样的语法在虚幻编辑器中指定工具提示:

var() int MyEditorVar <Foo=Bar|Tooltip=My tooltip text isn't quoted>;

变量声明后的尖括号表示以管道分隔的 Key=Value 元数据对列表,元数据不加引号但可以包含引号——管道 (|) 或右尖括号 (@987654325 @) 表示结束。

有没有一种方法可以让 emacs 语法表以一种有用的方式识别这种上下文相关的语法?我希望在这些变量元数据声明中以某种方式突出显示除了管道和直角括号之外的所有内容,但保留它们的正常突出显示。

现在,单引号字符被设置为引号分隔符(语法指示符"),所以 font-lock-mode 将这样的引号解释为开始一个带引号的字符串,它不是在这个非常具体的实例中,因此它会错误地突出显示所有内容,直到找到另一个据称匹配的单引号。

【问题讨论】:

你使用什么主要模式? @Thomas: This major mode,进行了一些修改(额外的关键字等)。 【参考方案1】:

您需要设置一个syntax-propertize-function,它允许您根据上下文将不同的语法指示符应用于缓冲区中的不同字符。

在 Emacs 的 lisp 目录中搜索 syntax-propertize-function 以查看各种示例(从简单到非常复杂的示例)。

您可能希望将“Foo”和“Tooltip”之后的“=”字符标记为“通用字符串分隔符”,然后对相应的终止符“|”执行相同操作和“>”。另一种方法是将“>”之前的字符标记为(关闭)通用字符串分隔符,这样您就可以将“”标记为打开和关闭括号。

【讨论】:

以上是关于是否可以根据上下文更改 emacs 语法表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Emacs窗口/框架配置与屏幕位置一起存储

SAPUI5 根据匹配的上下文/路由动态更改文本

如何通过上下文更改 Spring Security 角色?

如何创建右键单击上下文 shell 快捷方式“使用 Emacs 编辑”?

语义分析的语言?

Django 模板 - 更改“包含”模板的上下文