必须手动配置语法包、构建系统和.net sdk 6.0+三者缺一不可;仅安装fsharp-sublime插件并设置语法为f#,再确保构建系统中selector为source.fsharp、file_regex匹配f#错误格式、cmd/shell_cmd调用dotnet fsi,且path正确继承。

不能直接运行,必须手动配语法包 + 构建系统 + .NET SDK 6.0+,三者缺一不可。装错插件、用错命令、PATH没继承,都会导致高亮不生效、Ctrl+B无反应、错误点不了行号。
怎么让 .fs 和 .fsx 文件一打开就高亮
默认右下角显示 Plain Text,说明 Sublime 根本没识别出这是 F#。这不是代码问题,是语法定义没加载。
- 用
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS)调出命令面板,输入Install Package回车 - 搜
FSharp,只安装作者明确为fsharp-sublime的那个包——别选FSharpSyntax或带OCaml字样的泛用包,它们会把.fs当 OCaml 处理,导致关键字变色错乱、缩进崩溃 - 安装后打开任意
.fs或.fsx文件,右下角点击语法名 → 选F#;或直接按Ctrl+Shift+P输入Set Syntax: F# - 若仍不生效,进
Preferences → Package Settings → FSharp → Settings,确认"extensions"数组里有"fs"和"fsx"(注意是复数,不是extension)
为什么 Ctrl+B 运行 .fsx 报 dotnet not found 或空白输出
这不是 PATH 没配好,而是 Sublime 构建系统默认不继承 shell 的环境变量——终端里 dotnet --version 能跑,不代表 Sublime 能看见它。
- 先在终端执行
dotnet --version,必须 ≥ 6.0;再跑dotnet fsi --version确认交互式环境可用(fsharpi已彻底废弃,任何含它的构建配置都会失败) - Windows 用户:建议从终端启动 Sublime(比如
subl),否则开始菜单启动时大概率读不到 PowerShell 的 PATH;若必须用开始菜单启动,可临时绕过执行策略:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - macOS/Linux 用户:运行
which dotnet,若无输出,把export PATH="$HOME/.dotnet:$PATH"加到~/.zshrc或~/.bash_profile,然后source一下 - 实在不行,在构建系统里硬写绝对路径:
"cmd": ["C:\Program Files\dotnet\dotnet.exe", "fsi", "$file"](Windows)或"shell_cmd": "/usr/local/share/dotnet/dotnet fsi "$file""(macOS)
构建系统怎么写才支持双击跳转错误行
file_regex 不匹配 F# 实际报错格式,就等于白配——点击错误信息不会跳到对应位置。
- F# 错误典型格式是
test.fsx(5,12–5,18),即文件名 + 括号内“起始行,起始列–结束行,结束列” - Windows 构建系统必须用
"cmd"字段,且"selector"必须是source.fsharp(不是source.fs或空值),否则 Sublime 不会在你打开.fsx时自动激活该构建系统 - macOS/Linux 必须用
"shell_cmd",且需加引号避免空格路径崩:"shell_cmd": "dotnet fsi "$file"" - 推荐的
file_regex:"file_regex": "^(.*?):([0-9]+):([0-9]+)-([0-9]+):([0-9]+)",四个数字分组分别对应:文件名、起始行、起始列、结束行、结束列
为什么不能用 fsharpi,必须用 dotnet fsi
fsharpi 在 .NET 6+ 中已彻底移除,不是路径问题,是工具链淘汰了。
- 任何还写
fsharpi "$file"的构建配置都会失败,错误如The term 'fsharpi' is not recognized或command not found -
dotnet fsi是当前唯一受支持的交互式执行方式,能正确加载#r引用、处理#load、兼容 F# 6+ 特性(如无分号推断、管道运算符) - 注意:构建系统仅支持
.fsx后缀,.fs文件无法直接运行,只能用于模块/库开发
最容易被忽略的是 selector 值和 file_regex 的精确匹配——前者决定构建系统是否自动启用,后者决定错误能否点击跳转。这两处写错,其他全对也白搭。











