首页
/ Zed 中 C 开发环境配置指南:Roslyn / csharp-ls / OmniSharp 语言服务器选择与调优

Zed 中 C 开发环境配置指南:Roslyn / csharp-ls / OmniSharp 语言服务器选择与调优

2026-09-06 18:33:03作者:蔡怀权

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.jsonlanguages 段(约 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.mdlsp 小节)支持两类下发时机:

  • 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_componentsdotnet_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.mdsettings/initialization_options 写法的统一要求。

自定义 Roslyn 可执行文件

binary 块用于指定服务器二进制:正常情况下 Zed 会自动下载或从 PATH 中查找 roslyn-language-server;当你需要固定版本、指向本地构建产物或追加启动参数时,可覆盖 patharguments。文档示例使用 ["--stdio", "--autoLoadProjects"],其中 --stdio 表示以 stdio 通道与编辑器通信,--autoLoadProjects 让服务器自动加载工作区中的项目,此后可继续追加服务器支持的其它参数。关于 binary 更完整的字段(如 envignore_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 组则为诊断加载问题提供 debugModesolutionLoadDelay 两个开关。

OmniSharp 配置

OmniSharp 的配置最为精简——它主要通过命令行参数驱动,Zed 侧仅需指定二进制路径并传入 LSP 模式参数:

{
  "lsp": {
    "omnisharp": {
      "binary": {
        "path": "/path/to/OmniSharp",
        "arguments": ["-lsp" /* 追加更多参数 */]
      }
    }
  }
}

其中 -lsp 让 OmniSharp 以语言服务器协议模式运行(这是 Zed 与其通信的前提)。OmniSharp 的其它行为多由其自身的 omnisharp.json 等配置文件管理,故 Zed 设置中不再重复暴露。

配置文件位置与生效范围

上述 languageslsp 配置应写入 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)后生效。

调优与排障建议

基于上面三套配置模板,实际项目中的典型操作路径如下:

  1. 先装扩展再改服务器:通过 Extensions 面板安装 C# 扩展,确认语法高亮与默认的 Roslyn 已工作;
  2. 大工程降负载:将 csharp|background_analysisdotnet_analyzer_diagnostics_scopedotnet_compiler_diagnostics_scope 收敛到 openFiles,并关闭不需要的 inlay hints / CodeLens 项;
  3. 统一团队代码风格:用 csharp|code_style.formatting.indentation_and_spacing 锁死缩进(Zed/C# 约定 4 空格),必要时开启 dotnet_organize_imports_on_format 在保存格式化时整理 using;
  4. 排查服务器故障:通过命令面板的 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.jsonCSharplanguage_servers 默认值直接验证;更通用的 language_serverslspbinary 配置规则见 docs/src/configuring-languages.mddocs/src/reference/all-settings.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.81 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
920
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.79 K
1.02 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
390