diff --git a/src/cm/lsp/clientManager.ts b/src/cm/lsp/clientManager.ts index e59a35024..409272097 100644 --- a/src/cm/lsp/clientManager.ts +++ b/src/cm/lsp/clientManager.ts @@ -18,6 +18,7 @@ import NotificationManager from "lib/notificationManager"; import Uri from "utils/Uri"; import { clearDiagnosticsEffect } from "./diagnostics"; import { documentHighlightsExtension } from "./documentHighlights"; +import { supportsBuiltinFormatting } from "./formattingSupport"; import { inlayHintsExtension } from "./inlayHints"; import { acodeRenameKeymap } from "./rename"; import { ensureServerRunning } from "./serverLauncher"; @@ -60,13 +61,6 @@ function safeString(value: unknown): string { return value != null ? String(value) : ""; } -const defaultKeymaps = keymap.of([ - ...formatKeymap, - ...acodeRenameKeymap, - ...jumpToDefinitionKeymap, - ...findReferencesKeymap, -]); - interface BuiltinExtensionsResult { extensions: Extension[]; diagnosticsExtension: Extension | LSPClientExtension | null; @@ -83,6 +77,7 @@ function buildBuiltinExtensions( diagnostics: includeDiagnostics = true, inlayHints: includeInlayHints = true, documentHighlights: includeDocumentHighlights = true, + formatting: includeFormatting = true, } = config; const extensions: Extension[] = []; @@ -90,7 +85,17 @@ function buildBuiltinExtensions( if (includeCompletion) extensions.push(serverCompletion()); if (includeHover) extensions.push(hoverTooltips()); - if (includeKeymaps) extensions.push(defaultKeymaps); + if (includeKeymaps) { + const bindings = [ + ...(includeFormatting ? formatKeymap : []), + ...acodeRenameKeymap, + ...jumpToDefinitionKeymap, + ...findReferencesKeymap, + ]; + if (bindings.length) { + extensions.push(keymap.of(bindings)); + } + } if (includeSignature) extensions.push(signatureHelp()); if (includeDiagnostics) { const diagExt = serverDiagnostics(); @@ -263,6 +268,7 @@ export class LspClientManager { if (!servers.length) return false; for (const server of servers) { + if (!supportsBuiltinFormatting(server)) continue; try { const context: RootUriContext = { uri: normalizedUri, @@ -437,6 +443,7 @@ export class LspClientManager { diagnostics: builtinConfig.diagnostics !== false, inlayHints: builtinConfig.inlayHints !== false, documentHighlights: builtinConfig.documentHighlights !== false, + formatting: builtinConfig.formatting !== false, }) : { extensions: [], diagnosticsExtension: null }; diff --git a/src/cm/lsp/formatter.ts b/src/cm/lsp/formatter.ts index 224fad530..440f1e22c 100644 --- a/src/cm/lsp/formatter.ts +++ b/src/cm/lsp/formatter.ts @@ -2,6 +2,7 @@ import type { EditorView } from "@codemirror/view"; import { getModes } from "cm/modelist"; import toast from "components/toast"; import lspClientManager from "./clientManager"; +import { supportsBuiltinFormatting } from "./formattingSupport"; import serverRegistry from "./serverRegistry"; import type { AcodeApi, FileMetadata } from "./types"; @@ -32,6 +33,7 @@ function getActiveMetadata( export function registerLspFormatter(acode: AcodeApi): void { const languages = new Set(); serverRegistry.listServers().forEach((server) => { + if (!supportsBuiltinFormatting(server)) return; (server.languages || []).forEach((lang) => { if (lang) languages.add(String(lang)); }); @@ -56,7 +58,9 @@ export function registerLspFormatter(acode: AcodeApi): void { toast("Unknown language for LSP formatting"); return false; } - const servers = serverRegistry.getServersForLanguage(languageId); + const servers = serverRegistry + .getServersForLanguage(languageId) + .filter(supportsBuiltinFormatting); if (!servers.length) { toast("No LSP formatter available"); return false; diff --git a/src/cm/lsp/formattingSupport.ts b/src/cm/lsp/formattingSupport.ts new file mode 100644 index 000000000..4efc62365 --- /dev/null +++ b/src/cm/lsp/formattingSupport.ts @@ -0,0 +1,7 @@ +import type { LspServerDefinition } from "./types"; + +export function supportsBuiltinFormatting( + server: LspServerDefinition, +): boolean { + return server.clientConfig?.builtinExtensions?.formatting !== false; +} diff --git a/src/cm/lsp/types.ts b/src/cm/lsp/types.ts index 946e34f2e..1bd23c172 100644 --- a/src/cm/lsp/types.ts +++ b/src/cm/lsp/types.ts @@ -145,6 +145,7 @@ export interface BuiltinExtensionsConfig { diagnostics?: boolean; inlayHints?: boolean; documentHighlights?: boolean; + formatting?: boolean; } export interface AcodeClientConfig {