Свойство FormattingOptions
omnisharp.json
сопоставлено с экземпляром класса OmniSharp.Options.FormattingOptions
. Теперь вы можете взять этот исходный код и выполнить некоторые текстовые манипуляции с ним ...
- ... чтобы преобразовать инициализации свойств в конструкторе в JSON (например,
NewLine = "\n";
→ "NewLine": "\n",
), но тогда вы не получите никаких свойств, которые не были явно инициализированы. - ... для преобразования определений свойств в JSON (например,
public string NewLine { get; set; }
→ "NewLine": "",
), но тогда вы не получите значения по умолчанию.
... но я думаю, что лучший способ - просто создать экземпляр этого класса самостоятельно и проверить его свойства. Это можно легко сделать с помощью PowerShell (Core) .
Первое, что вам нужно сделать, это определить путь к сборке OmniSharp.Shared.dll
, содержащей класс OmniSharp.Options.FormattingOptions
. Начиная с вашего каталога установки расширений (%UserProfile%\.vscode\extensions
в Windows; ~/.vscode/extensions
в Mac / Linux), вы найдете его здесь ...
.vscode
extensions
ms-vscode
csharp-{major}.{minor}.{patch}
У меня v1.21.11 расширения ms-vscode.csharp
, установленного на Windows, поэтому мой путь к этой сборке C:\Users\UserName\.vscode\extensions\ms-vscode.csharp-1.21.11\.omnisharp\1.34.11\OmniSharp.Shared.dll
.
В сеансе PowerShell передайте этот путь команде, чтобы загрузить сборку. ..
PS> Add-Type -Path 'C:\Users\UserName\.vscode\extensions\ms-vscode.csharp-1.21.11\.omnisharp\1.34.11\OmniSharp.Shared.dll'
В случае успеха не выдаст выходных данных. Тогда вам просто нужно создать экземпляр FormattingOptions
, из которого имена свойств и значения по умолчанию будут отображаться на консоли ...
PS> New-Object -TypeName 'OmniSharp.Options.FormattingOptions'
OrganizeImports : False
EnableEditorConfigSupport : False
NewLine :
UseTabs : False
TabSize : 4
[snip]
Вы даже можете создать соответствующий JSON для Вы ...
PS> [PSCustomObject] @{ FormattingOptions = New-Object -TypeName 'OmniSharp.Options.FormattingOptions' } | ConvertTo-Json
{
"FormattingOptions": {
"OrganizeImports": false,
"EnableEditorConfigSupport": false,
"NewLine": "\n",
"UseTabs": false,
"TabSize": 4,
[snip]
}
}
... или записываете его непосредственно в файл по умолчанию omnisharp.json
в текущем каталоге ...
PS> [PSCustomObject] @{ FormattingOptions = New-Object -TypeName 'OmniSharp.Options.FormattingOptions' } | ConvertTo-Json | Set-Content -Path 'omnisharp.json'
Если PowerShell вам не подходит мог всегда создавать и отражать свойства экземпляра FormattingOptions
в такой маленькой программе, как эта ...
using System;
using System.Linq;
using System.Reflection;
namespace SO60131765
{
class Program
{
const string FormattingOptionsQualifiedTypeName = "OmniSharp.Options.FormattingOptions";
static int Main(string[] args)
{
try
{
if (args == null || !args.Any() || string.IsNullOrEmpty(args[0]))
throw new Exception($"The path to the assembly containing the {FormattingOptionsQualifiedTypeName} is required.");
else
{
object formattingOptions = CreateFormattingOptionsFromAssembly(args[0]);
WriteHeader();
WriteProperties(formattingOptions);
return 0;
}
}
catch (Exception ex)
{
Console.WriteLine($"ERROR: {ex.Message}");
return 1;
}
}
static object CreateFormattingOptionsFromAssembly(string assemblyPath)
{
Assembly assembly;
try
{
assembly = Assembly.LoadFrom(assemblyPath);
}
catch (Exception ex)
{
throw new Exception($"Assembly load failed with message \"{ex.Message}\".", ex);
}
object formattingOptions;
try
{
formattingOptions = assembly.CreateInstance(FormattingOptionsQualifiedTypeName);
}
catch (Exception ex)
{
throw new Exception($"Instantiating type {FormattingOptionsQualifiedTypeName} failed with message \"{ex.Message}\".");
}
if (formattingOptions == null)
throw new Exception($"A public type {FormattingOptionsQualifiedTypeName} was not found in the specified assembly.");
return formattingOptions;
}
static void WriteHeader()
{
string headerText = $"Public instance properties of type {FormattingOptionsQualifiedTypeName}";
Console.WriteLine(headerText);
Console.WriteLine(new string('=', headerText.Length));
}
static void WriteProperties(object formattingOptions)
{
PropertyInfo[] properties = formattingOptions.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
int longestPropertyNameLength = properties.Max(property => property.Name.Length);
string format = $"{{0,{longestPropertyNameLength}}}: {{1}}";
foreach (PropertyInfo property in properties)
{
object propertyValue = property.GetValue(formattingOptions);
string propertyValueText = propertyValue == null
? "<null>"
: propertyValue is string
? $"\"{propertyValue}\""
: propertyValue.ToString();
Console.WriteLine(format, property.Name, propertyValueText);
}
}
}
}
..., а затем выполнять его с путем к сборке OmniSharp.Shared.dll
. .
> SO60131765.exe "C:\Users\UserName\.vscode\extensions\ms-vscode.csharp-1.21.11\.omnisharp\1.34.11\OmniSharp.Shared.dll"
Public instance properties of type OmniSharp.Options.FormattingOptions
======================================================================
OrganizeImports: False
EnableEditorConfigSupport: False
NewLine: "
"
UseTabs: False
TabSize: 4
[snip]
Вышеупомянутая методика, вероятно, будет работать для других редакторов, использующих расширение на основе OmniSharp ; просто нужно найти, где хранится OmniSharp.Shared.dll
. Обратите внимание, что я не предоставляю полный текст по умолчанию omnisharp.json
, так что это не станет еще одним устаревшим источником для конфигурации копирования и вставки. Идея состоит в том, чтобы динамически запрашивать значения для вашей установленной версии OmniSharp.