Typst 官方 VS Code 语言支持扩展解析:tools/support 的语言注册、编辑行为配置与 TextMate 语法规则
Typst 官方 VS Code 语言支持扩展解析tools/support 的语言注册、编辑行为配置与 TextMate 语法规则【免费下载链接】typstA markup-based typesetting system that is powerful and easy to learn.项目地址: https://gitcode.com/GitHub_Trending/ty/typst本文为 Typst 仓库中 tools/support 目录下官方随附的 VS Code 语言支持扩展做逐文件解析。读完本篇你将理解一个最小化语言扩展是如何通过package.json声明语言 ID 与语法、通过config.json控制注释切换与括号自动补全、通过typst.tmLanguage.json实现 markup 与 code 双上下文的 TextMate 高亮规则的并掌握通过符号链接安装该扩展的具体方法及其维护状态。扩展的定位与维护状态根据 tools/support/README.md 的说明该扩展为 Typst 提供最小化minimal的语言支持内容仅包含两样东西一份语法定义TextMate grammar用于语法高亮一份语言配置language configuration用于注释切换、括号自动关闭等编辑器行为。README 同时给出了三条明确的使用前提这也是读者在评估是否采用前必须了解的事实该扩展最初是为 Typst 自身的开发目的而创建的created for development purposes only主要服务于 Typst 仓库内部开发者编辑.typ文件它当前不被维护且官方承认其语法规则存在 bugIt is not maintained and its grammar is buggy官方建议有日常编辑需求的用户改用第三方更积极维护的Tinymist 扩展本仓库内的tools/support应视为轻量兜底方案而非正式编辑器产品。从仓库结构看tools/目录下与 VS Code 生态相关的还有 tools/test-helper 扩展——这是一个帮助管理 Typst 测试套件的辅助扩展二者都属于仓库开发工具链的一部分而非发行给终端用户的组件。扩展清单package.json 如何声明一个 Typst 语言package.json 是整个扩展的入口清单虽然只有 29 行但完整覆盖了 VS Code 语言扩展所需的最小字段集。基本元信息字段值说明nametypst扩展标识名displayNameTypst编辑器中显示的名称descriptionTypst Language Support.扩展用途描述version0.0.1版本号为初始占位值侧面印证 README 中未正式维护的定位engines.vscode^1.53.0要求 VS Code 1.53 及以上版本categories[Programming Languages]声明为编程语言类扩展语言注册contributes.languages清单在contributes.languages中注册了 Typst 语言languages: [ { id: typst, aliases: [Typst, typst], extensions: [.typ], configuration: ./config.json } ]这一节做了四件事id: typst确定语言标识符后续语法、主题覆盖、语言特定设置都以此为锚点aliasesTypst与typst两种写法都可用于编辑器状态栏的语言切换器extensions: [.typ]把.typ文件后缀绑定到该语言。仓库中大量.typ源文件如 tests/suite 下的测试用例、docs 下的文档源文件即依赖此绑定获得高亮configuration: ./config.json指向下一节要详细解析的语言行为配置文件。语法注册contributes.grammarsgrammars: [ { language: typst, scopeName: source.typst, path: ./typst.tmLanguage.json } ]它将typst语言与 TextMate 语法文件绑定并声明了顶层作用域名source.typst。这一点与 typst.tmLanguage.json 末尾的scopeName: source.typst字段相互呼应——两个文件中的 scopeName 必须一致语法主题才能正确命中规则。语言行为配置config.json 全字段解析config.json 是 VS Code 语言配置协议Language Configuration的标准文件共 29 行定义了 Typst 在编辑器中的交互行为。逐项说明如下。注释定义commentscomments: { lineComment: //, blockComment: [/*, */] }行注释前缀为//编辑器中Ctrl/注释切换即基于此块注释定界符为/* ... */支持 VS Code 的块注释插入与切换。括号配对bracketsbrackets: [ [[, ]], { 实际为 [{, }], [(, )] ]声明了三组结构性括号用于编辑器的括号跳转、选中扩展等功能。自动闭合对autoClosingPairsautoClosingPairs: [ { open: [, close: ] }, { open: {, close: } }, { open: (, close: ) }, { open: \, close: \, notIn: [string] }, { open: $, close: $, notIn: [string] } ]三组括号之外还有两个与 Typst 语义直接相关的配置双引号自动闭合且notIn: [string]限定只在字符串作用域之外触发避免在字符串内部再次输入时被错误补全美元符号$自动闭合——这是针对 Typst 数学定界符的专门配置在正文中敲入$时会自动补上闭合$方便快速包裹行内数学。自动闭合字符autoCloseBeforeautoCloseBefore: $ \n\t表示$、空格、换行符与制表符这些字符出现前会先触发未闭合括号的自动闭合。将$列入其中同样是服务于在数学表达式结束处自然收束定界符的编辑体验。环境包裹对surroundingPairssurroundingPairs: [ [[, ]], [{, }], [(, )], [\, \], [*, *], [_, _], [, ], [$, $] ]当光标位于一段选中文字之间时输入该对的左侧字符会用整对符号包裹选区。除常规括号与引号外特别纳入了*、_、、$四组——它们正好对应 Typst 标记语言中的粗体*text*、斜体_text_、原始文本/代码块反引号、数学定界符四种行内语法使得选中一段文字后直接敲_变斜体这类操作可以一步完成。高亮引擎typst.tmLanguage.json 语法结构详解typst.tmLanguage.json 是一份标准 TextMate 语法定义共约 382 行也是该扩展的核心资产。它的整体组织方式如下顶层 patterns → #markup入口 repository: ├─ comments 注释规则块注释 行注释 ├─ common 公共 include目前仅注释 ├─ markup 正文markup 上下文规则集 ├─ code 代码code 上下文规则集 ├─ constants 常量与字面量规则集 └─ arguments 函数参数规则集顶层只有一条{include: #markup}见 typst.tmLanguage.json#L3-L5意味着所有规则都从 markup 上下文出发进入#代码区后再切换到 code 上下文——这与 Typst 标记中嵌代码、代码中嵌标记的双层语法结构完全对应。双上下文设计markup 与 code 的切换markup 规则集末尾#L206-L209有一条兜底规则{ name: meta.block.content.typst, begin: #, end: \\s, patterns: [{ include: #code }] }它把#之后的代码段交给#code规则集处理而 code 上下文#L217-L228又反过来处理两种嵌套容器{...}代码块 → 递归进入#code[...]内容块 → 递归切回#markup。这种双向递归使语法能够正确区分#let x [正文]中的正文部分与代码部分例如#let title Hello #show heading.where(level: 1): set text(size: 14pt) 第一章 这是 **粗体**、*斜体*、raw 文本与 $x^2$ 数学。 figure-labelfigure-label #enum(items) { item text[item] }注释规则的一个细节markup 上下文的行注释规则#L17-L21使用了负向后顾(?!:)//{ name: comment.line.double-slash.typst, begin: (?!:)// }要求//前不能紧跟冒号目的是避免把http://这类 URL 中的斜杠误判为行注释起始markup 中另有独立的 URL 高亮规则#L80-L82。而 code 上下文中的//注释#L231-L235则没有这个限制因为 Typst 代码区里//就是纯粹的注释。markup 上下文覆盖的典型语法点从 typst.tmLanguage.json 的 markup 规则集#L30-L212可以核对以下 Typst 正文语法均被覆盖语法作用域 / 匹配位置转义字符\*\#\_及\u{...}等constant.character.escape.content.typstL34-L36手动换行\\punctuation.definition.linebreak.typstL38-L40不换行空格~、软连字符-?punctuation.definition.nonbreaking-space.typst等L41-L48破折号--/---、省略号...punctuation.definition.en-dash.typst等L49-L60符号引用:sym:如:star:constant.symbol.typstL62-L64粗体*text*/ 斜体_text_markup.bold.typst/markup.italic.typst且支持内部再递归#markupL66-L78URL 高亮markup.underline.link.typstL80-L82原始文本反引号行内与 块级markup.raw.inline.typst/markup.raw.block.typstL84-L94数学定界$...$string.other.math.typstL96-L100标题 一级标题markup.heading.typstentity.name.section.typstL102-L108无序/有序/描述列表punctuation.definition.list.*.typstL110-L123标签label与引用labelentity.other.label.typst/entity.other.reference.typstL125-L133语句#let / #set / #show / #context / #import / #include / #export / #if各自keyword.*作用域块体递归#codeL135-L186控制流#for / #while / #break / #continue / #returnkeyword.control.*.typstL159-L186函数名#name(...)/#name[...]entity.name.function.typstL188-L192函数调用参数区复用#arguments规则集L194-L199变量插值#varentity.other.interpolated.typstL200-L204code 上下文与常量体系code 规则集#L213-L314处理裸代码如{ ... }块内中的词法单元分隔符与运算符,:分隔符与..运算符 ! 关系运算符 - * / 赋值运算符算术运算符 * / -其中减号用负向后顾排除标识符内部的-以及and / or / not逻辑字面运算符关键字let as in set show context、if else、for while break continue、import include export、return全部有对应的keyword.*规则函数识别两条entity.name.function.typst规则分别匹配标识符后跟[或(的函数调用以及show 选择器函数模式下的被绑定函数名#L286-L294兜底变量任何未被前述规则命中的标识符都归入variable.other.typst#L303-L305。constants 规则集#L315-L370则把 Typst 的字面量做成了完整的常量家族常量类型匹配示例作用域none/auto关键字常量constant.language.none.typst/constant.language.auto.typst布尔值truefalseconstant.language.boolean.typst长度10pt1.5em2in12mm0.5cmconstant.numeric.length.typst角度90deg1.5radconstant.numeric.angle.typst百分比50%constant.numeric.percentage.typst弹性单位1frconstant.numeric.fr.typst整数含进制420xFF0b1010o7constant.numeric.integer.typst浮点数3.141e-3constant.numeric.float.typst字符串含转义a\nb\u{..}等 |string.quoted.double.typst值得注意的是fr、长度单位与角度单位在这里都有独立的高亮作用域——这与 Typst 语言本身把12pt、50%、1fr作为带类型数值一等公民的设计相呼应也让基于作用域的自定义主题可以分别给不同量纲着色。arguments 规则集#L371-L379负责函数参数列表的高亮以:结尾的标识符被标记为variable.parameter.typst具名参数/参数标签其余部分继续按 code 规则处理。安装方式符号链接法README 给出的唯一安装方式是符号链接The simplest way to install this extension (and keep it up-to-date) is to add a symlink from~/.vscode/extensions/typst-supporttopath/to/typst/tools/support.即把用户目录下的 VS Code 扩展挂载点~/.vscode/extensions/typst-support软链到本地仓库中的tools/support目录。这一方式有两个直接好处始终与仓库代码同步软链指向的是源码目录本身对语法文件的任何改动在编辑器侧无需重装即可生效适合 Typst 仓库内部开发时边改语法边验证不产生副本仓库中不存在打包/发布流程从清单中也没有 marketplace 发布相关字段看可以推断该扩展未走扩展市场分发软链是最省事的挂载方式。Windows 用户若需实现同样效果可使用管理员权限的mklink /D创建目录符号链接。需要再次强调 README 的告诫由于官方明确其仅用于开发目的、不再维护、语法存在 bug对高亮质量有更高要求的日常写作场景建议转向第三方 Tinymist 扩展。在仓库中的位置与验证方式结合仓库现状可以这样理解该组件的边界它不参与编译管线根 Cargo.toml 的 workspace members 为crates/*、docs、tests等tools/下的两个扩展均独立于 Rust 工作区仅供编辑器侧使用它是纯声明式资源全部功能由三个 JSON 文件表达清单、语言行为、语法规则没有可执行代码因此运行它的方式就是让 VS Code 加载这个目录语法覆盖是否有效可以用仓库中现成的.typ文件直接验证——例如打开 tests/suite/foundations 或 docs/content/tutorial 下的任一 Typst 源文件观察标题、数学、#set语句与12pt类常量是否获得预期高亮仓库对开发者的相关提示还散见于 tests/src/args.rs建议用code --diff在 VS Code 中查看测试 diff与 tests/README.md介绍tools/test-helper扩展说明tools/目录整体是 Typst 团队内部开发工作流的配套工具。小结tools/support用一个不到 400 行的 TextMate 语法、一个 29 行的语言配置和一个 29 行的扩展清单搭出了 Typst 在 VS Code 中的最小可用语言体验语言 ID 与.typ后缀绑定、注释/括号/数学定界符的编辑行为、以及 markup 与 code 双上下文递归的高亮体系。它当前的官方定位是开发用、未维护的兜底方案日常重度使用建议参考官方推荐的第三方 Tinymist 扩展但作为理解 Typst 语法在编辑器侧如何被表达的一份活文档这三个 JSON 文件值得任何想要自定义 Typst 主题或构建自己编辑器集成的开发者逐条阅读。【免费下载链接】typstA markup-based typesetting system that is powerful and easy to learn.项目地址: https://gitcode.com/GitHub_Trending/ty/typst创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →