只有sumneko.lua能当语言服务器,因其是唯一完整实现lsp的lua服务,支持luadoc类型推导、跨文件require追踪、嵌入式环境全局变量识别及多版本语法兼容;emmylua等仅为静态文本扫描器。

必须用 sumneko.lua 作为语言服务器,其他插件(包括 EmmyLua、Lua by castorini)无法提供可靠语法分析、跳转或诊断能力——它们连 require 路径解析都做不了,table.unpack 报红、utf8.len 标黄是常态。
为什么只有 sumneko.lua 能当语言服务器
sumneko.lua 是目前唯一基于 Language Server Protocol(LSP)完整实现的 Lua 语言服务器。它能:
- 解析
luadoc注释并推导类型 - 跨文件追踪
require和变量定义 - 识别嵌入式环境(如 LOVE2D、xLua)中导出的全局变量
- 支持 Lua 5.1–5.4 及 LuaJIT 的语法差异(比如
goto、utf8模块、string.match新参数)
EmmyLua 等老插件只是文本扫描器,不启动任何后台服务;你看到的“补全”其实是静态关键字匹配,cc.Node 或 love.graphics.draw 根本不会出现。
lua.runtime.path 配错,语言服务器就起不来
状态栏右下角没出现 Lua (running),说明服务器根本没启动。最常见原因是 lua.runtime.path 指向错误:
- 必须指向可执行文件,例如:
/usr/local/bin/lua(macOS/Linux)或C:\Program Files\Lua\lua.exe(Windows,注意双反斜杠或正斜杠) - 不能指向目录,也不能写成
C:lua这种不带文件名的路径 - 终端里先运行
lua -v确认能输出版本,再配这个字段 - 即使系统 PATH 已包含
lua,VSCode 设置里仍建议显式指定——否则 fallback 到 Lua 5.1 行为,导致新语法全标红
改完后打开任意 .lua 文件,看状态栏是否出现 Lua (running);没有就别往下走。
.luarc.json 里 runtime.path 不配,require 就永远标红
sumneko.lua 默认只扫描工作区根目录下的 ?.lua 和 ?/init.lua,完全不读取运行时的 package.path。你项目结构是 src/utils/string.lua,写 require "utils.string",它直接报 Module not found。
- 在项目根目录建
.luarc.json - 写入
"runtime.path": ["src/?.lua", "src/?/init.lua"](路径相对于工作区根目录,不是当前文件) - 多个路径按数组顺序查找,优先级从左到右
- 如果用 Lua 5.4+,必须加
"runtime.version": "Lua 5.4",否则table.pack等新 API 会误报 - 改完后执行命令
Restart Lua Server(Ctrl+Shift+P输入即可),不用重启 VSCode
调试功能需要另一个插件:lua-debug
sumneko.lua 只负责语言服务(补全、跳转、诊断),断点、变量监视、调用栈这些必须靠 actboy168.lua-debug。两个插件缺一不可:
- 装完
lua-debug后,按Ctrl+Shift+D→「create a launch.json file」→ 选lua,生成基础模板 -
"type": "lua"必须小写,不能写成luajit或debug - 游戏脚本调试一律用
"request": "attach",不是launch;否则起的是独立进程,访问不到游戏内存和 API - 如果调试 xLua 或 Cocos Creator,还需额外加
.d.lua类型声明文件,否则xlua.或cc.补全为空
最容易被忽略的是:所有配置项(runtime.path、runtime.version、diagnostics.globals)都该写在项目根目录的 .luarc.json 里,而不是全局 settings.json——后者会污染其他项目,且对 require 路径无效。











