From 7e4e2fa70753bd4115f4a50d24113a463bd560d4 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:08:16 +0530 Subject: [PATCH 1/2] fix(lsp): honor per-server formatting toggle --- src/cm/lsp/clientManager.ts | 25 +++++++++++++++++-------- src/cm/lsp/formatter.ts | 11 +++++++++-- src/cm/lsp/types.ts | 1 + 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/cm/lsp/clientManager.ts b/src/cm/lsp/clientManager.ts index e59a35024..9e4a46ea2 100644 --- a/src/cm/lsp/clientManager.ts +++ b/src/cm/lsp/clientManager.ts @@ -60,13 +60,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 +76,7 @@ function buildBuiltinExtensions( diagnostics: includeDiagnostics = true, inlayHints: includeInlayHints = true, documentHighlights: includeDocumentHighlights = true, + formatting: includeFormatting = true, } = config; const extensions: Extension[] = []; @@ -90,7 +84,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 +267,7 @@ export class LspClientManager { if (!servers.length) return false; for (const server of servers) { + if (!supportsBuiltinFormatting(server)) continue; try { const context: RootUriContext = { uri: normalizedUri, @@ -912,6 +917,10 @@ function resolveIndentWidth(unit: string): number { return width || 4; } +function supportsBuiltinFormatting(server: LspServerDefinition): boolean { + return server.clientConfig?.builtinExtensions?.formatting !== false; +} + const defaultManager = new LspClientManager(); export default defaultManager; diff --git a/src/cm/lsp/formatter.ts b/src/cm/lsp/formatter.ts index 224fad530..ee7080db1 100644 --- a/src/cm/lsp/formatter.ts +++ b/src/cm/lsp/formatter.ts @@ -3,13 +3,17 @@ import { getModes } from "cm/modelist"; import toast from "components/toast"; import lspClientManager from "./clientManager"; import serverRegistry from "./serverRegistry"; -import type { AcodeApi, FileMetadata } from "./types"; +import type { AcodeApi, FileMetadata, LspServerDefinition } from "./types"; interface Mode { name?: string; extensions?: string; } +function supportsBuiltinFormatting(server: LspServerDefinition): boolean { + return server?.clientConfig?.builtinExtensions?.formatting !== false; +} + interface EditorManagerWithLsp { editor?: EditorView; activeFile?: AcodeFile; @@ -32,6 +36,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 +61,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/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 { From fb40b995a27558e2bad8e110063b62b05fbc90e7 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:14:04 +0530 Subject: [PATCH 2/2] fix --- src/cm/lsp/clientManager.ts | 6 ++---- src/cm/lsp/formatter.ts | 7 ++----- src/cm/lsp/formattingSupport.ts | 7 +++++++ 3 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 src/cm/lsp/formattingSupport.ts diff --git a/src/cm/lsp/clientManager.ts b/src/cm/lsp/clientManager.ts index 9e4a46ea2..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"; @@ -442,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 }; @@ -917,10 +919,6 @@ function resolveIndentWidth(unit: string): number { return width || 4; } -function supportsBuiltinFormatting(server: LspServerDefinition): boolean { - return server.clientConfig?.builtinExtensions?.formatting !== false; -} - const defaultManager = new LspClientManager(); export default defaultManager; diff --git a/src/cm/lsp/formatter.ts b/src/cm/lsp/formatter.ts index ee7080db1..440f1e22c 100644 --- a/src/cm/lsp/formatter.ts +++ b/src/cm/lsp/formatter.ts @@ -2,18 +2,15 @@ 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, LspServerDefinition } from "./types"; +import type { AcodeApi, FileMetadata } from "./types"; interface Mode { name?: string; extensions?: string; } -function supportsBuiltinFormatting(server: LspServerDefinition): boolean { - return server?.clientConfig?.builtinExtensions?.formatting !== false; -} - interface EditorManagerWithLsp { editor?: EditorView; activeFile?: AcodeFile; 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; +}