lpc for snail
《最强蜗牛》服务器 LPC 语言的 VSCode 语言服务插件。
提供语法高亮、跳转到定义(函数 / 宏 / 变量 / 参数)、函数列表、语法检查、公式文件(formula*.txt)支持等 IDE 级别能力,专为最强蜗牛 LPC 工程定制。
功能一览
🎨 语法高亮
为 .c / .h / formula*.txt 文件提供完整的 LPC 语法着色:
- 预处理指令:
#define / #include / #ifdef / #ifndef / #endif / #if / #elif / #else / #undef / #pragma,含指令行内注释、\ 续行感知
- 关键字:
loop / upto / downto / in / catch / inherit,以及 C 风格流程控制 if/else/for/while/do/switch/case/default/break/continue/return
- 类型:
void / int / float / string / buffer / mapping / array / mixed / object / function / BOOL,及可选类型 type?
- 修饰符:
public / private / protected / override / nosave / const / static / varargs
- 预定义常量:
TRUE / FALSE / UNDEFINED / EMPTY_MAPPING / EMPTY_ARRAY 等
- 运算符:
-> / => / :: / $< / ... / ..(范围)及全部赋值 / 比较 / 逻辑 / 位运算符
- 字符串:普通双引号字符串、三引号字符串
"""P..."""P
- 字面量:数组
({...})、mapping ([...])、十六进制 / 浮点数
- 闭包:
(: ... :) 语法块
- efun:80+ 内置函数关键字高亮
- 注释:
// 行注释、/* */ 块注释
🧭 跳转到定义(Ctrl+Click / F12)
智能上下文感知,按 9 级优先级解析跳转目标:
| 场景 |
示例 |
| 函数内局部变量 |
点击变量 → 跳到它的声明处 |
| 函数参数 |
点击参数 → 跳到 input: 行并聚焦该参数 |
| 公式宏 |
CALC_NEWBIE_BONUS → formula.txt 的 [CALC_NEWBIE_BONUS] 段(而非 formula.h) |
| 普通宏引用 |
RACE_TYPE_YAYA → 定义它的 .h 文件 |
inherit MACRONAME; |
inherit F_COMN_DBASE; → 宏定义所在的 .h |
| 父类调用 |
::query() → inherit 父类中的 query() |
| 守护进程方法 |
CONFIG_D->get_config() → /gs/daemons/configd.c |
| 当前文件函数 |
is_user() → 同文件内定义 |
| 跨文件全局搜索 |
同名函数跨工作区查找 |
📋 函数列表(Outline / Ctrl+P @)
- 当前文件所有函数定义(含前向声明)自动显示在 VSCode 大纲视图
- 函数签名详情:
override public string? get_service_thread()
- 变量显示类型与修饰符:
nosave mapping pets
- 函数体内局部变量 / 参数作为子节点显示
Ctrl+P 输入 @ 快速跳转到函数
- 快捷键
Ctrl+K(macOS Cmd+K)打开函数列表
🔍 语法检查(诊断)
| 检查项 |
级别 |
说明 |
| 未知类型 |
Warning |
校验 int/string/mapping 等合法类型及 type? 可选类型 |
| 缺少分号 |
Error |
基于解析器错误恢复检测 |
| 未使用变量 |
Hint |
符号表遍历检查,自动跳过 nosave/const |
最强蜗牛的公式 DSL 文件([SECTION] + input: + output: + LPC body):
- 复用 LPC 文法着色(关键字 / 类型 / 函数 / 注释)
- 括号匹配、
// 注释切换
- Ctrl+Click 跳转:公式宏跳到对应
[SECTION] 段;公式内局部变量跳声明、参数跳 input 行
- 服务端跳过诊断(公式 DSL 非合法 LPC,避免误报刷屏)
⌨️ 自动补全与悬停
- 自动补全:efun 内置函数、当前文件函数 / 全局变量、函数内局部变量与参数、宏名;触发字符
. > : ( "
- 悬停信息:函数签名、变量类型、efun 签名、宏定义值
🗂 工作区索引
- 启动时扫描工作区全部
.c / .h,构建跨文件符号索引
- 支持多工作区目录(如
fog_server + fog_new 同时索引)
- 支持虚拟路径 ↔ 物理路径映射,跨根跳转
快捷键
| 快捷键 |
功能 |
Ctrl+Click / F12 |
跳转到定义 |
Ctrl+K(macOS Cmd+K) |
显示当前文件函数列表 |
Shift+F12 |
查找引用 |
命令面板
| 命令 |
说明 |
LPC: Go to Symbol |
显示函数列表 |
LPC: Rebuild Workspace Index |
重建工作区索引 |
配置项
在工作区根目录放置 lpc-project.json 配置项目结构:
{
"name": "最强蜗牛 - LPC 项目",
"workspaceFolders": [
{
"name": "fog_server",
"path": "server_scripts/",
"virtualPathMappings": {
"/gs/": "gs/",
"/global/": "global/"
},
"includePaths": ["global/include/", "gs/include/"],
"macroHeaderFiles": ["global/include/global_config.h", "gs/include/config.h"]
}
]
}
| 字段 |
说明 |
workspaceFolders[].path |
相对工作区根的 server_scripts 路径 |
virtualPathMappings |
LPC 虚拟路径到物理路径的映射 |
includePaths |
#include <...> 搜索路径 |
macroHeaderFiles |
预加载的宏定义头文件 |
VSCode 设置项:
| 设置 |
默认值 |
说明 |
lpc.trace.server |
off |
语言服务通信日志(off / messages / verbose) |
lpc.maxNumberOfProblems |
100 |
单文件最大诊断数量 |
lpc.projectConfig |
lpc-project.json |
项目配置文件路径 |
已知限制
- 预处理器条件编译(
#ifdef 等)的内容不跳过,全部解析(指令行已空白化,不影响解析)
- 仅字符串字面量的
call_other 支持跳转
- 每次启动全量扫描,大项目首次加载较慢(索引持久化待后续版本)
反馈与贡献
- 架构与实现细节见 DOC.md
- 问题反馈:在仓库提交 Issue
License
MIT
| |