Zed 中 C 开发环境配置指南:Roslyn / csharp-ls / OmniSharp 语言服务器选择与调优
C# 是 Zed 通过扩展机制提供的语言支持之一,语法高亮基于 Tree-sitter 文法,而补全、诊断、跳转与重构等语义能力则交给语言服务器完成。Zed 默认启用 Roslyn(roslyn-language-server),同时兼容 csharp-ls 与 OmniSharp,本文围绕 docs/src/languages/csharp.md 这一官方文档,系统讲解如何在 Zed 中安装扩展、切换语言服务器,并逐项说明 Roslyn、csharp-ls、OmniSharp 三类服务器的 Zed settings.json 配置写法与取值含义。读完你可以在自己的 Zed 配置中独立完成 C# 工程的服务器选型与代码风格调优。
C# 支持从何而来:扩展 + Tree-sitter + LSP
在 Zed 中,C# 的语言支持并非内置于编辑器本体,而是通过 C# 扩展 提供。当前仓库(docs/src/languages.md 中列出的受支持语言均遵循该模式)的扩展目录只包含 glsl、html、proto、test-extension 等样例,C# 扩展需要通过 Zed 内置的扩展面板(Extensions,默认快捷键 zed::Extensions)检索并安装。其技术组成包括:
- Tree-sitter 文法:负责 C# 源码的语法树解析与语法高亮,对应社区维护的 tree-sitter-c-sharp 文法。
- 语言服务器(LSP):提供代码补全、实时诊断(errors/warnings)、跳转到定义、查找引用、悬停信息、重命名与重构等语义功能,对应文档列出以下三种可选实现:
- roslyn-language-server:基于微软 Roslyn 编译器平台,能力最全,Zed 默认启用;
- csharp-ls:轻量级 LSP 服务器,适合对启动开销敏感的场景;
- OmniSharp(omnisharp-roslyn):老牌跨平台 C# 语言服务,同样基于 Roslyn。
三种服务器共享同一套 LSP 协议通道,因此切换成本很低——只需调整一处配置。
默认语言服务器与切换方法
Zed 出厂默认配置里已经为 CSharp 预置了服务器优先级列表,见仓库 assets/settings/default.json 中 languages 段(约 2328 行起):
"CSharp": {
"language_servers": ["roslyn", "!csharp-ls", "!omnisharp", "..."]
}
含义是:Roslyn 排在首位并默认生效,csharp-ls 与 OmniSharp 默认被禁用(! 前缀表示排除)。若想改用 csharp-ls 或 OmniSharp,在你的 Zed 用户设置中加入如下覆盖:
{
"languages": {
"CSharp": {
"language_servers": ["csharp-ls", "!roslyn", "!omnisharp", "..."]
}
}
}
设置语言名称时请注意:Zed 中该语言的配置名是 "CSharp",而不是 "C#"。
关于 language_servers 列表的完整语义,可参考 docs/src/configuring-languages.md:
- 列表整体替换默认值,而不是追加合并。因此若你未显式写
"!csharp-ls",那么原本默认被禁用的 csharp-ls 会被"..."重新启用。 - 不带
!前缀写出名字 = 启用并提升到对应位置;带!= 明确禁用。 "..."是一个通配占位符,展开为“该语言已注册但尚未被本列表提及的全部服务器”,展开发生在"..."所在的位置。这样后续新安装的扩展若注册了新的 C# 语言服务器,也会被自动纳入。- 若要完全锁死候选集,省略
"..."即可——此时只有你显式列出的服务器会被使用。
切换完成后可在状态栏观察 LSP 状态按钮(对应 docs/src/reference/all-settings.md 中的 global_lsp_settings.button)确认当前实际运行的服务器。
Roslyn 深度配置:settings 键逐组解析
Roslyn 相关的 Zed 配置放在 lsp.roslyn 之下。Zed 的 lsp 配置结构(见 docs/src/reference/all-settings.md 的 lsp 小节)支持两类下发时机:
initialization_options:仅在服务器启动时下发一次,改动后需重启语言服务器;settings:可运行时反复查询/生效,Roslyn、csharp-ls 的配置都应放在这里。
Roslyn 的配置键使用 csharp|组名 作为分组前缀,内层的 dotnet_* / csharp_* 键名与 Roslyn/VS 系的编辑器选项一一对应。官方文档给出的完整默认配置如下:
{
"lsp": {
"roslyn": {
"settings": {
// 默认值如下所示,另有可选取值会一并注明。
"csharp|symbol_search": {
"dotnet_search_reference_assemblies": true
},
"csharp|type_members": {
"dotnet_member_insertion_location": "atTheEnd", // 或 "withOtherMembersOfTheSameKind"
"dotnet_property_generation_behavior": "preferThrowingProperties" // 或 "preferAutoProperties"
},
"csharp|completion": {
"dotnet_show_name_completion_suggestions": true,
"dotnet_provide_regex_completions": true,
"dotnet_show_completion_items_from_unimported_namespaces": true,
"dotnet_trigger_completion_in_argument_lists": true
},
"csharp|quick_info": {
"dotnet_show_remarks_in_quick_info": true
},
"csharp|navigation": {
"dotnet_navigate_to_decompiled_sources": true,
"dotnet_navigate_to_source_link_and_embedded_sources": true
},
"csharp|highlighting": {
"dotnet_highlight_related_json_components": true,
"dotnet_highlight_related_regex_components": true
},
"csharp|inlay_hints": {
"dotnet_enable_inlay_hints_for_parameters": true,
"dotnet_enable_inlay_hints_for_literal_parameters": true,
"dotnet_enable_inlay_hints_for_indexer_parameters": true,
"dotnet_enable_inlay_hints_for_object_creation_parameters": true,
"dotnet_enable_inlay_hints_for_other_parameters": true,
"dotnet_suppress_inlay_hints_for_parameters_that_differ_only_by_suffix": true,
"dotnet_suppress_inlay_hints_for_parameters_that_match_method_intent": true,
"dotnet_suppress_inlay_hints_for_parameters_that_match_argument_name": true,
"csharp_enable_inlay_hints_for_types": true,
"csharp_enable_inlay_hints_for_implicit_variable_types": true,
"csharp_enable_inlay_hints_for_lambda_parameter_types": true,
"csharp_enable_inlay_hints_for_implicit_object_creation": true,
"csharp_enable_inlay_hints_for_collection_expressions": true
},
"csharp|code_style.formatting.indentation_and_spacing": {
"tab_width": 4,
"indent_size": 4,
"indent_style": "space" // 或 "tab"
},
"csharp|code_style.formatting.new_line": {
"end_of_line": "...", // 平台相关默认值
"insert_final_newline": false
},
"csharp|background_analysis": {
"dotnet_analyzer_diagnostics_scope": "default", // 或 "none"、"openFiles"、"fullSolution"
"dotnet_compiler_diagnostics_scope": "openFiles" // 或 "fullSolution"
},
"csharp|code_lens": {
"dotnet_enable_references_code_lens": false,
"dotnet_enable_tests_code_lens": false
},
"csharp|auto_insert": {
"dotnet_enable_auto_insert": true
},
"csharp|projects": {
"dotnet_binary_log_path": null,
"dotnet_enable_automatic_restore": true,
"dotnet_enable_file_based_programs": true,
"dotnet_enable_file_based_programs_when_ambiguous": true
},
"csharp|formatting": {
"dotnet_organize_imports_on_format": false
}
},
"binary": {
"path": "/path/to/roslyn-language-server",
"arguments": ["--stdio", "--autoLoadProjects" /* 追加更多参数 */]
}
}
}
}
各配置组的实用价值
| 配置组 | 控制内容 | 关键开关与推荐取值 |
|---|---|---|
csharp|symbol_search |
符号搜索是否包含引用程序集 | dotnet_search_reference_assemblies |
csharp|type_members |
生成/插入成员(如实现接口)的位置与属性风格 | 插入位置 atTheEnd(或按同类成员归组 withOtherMembersOfTheSameKind);属性生成偏好 preferThrowingProperties(或 preferAutoProperties) |
csharp|completion |
补全行为细粒度开关 | 名称补全建议、正则补全、来自未导入命名空间的补全项、参数列表中触发补全 |
csharp|quick_info |
悬停 Quick Info 是否附带 remarks 说明 | dotnet_show_remarks_in_quick_info |
csharp|navigation |
跳转能力:能否跳进反编译源码、能否利用 Source Link 与嵌入源码 | 两个 dotnet_navigate_to_* 开关默认均开启 |
csharp|highlighting |
是否高亮 JSON/正则等内嵌组件的相关片段 | dotnet_highlight_related_json_components、dotnet_highlight_related_regex_components |
csharp|inlay_hints |
行内提示:参数名、字面量/索引器/对象创建参数、以及类型提示的细分开关 | dotnet_* 系列控制参数类提示,csharp_enable_inlay_hints_for_* 系列控制类型类提示(含隐式变量类型、Lambda 参数、隐式对象创建、集合表达式);另有三个 suppress_* 开关用于抑制冗余参数提示 |
csharp|code_style.formatting.* |
缩进与换行风格 | tab_width/indent_size/indent_style(space/tab);end_of_line 平台相关、insert_final_newline |
csharp|background_analysis |
后台诊断范围 | Analyzer 诊断 default(可换 none/openFiles/fullSolution);编译器诊断 openFiles(或 fullSolution)。将作用域收到 openFiles 可明显降低大工程的后台开销 |
csharp|code_lens |
CodeLens:引用计数与测试状态行 | 默认关闭,可按需开启 |
csharp|auto_insert |
自动插入配对结构(括号/引号等闭合符) | dotnet_enable_auto_insert |
csharp|projects |
工程加载行为 | dotnet_binary_log_path(默认为 null,指向 Roslyn 二进制日志路径);dotnet_enable_automatic_restore 自动还原;两个 file_based_programs 开关控制无工程文件时的文件级编译模式 |
csharp|formatting |
格式化时机 | dotnet_organize_imports_on_format 控制在格式化时整理 using |
需要注意:与 VS Code 中"点分字符串键"(如
"csharp.formatting.tabWidth")的写法不同,Zed 要求使用嵌套对象结构与csharp|组名这种分组键。这也是 docs/src/configuring-languages.md 对settings/initialization_options写法的统一要求。
自定义 Roslyn 可执行文件
binary 块用于指定服务器二进制:正常情况下 Zed 会自动下载或从 PATH 中查找 roslyn-language-server;当你需要固定版本、指向本地构建产物或追加启动参数时,可覆盖 path 与 arguments。文档示例使用 ["--stdio", "--autoLoadProjects"],其中 --stdio 表示以 stdio 通道与编辑器通信,--autoLoadProjects 让服务器自动加载工作区中的项目,此后可继续追加服务器支持的其它参数。关于 binary 更完整的字段(如 env、ignore_system_version),可参考 docs/src/configuring-languages.md 的"Configuring Language Servers"一节。
csharp-ls 配置
若选择 csharp-ls 作为 C# 语言服务器,其配置同样位于 lsp 段下,键名为 csharp-ls。默认值与可选值如下:
{
"lsp": {
"csharp-ls": {
"binary": {
"path": "/path/to/csharp-ls",
"arguments": [
/* 追加更多参数 */
]
},
"settings": {
// 以下为默认值
"logLevel": "information",
"applyFormattingOptions": false,
"analyzersEnabled": false,
"useMetadataUris": true,
"razorSupport": false,
"solutionPathOverride": null,
"locale": null,
"debug": {
"debugMode": false,
"solutionLoadDelay": null
}
}
}
}
}
各选项的作用从键名可清晰推断:logLevel 控制日志详细程度;applyFormattingOptions 决定是否采纳来自格式化选项(如 .editorconfig/.settings)的风格约束;analyzersEnabled 控制是否运行 Roslyn Analyzer(默认关闭可换取更快启动);useMetadataUris 决定元数据(反编译)跳转使用的 URI 形式;razorSupport 用于开启 Razor 场景支持;solutionPathOverride 可强制指定要加载的 .sln 路径(默认为 null,即自动发现);locale 用于本地化输出;debug 组则为诊断加载问题提供 debugMode 与 solutionLoadDelay 两个开关。
OmniSharp 配置
OmniSharp 的配置最为精简——它主要通过命令行参数驱动,Zed 侧仅需指定二进制路径并传入 LSP 模式参数:
{
"lsp": {
"omnisharp": {
"binary": {
"path": "/path/to/OmniSharp",
"arguments": ["-lsp" /* 追加更多参数 */]
}
}
}
}
其中 -lsp 让 OmniSharp 以语言服务器协议模式运行(这是 Zed 与其通信的前提)。OmniSharp 的其它行为多由其自身的 omnisharp.json 等配置文件管理,故 Zed 设置中不再重复暴露。
配置文件位置与生效范围
上述 languages 与 lsp 配置应写入 Zed 的 JSON 设置文件。按 docs/src/configuring-languages.md 的说明,Zed 支持两级配置:
- 用户级:全局用户设置文件(Linux 通常为
~/.config/zed/settings.json,macOS 为~/Library/Application Support/Zed/settings.json),对所有工程生效; - 项目级:工程根目录下的
.zed/settings.json,仅对当前工程生效,适合针对某个解决方案单独指定服务器或风格。
所有语言级设置也可在 settings.json 顶层全局设置,语言级条目会整体替换而非合并顶层默认值,语言服务器配置同理。若改动涉及 initialization_options 类参数,需要重启语言服务器(或重启 Zed)后生效。
调优与排障建议
基于上面三套配置模板,实际项目中的典型操作路径如下:
- 先装扩展再改服务器:通过 Extensions 面板安装 C# 扩展,确认语法高亮与默认的 Roslyn 已工作;
- 大工程降负载:将
csharp|background_analysis的dotnet_analyzer_diagnostics_scope与dotnet_compiler_diagnostics_scope收敛到openFiles,并关闭不需要的 inlay hints / CodeLens 项; - 统一团队代码风格:用
csharp|code_style.formatting.indentation_and_spacing锁死缩进(Zed/C# 约定 4 空格),必要时开启dotnet_organize_imports_on_format在保存格式化时整理 using; - 排查服务器故障:通过命令面板的
zed::OpenLog打开日志查看 LSP 启动报错,确认binary.path指向真实存在的可执行文件;若需要拉长服务器响应超时或隐藏状态按钮,可调整 docs/src/reference/all-settings.md 中描述的global_lsp_settings(如request_timeout,默认 120 秒)。
以上配置示例全部来自 docs/src/languages/csharp.md,Roslyn 为默认服务器的事实可由 assets/settings/default.json 中 CSharp 的 language_servers 默认值直接验证;更通用的 language_servers、lsp、binary 配置规则见 docs/src/configuring-languages.md 与 docs/src/reference/all-settings.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00