Forge
csharpdeeb25a2
1using System.IO;
2using System.Threading;
3using System.Threading.Tasks;
4using Avalonia.Threading;
5using CascadeIDE.Services.Lsp;
6
7namespace CascadeIDE.ViewModels;
8
9/// <summary>Запуск/перезапуск Markdown LSP.</summary>
10public partial class MainWindowViewModel
11{
12 /// <summary>Варианты Markdown LSP (настройки).</summary>
13 public IReadOnlyList<string> MarkdownLspProviderOptionsList => MarkdownLspProviderIds.All;
14
15 public bool IsMarkdownLspProcessSelected =>
16 !string.Equals(_markdownLspProvider, MarkdownLspProviderIds.Off, StringComparison.OrdinalIgnoreCase);
17
18 private string _markdownLspProvider = MarkdownLspProviderIds.Off;
19 private string _markdownLspExecutable = "";
20 private string _markdownLspArguments = "";
21
22 /// <summary><see cref="MarkdownLspProviderIds"/>.</summary>
23 public string MarkdownLspProvider
24 {
25 get => _markdownLspProvider;
26 set
27 {
28 var v = string.IsNullOrWhiteSpace(value) ? MarkdownLspProviderIds.Off : value.Trim();
29 if (!SetProperty(ref _markdownLspProvider, v))
30 return;
31 _settings.Languages.Markdown.SetMode(v);
32 SaveSettingsIfChanged();
33 OnPropertyChanged(nameof(IsMarkdownLspProcessSelected));
34 _ = RestartMarkdownLanguageServerAsync();
35 }
36 }
37
38 public string MarkdownLspExecutable
39 {
40 get => _markdownLspExecutable;
41 set
42 {
43 var v = value ?? "";
44 if (!SetProperty(ref _markdownLspExecutable, v))
45 return;
46 _settings.Languages.Markdown.SetLaunchOverrides(_markdownLspProvider, v, _markdownLspArguments);
47 SaveSettingsIfChanged();
48 _ = RestartMarkdownLanguageServerAsync();
49 }
50 }
51
52 public string MarkdownLspArguments
53 {
54 get => _markdownLspArguments;
55 set
56 {
57 var v = value ?? "";
58 if (!SetProperty(ref _markdownLspArguments, v))
59 return;
60 _settings.Languages.Markdown.SetLaunchOverrides(_markdownLspProvider, _markdownLspExecutable, v);
61 SaveSettingsIfChanged();
62 _ = RestartMarkdownLanguageServerAsync();
63 }
64 }
65
66 private async Task RestartMarkdownLanguageServerAsync()
67 {
68 try
69 {
70 var snap = await UiScheduler.Default.InvokeAsync(() =>
71 {
72 _workspaceDiagnostics.SetMarkdownLspDiagnosticsHost(null);
73 _markdownLspHost?.Dispose();
74 _markdownLspHost = null;
75 var markdownLsp = _settings.Languages.Markdown.ResolveForRuntime();
76 return (
77 Workspace.SolutionPath ?? "",
78 markdownLsp.Mode,
79 markdownLsp.Executable,
80 markdownLsp.Arguments);
81 });
82
83 if (string.Equals(snap.Item2, MarkdownLspProviderIds.Off, StringComparison.OrdinalIgnoreCase))
84 return;
85 if (string.IsNullOrWhiteSpace(snap.Item1) || !File.Exists(snap.Item1))
86 return;
87
88 var host = new MarkdownLspDiagnosticsHost();
89 var ok = await host.TryStartAsync(snap.Item2, snap.Item1, snap.Item3, snap.Item4, CancellationToken.None)
90 .ConfigureAwait(false);
91
92 await UiScheduler.Default.InvokeAsync(() =>
93 {
94 if (!ok)
95 {
96 host.Dispose();
97 return;
98 }
99
100 _markdownLspHost = host;
101 _workspaceDiagnostics.SetMarkdownLspDiagnosticsHost(host);
102 foreach (var d in Documents.OpenDocuments)
103 {
104 if (d.FilePath.EndsWith(".md", StringComparison.OrdinalIgnoreCase)
105 || d.FilePath.EndsWith(".markdown", StringComparison.OrdinalIgnoreCase))
106 host.EnsureOpened(d.FilePath, d.Content ?? "");
107 }
108 });
109 }
110 finally
111 {
112 await UiScheduler.Default.InvokeAsync(PublishIdeHostLspToDataBusAndRebuild);
113 }
114 }
115}
116
View only · write via MCP/CIDE