DreamFXLang
工具链

VSCode 与模块索引

workspace 文件长什么样、VSCode 怎么被找到、跳转链接的规则,以及 .dfx-index.json 里为什么要有输入签名。

Open DreamFX Workspace

Tools ▸ DreamFX ▸ Open DreamFX Workspace (VSCode) 重写 DFX/DreamFX.code-workspace, 然后按 VSCode → 系统默认编辑器 → Notepad 的顺序启动它。

{
  "folders": [
    { "name": "DreamFX Source", "path": "." },
    { "name": "Plugin: DreamFX", "path": "../Plugins/DreamFX/DFX" }
  ],
  "settings": {
    "files.associations": { "*.dfs": "dreamfxlang", "*.dfe": "dreamfxlang", "*.dfm": "dreamfxlang" }
  },
  "extensions": {
    "recommendations": ["typedreammoon.dreamfxlang-language-support"]
  }
}

这个文件每次都被完整重写,从不合并。 手加的 launchtasks 块会丢。 个人配置放 DFX/.vscode/

项目根永远排第一、永远是 "." —— workspace 文件就住在里面,而稳定的 folder 标识能让 VSCode 的逐 folder 状态在重写后仍然挂得住。在另一个盘上的插件根在 Windows 上没有相对形式, 会写成绝对路径。

dreamfxlangDreamFXLang 扩展 注册的语言 id。这条关联无论扩展装没装都会写 —— 没装的话 VSCode 回退到纯文本,无害 —— 而推荐项是 VSCode 只提示一次、拒绝后不再提示的东西。

toast条件
DreamFX failed to create workspace: {Error}文件写不出去
Opened DreamFX workspace in VSCode: {Path}VSCode 起来了
Opened DreamFX workspace: {Path}系统默认编辑器起来了
Opened DreamFX workspace in Notepad: {Path}Notepad 起来了
DreamFX could not open workspace: {Path}每个启动器都失败

VSCode 是怎么找到的

Windows only,从最具体到最一般,第一个磁盘上存在的候选胜出:

#位置
1–2%LOCALAPPDATA%\Programs\Microsoft VS Code\{Code.exe, bin\code.cmd}
3–4%LOCALAPPDATA%\Programs\Microsoft VS Code Insiders\{Code - Insiders.exe, bin\code-insiders.cmd}
5–6%ProgramFiles%\Microsoft VS Code\{Code.exe, bin\code.cmd}
7–8%ProgramFiles(x86)%\Microsoft VS Code\{Code.exe, bin\code.cmd}
9每一个 PATH 条目,检查 code.cmdcode.exeCode.execode-insiders.cmdCode - Insiders.exe

打开一个 workspace 会遵守 Open Workspace In New Window 设置。打开一个文件永远传 --reuse-window -g <path>:<line>:<col> —— 每跳一条诊断就开一个新窗口没法用。

模块索引

pwsh -File Plugins/DreamFX/.skill/dfx.ps1 index

写出 DFX/.dfx-index.json:搜索路径暴露的每一个模块和动态输入,带它声明的栈、分类、描述和 输入签名。编辑器扩展读这个文件做补全和 hover —— 它没法去问引擎,因为每一次 dfx 调用都要 boot 引擎,而在有人正在打字的时候,任何要花几十秒的东西都不可接受。

两半的成本差得很远:

部分成本来源
栈与元数据免费资产的 usage 位掩码 —— 引擎自己的栈 UI 也是用它过滤的
输入签名探测出来的:资产层面的 schema 完全看不见内联 edit condition 和静态开关

本机实测:571 个模块,不探测 2.9 秒,带探测 8.1 秒。一个没有枚举形输入的补全列表比没有补全更糟, 所以这个成本是值得付的。

参数
-Out <path>写到别处
-NoInputs跳过探测。快,而且足够回答「有什么」
-Retry清空隔离名单重来 —— 引擎升级后用

有些模块图走不动。 /Niagara/Modules/Masks/ConeMask 会让引擎的遍历无限递归, 栈溢出结束进程。这趟走查是可续的:即将探测的模块先记下来,下次启动时还在记录里的被隔离。 dfx.ps1 会重跑直到走完。被隔离的模块保留名字、路径和栈,只缺输入 —— 而且它会说出来。

索引会记下引擎路径和启用插件列表,因为正是这两样让它失效:换个引擎就是另一套模块, 启用一个内容插件就多一整族。目前没有东西去比对它们(那需要一个活编辑器来比), 所以重建索引是一条命令,而不是被猜出来的动作。

提交与否

不要提交 DFX/.dfx-index.json:它带着本机的引擎路径。见目录与命名

本页目录