必须先确保本地 crystal CLI 可用且版本 ≥ 1.12.0,能正常运行 crystal tool lsp 和 crystal tool format;再配置 .crystalconfig 启用 LSP,正确设置 VSCode 工作区根路径与 executablePath,方可启用补全、格式化、调试等功能。

Crystal 在 VSCode 里跑不起来、没补全、格式化失效、调试断点不命中——这些问题 90% 都不是插件没装对,而是 crystal CLI 本身不可用或版本太低。必须先让它在终端里能跑通 crystal tool lsp 和 crystal tool format,后面所有功能才可能生效。
确认 crystal CLI 可用且 ≥ 1.12.0
VSCode 的 Crystal 扩展(比如 crystal-lang-tools.crystal-lang)只是个壳,真正干活的是你本地的 crystal 命令。它得能响应 crystal tool lsp 这类子命令,否则 LSP 直接瘫痪。
- 在 VSCode 集成终端里运行
which crystal,输出必须是有效路径(如/opt/homebrew/bin/crystal),不能是空或command not found - 运行
crystal --version,确认输出 ≥1.12.0;低于此版本会缺失crystal tool lsp,补全和跳转全挂 - Mac M 系列用户常见坑:
brew install crystal默认装到/opt/homebrew,但 VSCode 启动时可能没加载该路径,需在settings.json显式设"crystal.executablePath": "/opt/homebrew/bin/crystal" - Linux 用户若手动编译安装,务必把
bin/目录加进$PATH,并验证crystal env能正常输出 SDK 路径
启用 LSP 补全:必须配 .crystalconfig,不是靠扩展开关
很多用户装完扩展就以为“自动有 Ruby 风格提示”,结果输 String. 没反应——因为默认关闭语义分析。扩展不会自动开 LSP,必须项目级声明。
- 在项目根目录新建文件
.crystalconfig(注意开头是点,无后缀) - 内容只能是合法 JSON:
{"lsp": true, "auto-reload": true},多一个逗号或引号都会让 LSP 启动失败 - 保存后,打开任意
.cr文件,状态栏右下角应显示Crystal (via LSP),不是Crystal - 若仍无补全,直接在终端运行
crystal tool lsp --help测试命令是否可执行;不可执行说明编译器安装损坏或权限不对
tasks.json 区分 crystal run 和 crystal build,别混用
crystal run 是解释+编译+执行三合一,适合开发期快速验证;crystal build 输出原生二进制,适合交付。两者参数、错误提示、problemMatcher 都不同,混用会导致“报错不跳转”或“生成文件却没运行”。
- 要一键运行当前脚本:用
crystal run ${file},搭配"problemMatcher": ["$crystal"],错误行可直接点击跳转 - 要生成可执行文件:用
crystal build ${file} -o ${fileBasenameNoExtension},注意-o参数必须指定,否则默认输出到./crystal-run-xxx临时路径 - Web 开发常用场景:在
src/下写server.cr,用crystal run快速启动;改完代码后 Ctrl+S → Cmd+Shift+B 触发任务,比切终端快得多
格式化与调试:别依赖全局 crystal-fmt,优先走项目本地
crystal tool format 是官方工具,但版本不一致会导致格式差异甚至崩溃。Web 项目常含 shard.yml,推荐用 shards 管理本地依赖,而非全局安装 crystal-fmt。
- 项目根目录执行
shards init(若无shard.yml),再添加crystal-fmt依赖,然后shards install - VSCode 设置中启用
"editor.formatOnSave": true,并确保"[crystal]": {"editor.defaultFormatter": "crystal-lang-tools.crystal-lang"} - 调试 Web 服务(如 Kemal 或 Amber):用
crystal build生成二进制,launch.json中"program"指向该文件,"type": "cppdbg"配lldb(macOS)或gdb(Linux);别用crystal run直接调试,它不支持完整断点链
最易被忽略的一点:Crystal 的 LSP 启动依赖项目根目录下的 .crystalconfig,且该文件必须在你打开的 VSCode 工作区根路径下——如果用 File → Open Folder 打开的是 src/ 子目录,LSP 就找不到配置,补全立刻失效。











