Visual Studio Code 无法格式化 C# 代码

111
我创建了一个新文件,设置了C#语言,并编写了一些代码。然后按下 Ctrl + Shift + F (或F1格式化文档),结果出现错误:

抱歉,但未安装“csharp”文件的格式化程序。

我也安装了C#扩展,但没有帮助。 Visual Studio Code版本为1.18.0。

1
请查看此扩展:https://github.com/OmniSharp/omnisharp-vscode - Laslos
规范是 *如何在Visual Studio Code中格式化代码?*,但不幸的是,没有一个答案回答了这个问题。 - Peter Mortensen
1
只需通过命令面板选择当前项目:Omnisharp > 选择项目。 - ilyas varol
20个回答

81
如果您像我一样将prettier作为默认格式化程序,则应执行以下操作:
  1. 使用以下快捷键打开vscode设置:ctrl + ,,或者enter image description here

  2. 然后点击“打开设置(JSON)”:enter image description here

  3. 这是您应该粘贴下面的代码段的地方。

这是我的配置:

{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "[csharp]": {
    "editor.defaultFormatter": "ms-dotnettools.csharp"
  }
}

为了应用此配置,您需要 c# 扩展。


1
只是好奇,你是如何找到ms-dotnettools.csharp相关信息的? - Orson
1
基本上只是在浏览VSCode Intellisense(建议),然后尝试了一下,结果有效。 - ezhupa99
1
基本上,您告诉格式化程序在C#中使用ms-dotnettools.csharp,在其他任何语言中使用esbenp.prettier-vscode。我猜Prettier目前没有C#格式化程序。周围可能会有插件... - knnhcn
1
谢谢,我也遇到了同样的问题,prettier默认尝试格式化它。 - jvbs
1
你还应该添加"editor.formatOnSave": true,这样可以在保存时格式化代码。 - Tobias Koller
显示剩余2条评论

37

这 对 我 很 有用。

注意: 如果 它 是 true,那么 取消 复选框 并 再次 将其 设置为 true。之后,您 必须 重新启动 Visual Studio Code。

菜单 文件首选项设置

输入图像描述


26
在Windows系统中是Shift+Alt+F,在Ubuntu系统中是Ctrl+Shift+I。 - James L.
谢谢 - 我使用 Visual Studio 扩展程序,使“Format”热键与大型兄弟 IDE 相同。我推荐它。C# FixFormat 扩展程序仅适用于 Mac 上的 C# ~3/4/5 Unity 引擎项目。 - Chazt3n
3
谢谢指出“(需要重启)”这一点,我完全没注意到。 - software_writer
2
对我不起作用,在重启后仍然要求我为C#文件选择格式化程序。 - serge

26

使用OmniSharp的Visual Studio Code在没有.csproj文件的情况下无法格式化C#代码。

您可以使用.NET Core SDK中的dotnet new console创建一个新项目。


2
文件名也必须使用TitleCase格式。 - Chase
1
你的意思是“不包括”,如果我打开一个文件夹,而不是sln或csproj文件,但编辑后的cs文件最终属于一个csproj文件,那该怎么办? - serge

10

尝试为您的项目创建一个OmniSharp配置文件,以允许您自定义C#代码的格式。
在项目根目录(靠近.sln文件)中创建omnisharp.json文件。

{
  "FormattingOptions": {
    "newLine": "\n",
    "useTabs": false,
    "tabSize": 4,
    "indentationSize": 4
  }
}

注意: 确认omnisharp.json中的更新后,你应该重新加载vscode (ctrl+shift+p -> 开发人员: 重新加载窗口)。

有关OmniSharp配置的更多信息: https://www.strathweb.com/2017/01/c-code-formatting-settings-in-vs-code-and-omnisharp/


这里有一个完整的 omnisharp.json 示例以及其他信息。 - not2qubit
这绝对是最好、最简单的解决方案。只有一个想法,我编辑了 %USERPROFILE%/.omnisharp/ 目录下的 omnisharp.json 文件,以便所有会话都可以使用这些设置,而不仅仅是当前的会话。你可以在这里找到官方文档。 - Trasd

8
  1. 浏览Visual Studio Code扩展库,确保已安装C#扩展 ms-dotnettools.csharp

    VS Code extensions pane showing C# OmniSharp extension

  2. 按下Ctrl + ,打开设置面板。将editor.formatOnType设置为启用。在我的Visual Studio Code中,默认情况下未启用此功能。

    VS Code settings window with editor.formatOnType setting

  3. 重新启动Visual Studio Code。现在当您完成带有分号的行或关闭作用域的外部括号时,它应该自动格式化代码。

注意:这是编辑器的全局设置,因此它可能会为其他语言启用自动格式化,而不仅仅是C#。

该过程在Visual Studio Code版本1.43.1上进行测试。


2
无需求信息,无法为“format on type”格式提供翻译。 - serge

6

据我所知,由Omnisharp驱动的C#扩展程序没有包含格式化程序。

您可以安装C# FixFormat。这对我很有帮助,但是其格式化效果不如Visual Studio IDE。


我也刚发现这个。原来,这是唯一的选择。 - andoral
3
Omnisharp包含一个C#格式化程序。只需确保从文件夹内打开文件-请参阅我的答案:https://dev59.com/VlYN5IYBdhLWcg3wfoNj#59154222 - Yaniv
@Yaniv,你如何避免类似prettier这样的格式化工具干扰OmniSharp的格式化器? - Jacques
1
到了2020年,FixFormat仍然像以前一样糟糕。我希望我可以真正使用VS Code来开发Blazor项目,但实际上并不是这样。其中一个主要问题是提供的格式非常糟糕。没有好的插件,Blazor和Razor文件被视为昨天才发明的东西。但在FixFormat中最糟糕的事情是用来描述选项的英语非常糟糕。有很多“空格或制表符:是或否”之类的无意义的东西。所以使用VS Community。仍然有很多很多的错误,但至少格式几乎是可配置的。 - Harry
2
此扩展现已从市场中下架。 - Aizzat Suhardi
1
此扩展现已从市场下架。您可以选择卸载它。是的,对于未来的读者也是同样的信息。我很遗憾错过了这个。 - granadaCoder

6

我发现还有另一个设置干扰了C#格式。

"omnisharp.useEditorFormattingSettings": true

将其设置为false,可以解决我的缩进问题。

4
我找不到这个特定的设置,但我发现如果选择“Omnisharp: 选择项目”,然后选择我的项目,我的格式就会被解决。 - Tim Newton
1
尝试了所有其他解决方案后,终于有用了!原来当我从命令行切换到另一个项目时,VSCode实际上并没有改变当前项目。 - tintin
这对我也起作用了,谢谢。 - Maxim Zhukov
非常感谢这个…… - Shivam

4
更新到Visual Studio Code 1.20.1并重新启用OmniSharp后,问题已得到解决。
只需在工作区设置中将"csharp.format.enable"设置为"true"(如果它已经是true但仍未正常工作,请将其更改为false,然后再更改为true)。

1
"csharp.format.enable": true 对我没用,我不得不安装 c# FixFormat,但是它要求我关闭 csharp.format.enable,而这个选项本来就没有效果,很奇怪。 - rraallvv
在我的情况下,更改制表符大小参数导致格式化程序丢失,并且只有设置"csharp.format.enable": true才能修复它。我只安装了C#(by Omnisharp) - Serg

3
如果您仍然遇到此问题,请注意 OmniSharp 扩展程序在未从文件夹中打开的 .cs 文件上表现不佳( 从这里 )。为了解决此问题,请确保您从文件夹中打开所需的文件(Ctrl+K+Ctrl+O):

Enter image description here

然后格式化将起作用(以及其他OmniSharp功能)。

6
这对我不起作用。我已安装并更新了OmniSharp扩展,并在VSCode中打开了一个文件夹。然后我通过在左侧面板上单击打开.cs文件,但当我尝试格式化它时,它告诉我没有安装格式化程序。 - Micah Zoltu
如果完全没有文件怎么办?我只需打开一个新的编辑器,粘贴一些源代码并想要格式化它。例如,我经常这样做处理JSON数据,并且可以正常工作。但是对于C#代码,由于某种原因无法正常工作。我已经安装了“ms-dotnettools.csharp”扩展。 - David Ferenczy Rogožan
你是什么意思说“表现良好”? - serge

2
打开 vscode 并前往输出 > vs code 的输出
如您所见,输出已设置为任务。将其更改为 OmniSharp 日志,并检查是否显示 dotnet 版本不受支持的消息。如果是,则更新您的 dotnet 版本。希望这能有所帮助。

它报错说我正在使用旧版本的.Net(~3.0.1),安装了.Net SDK 6.0后,错误消失了! - Redar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接