VSCode新语言基础支持只需language-configuration.json和tmLanguage.json两个文件:前者配置注释、括号匹配等编辑行为,后者通过TextMate语法实现高亮;须在package.json中正确声明contributes.languages。

VSCode 语言支持插件不是必须写 Language Server,多数场景用 language-configuration.json 和 tmLanguage.json 就能覆盖语法高亮、括号匹配、注释格式等基础能力;只有需要跳转、补全、悬停等智能功能时,才需引入 LSP。
怎么快速启用基础语法支持(不用写代码)
VSCode 对新语言的最低支持只需两个 JSON 文件,放在插件根目录的 syntaxes/ 和 language-configuration.json 中:
-
language-configuration.json控制编辑行为:比如comments定义单行/块注释符号,brackets声明配对符号(["{", "}"]),autoClosingPairs决定输入{是否自动补} -
tmLanguage.json(TextMate 语法)负责高亮:用正则匹配关键字、字符串、注释等;推荐用yo code生成骨架后,在Grammar Test扩展中实时预览效果 - 别漏掉
package.json里的contributes.languages声明:必须指定id、aliases、extensions,否则文件不会被识别为该语言
什么时候必须上 Language Server(LSP)
当用户开始抱怨“Ctrl+Click 跳不到定义”“没参数提示”“重命名不生效”——这些是编辑器无法靠静态配置完成的,必须走 LSP 协议。但注意:
- LSP 服务端可以不用 TypeScript 写:Python 用
pygls,Rust 用tower-lsp,甚至 Bash 脚本也能跑最小化 LSP(只要按 JSON-RPC 格式收发消息) - VSCode 客户端侧只需在
package.json的activationEvents中声明onLanguage:yourlang,再调用languages.registerCompletionItemProvider等 API 接入服务端能力 - 本地调试 LSP 服务端时,务必在
launch.json中加"console": "integratedTerminal",否则进程 stdout 不可见,错误会静默丢失
常见报错和对应解法
开发中卡住最多的是注册失败或能力不生效,典型现象和定位方式:
- 文件打开后仍是纯文本:检查
package.json中contributes.languages.id是否和contributes.grammars.language一致;VSCode 不区分大小写,但路径大小写敏感(尤其 macOS/Linux) - 高亮规则写了却没效果:
tmLanguage.json中的scopeName必须唯一且符合source.yourlang格式;用Developer: Inspect Editor Tokens and Scopes命令确认当前光标位置实际应用了哪个 scope - LSP 启动后无响应:看服务端是否监听了
stdio(VSCode 默认走 stdin/stdout),而非 TCP;错误日志优先查服务端进程输出,不是 VSCode 的 Developer Tools Console
真正难的不是写第一个插件,而是让不同能力协同工作:比如自定义折叠(foldingRules)依赖的缩进逻辑,可能和 LSP 提供的 textDocument/foldingRange 冲突;这种边界情况文档很少提,得靠 setBreakpoint 在 VSCode 源码里跟进去看它到底读了哪个字段。











