sublime text 不原生支持 f#,需手动安装 fsharp 语法包实现 .fs/.fsx 高亮,配置 dotnet fsi 构建系统(含正确 file_regex 以支持错误跳转),并确保 .net sdk 6.0+ 已安装且 path 可见;.fs 文件应通过 dotnet build 编译,而非 fsc。

Sublime Text 本身不支持 F#,装完就写不了——必须手动配语法高亮、构建系统、路径和文件后缀规则,缺一不可。核心难点不在“会不会”,而在“哪一步没对导致静默失败”。
怎么让.fs和.fsx文件有正确语法高亮
Sublime 默认对 .fs 和 .fsx 文件完全无识别,连关键字都不变色。必须装第三方语法包:
- 用
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)调出命令面板,输入Install Package回车 - 搜索
FSharp(作者是fsharp-sublime),安装它 - 打开任意
.fs或.fsx文件,右下角点击当前语法名 → 选F#;或按Ctrl+Shift+P输入Set Syntax: F# - 如果仍高亮错乱,检查是否被其他插件劫持(比如某个 OCaml 语法包会把
.fs当作 OCaml 文件处理)
为什么按 Ctrl+B 没反应或报 command not found: dotnet
因为 Sublime 不知道 dotnet 在哪,也不是所有系统 PATH 都对它可见:
- 先在终端运行
dotnet --version,确认已安装 .NET SDK 6.0+(fsharpi已废弃,别试) - Windows 用户:如果从开始菜单启动 Sublime,它可能读不到 PowerShell 或 CMD 的 PATH,建议从终端执行
subl启动编辑器 - macOS/Linux 用户:若
which dotnet输出为空,说明未加入 shell 配置(如~/.zshrc),需补上export PATH="$HOME/.dotnet:$PATH" - 实在不行,在构建系统里硬写绝对路径:
"cmd": ["C:\Program Files\dotnet\dotnet.exe", "fsi", "$file"](Windows)或"shell_cmd": "/usr/local/share/dotnet/dotnet fsi "$file""(macOS)
构建系统怎么写才不会输出空白或跳转错行
关键不是“能跑”,而是“报错能双击跳转”。F# 错误格式是 test.fsx(5,12–5,18),正则必须匹配这个结构:
- Windows 构建系统(保存为
Packages/User/FSharp.sublime-build):{ "cmd": ["dotnet", "fsi", "$file"], "selector": "source.fsharp", "file_regex": "^(.*?):([0-9]+):([0-9]+)-([0-9]+):([0-9]+)", "working_dir": "$file_path" } - macOS/Linux 必须用
shell_cmd,否则含空格路径会崩:{ "shell_cmd": "dotnet fsi "$file"", "selector": "source.fsharp", "file_regex": "^(.*?):([0-9]+):([0-9]+)-([0-9]+):([0-9]+)", "working_dir": "$file_path" } -
file_regex里四个数字分组分别对应:文件名、起始行、起始列、结束行、结束列——少一个就跳不到准确位置 - 确保脚本文件以
.fsx结尾,.fs是编译单元,dotnet fsi不认
想编译成可执行文件?别在 Sublime 里硬刚 fsc
直接在构建系统里塞 fsc 参数几乎必败:
-
fsc不是独立构建工具,它不解析 NuGet 包、不处理依赖树、不生成入口点——你得手动加--reference列出所有 DLL,路径稍错就报error FS0193 - 真正可行的路径是:用
dotnet new console -lang F#初始化项目,Sublime 只负责编辑.fs文件,构建交给终端dotnet build - 如果坚持在 Sublime 里一键构建,可以写个新构建系统调用
dotnet build,但必须保证当前文件在合法项目根目录下(即存在.csproj或Directory.Build.props)
最易被忽略的一点:PowerShell 默认执行策略会阻止 dotnet fsi 运行脚本,Windows 用户首次运行可能卡住不动,临时解法是终端里先跑一次 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser。











