尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何用 vscode-textmate 加载语法文件:JSON 与 PLIST 两种格式全攻略

如何用 vscode-textmate 加载语法文件:JSON 与 PLIST 两种格式全攻略 如何用 vscode-textmate 加载语法文件JSON 与 PLIST 两种格式全攻略【免费下载链接】vscode-textmateA library that helps tokenize text using Text Mate grammars.项目地址: https://gitcode.com/gh_mirrors/vs/vscode-textmatevscode-textmate 是一个用来按 TextMate 语法对代码进行分词Tokenize的开源库也是 VS Code 语法高亮的底层引擎之一。对于想自己搭建编辑器、代码高亮工具或语法调试器的开发者来说如何用 vscode-textmate 加载语法文件是入门第一步。本文将带你一次搞懂 JSON 与 PLIST 两种语法文件格式的加载方法、核心 API 和避坑要点全程无门槛跟着做就能跑通。vscode-textmate 支持哪两种语法文件格式TextMate 语法文件本质上是一套描述如何给文本打标签的规则历史上主要有两种载体格式文件扩展名特点JSON 格式.json结构清晰、可读性好社区新语法多用它PLIST 格式.plist/.tmLanguageXML 结构历史久远老语法包常用它vscode-textmate 对两种格式通吃你不需要自己判断文件类型它内部会自动识别。核心判断逻辑在 src/parseRawGrammar.ts只要传入的文件路径以.json结尾就走 JSON 解析器否则走 PLIST 解析器。快速开始三步完成语法文件加载第一步安装依赖vscode-textmate 本身只负责语法解析正则匹配依赖 oniguruma 引擎所以还要装vscode-onigurumanpm install vscode-textmate vscode-oniguruma第二步初始化 Registry 并加载语法加载语法的入口是Registry它负责按scopeName作用域名如source.js找到并缓存语法规则。核心代码如下const vsctm require(vscode-textmate); const oniguruma require(vscode-oniguruma); const fs require(fs); // 加载 oniguruma 的 wasm 引擎 const wasmBin fs.readFileSync( ./node_modules/vscode-oniguruma/release/onig.wasm ).buffer; const onigLib oniguruma.loadWASM(wasmBin).then(() ({ createOnigScanner(patterns) { return new oniguruma.OnigScanner(patterns); }, createOnigString(s) { return new oniguruma.OnigString(s); } })); // 创建 RegistryloadGrammar 回调负责按 scopeName 返回语法内容 const registry new vsctm.Registry({ onigLib: onigLib, loadGrammar: (scopeName) { if (scopeName source.js) { const content fs.readFileSync(./JavaScript.json, utf8); return vsctm.parseRawGrammar(content, ./JavaScript.json); } return null; } }); registry.loadGrammar(source.js).then((grammar) { console.log(语法加载成功, grammar.scopeName); });第三步用 tokenizeLine 对代码分词加载成功后调用grammar.tokenizeLine(line, prevState)逐行分词ruleStack用于跨行状态传递let ruleStack vsctm.INITIAL; const line function sayHello(name) {; const result grammar.tokenizeLine(line, ruleStack); result.tokens.forEach((token) { console.log(token.startIndex, token.endIndex, token.scopes.join(, )); }); ruleStack result.ruleStack;你会看到类似source.js, meta.function.js, storage.type.function.js这样的作用域输出这正是语法高亮的基础数据。JSON 与 PLIST 语法文件加载的核心差异parseRawGrammar 自动识别格式parseRawGrammar(content, filePath)是两种格式统一的人口。它只认扩展名不检查文件内容所以路径后缀一定要写对否则会解析失败。相关实现见 parseRawGrammar.ts。传入xxx.json→ 使用 JSON 解析器传入xxx.plist或xxx.tmLanguage→ 使用 PLIST 解析器JSON 语法文件长什么样JSON 语法文件就是一份普通的 JSON 对象包含scopeName、patterns、repository等字段。项目测试夹具里有一个非常直观的例子 hello.json核心结构如下{ name: hello, scopeName: source.hello, patterns: [ { match: hello, name: prefix.hello }, { match: world(!?), name: suffix.hello } ] }PLIST 语法文件长什么样PLIST 是 XML 风格用dict、key、array、string标签描述同样的规则。见测试夹具 66.plist?xml version1.0 encodingUTF-8? plist version1.0 dict keyscopeName/key stringtext.test/string keypatterns/key array dict keybegin/keystring^./string keyname/keystringcomment/string /dict /array /dict /plist加载语法文件的常见坑与解决方法坑一oniguruma 引擎没加载好vscode-textmate 的所有正则匹配都要走 onigurumaonigLib必须返回一个 Promise 对象且必须包含createOnigScanner和createOnigString两个方法缺一不可。定义见 onigLib.ts。坑二scopeName 对不上loadGrammar回调里要根据scopeName精确匹配。语法文件里的scopeName字段和回调参数不一致时会返回null此时控制台会输出Unknown scope name提示。正确的分发逻辑可以参考 registry.ts。坑三文件路径后缀写错.json文件路径不带.json后缀传入parseRawGrammar会被当成 PLIST 解析而报错。这是新手最容易踩的坑务必把完整文件名传进去。深入vscode-textmate 加载语法的内部原理弄懂原理后排查问题会轻松很多。整个加载链路是这样的Registry.loadGrammar(scopeName)发起加载见 main.ts回调loadGrammar返回原始语法内容JSON 或 PLIST 对象parseRawGrammar根据扩展名解析成统一的IRawGrammar结构解析结果存入SyncRegistry并处理include引用的其他语法如source.js引用了source.js.regexp最终创建出Grammar实例供tokenizeLine调用。其中依赖处理很有意思当某个语法include了外部语法时Registry会通过ScopeDependencyProcessor自动递归加载无需你手动处理。这也是它能支持复杂语法包的原因。加载语法文件的实用建议新项目优先用 JSON 格式结构更清晰也方便写测试断言项目自带测试 tokenization.test.ts 就是直接读 JSON 语法做断言。老语法包直接给路径从网上拿到的.tmLanguage或.plist语法包无需转换直接把文件名传给parseRawGrammar即可。想要报错定位开启调试模式后JSON/PLIST 解析会附带行列位置信息$vscodeTextmateLocation排查语法错误非常有用实现见 json.ts。性能敏感场景PLIST 解析器是专为速度优化的极简实现见 plist.ts两者性能差异不大按格式偏好选择即可。总结如何用 vscode-textmate 加载语法文件核心就一句话装好vscode-oniguruma创建Registry在loadGrammar回调里用parseRawGrammar(content, filePath)解析并返回语法内容。JSON 与 PLIST 两种格式都由parseRawGrammar根据文件扩展名自动识别无需额外转换。掌握本文的加载流程和三个常见坑你就能在自己的编辑器或高亮工具里顺利接入 TextMate 语法了。【免费下载链接】vscode-textmateA library that helps tokenize text using Text Mate grammars.项目地址: https://gitcode.com/gh_mirrors/vs/vscode-textmate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表