如何为VSCode的GML(GameMaker)语言扩展添加变量名自动补全功能?
GML变量自动补全最简实现方案
你不需要实现完整的Language Server,基于VSCode的registerCompletionItemProviderAPI加轻量词法分析即可完成需求,整体实现代码不超过200行:
基础实现步骤
- 注册补全提供者
在插件的激活逻辑中注册GML文件的补全提供者,指定触发字符为大小写字母、下划线,匹配GML变量命名规则:
vscode.languages.registerCompletionItemProvider('gml', { provideCompletionItems(document, position) { // 补全逻辑写在这里 } }, ...'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_')
- 提取全局变量
插件启动时遍历工作区所有script文件夹下的.gml文件,用正则匹配所有var声明的变量,存入全局变量池:
const globalVarRegex = /var\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*[=;]/g // 遍历script文件夹下所有文件匹配变量,存入globalVars数组
- 提取当前作用域局部变量
每次触发补全时,先获取光标前的所有文本,从光标位置反向遍历匹配大括号嵌套层级,确定当前所在{...}代码块的范围,在该范围内用相同正则匹配所有var声明的局部变量,存入局部变量池。 - 组装补全项返回
将全局变量、局部变量分别标记为不同类型的补全项返回,可通过标签区分变量作用域:
const completionItems = [] // 全局变量补全项 globalVars.forEach(varName => { const item = new vscode.CompletionItem(varName, vscode.CompletionItemKind.Variable) item.detail = '全局变量' completionItems.push(item) }) // 局部变量补全项 localVars.forEach(varName => { const item = new vscode.CompletionItem(varName, vscode.CompletionItemKind.Variable) item.detail = '局部变量' completionItems.push(item) }) return completionItems
优化补充
- 处理边界情况:匹配大括号时跳过字符串、注释中的大括号,避免作用域判断错误
- 增量更新:监听
script文件夹下的文件修改事件,实时更新全局变量池,无需重启插件生效 - 你之前参考vscode-python的实现逻辑,它依赖第三方符号服务是因为Python语法复杂度高,GML语法规则简单,完全不需要额外依赖,自己实现轻量解析即可。
内容的提问来源于stack exchange,提问作者snowbound
相关产品推荐
相关产品推荐

