diff --git a/clients/tabby-agent/src/codeLens.ts b/clients/tabby-agent/src/codeLens.ts index 848dadd5faf4..220fc38fb988 100644 --- a/clients/tabby-agent/src/codeLens.ts +++ b/clients/tabby-agent/src/codeLens.ts @@ -128,6 +128,7 @@ export class CodeLensProvider implements Feature { line: changesPreviewLineType.header, }, }); + lineCodeLenses.push({ range: codeLensRange, command: { diff --git a/clients/vscode/src/lsp/CodeLensMiddleware.ts b/clients/vscode/src/lsp/CodeLensMiddleware.ts index 9a9cfd28ef84..5889e4562c2c 100644 --- a/clients/vscode/src/lsp/CodeLensMiddleware.ts +++ b/clients/vscode/src/lsp/CodeLensMiddleware.ts @@ -12,6 +12,7 @@ import { import { CodeLensMiddleware as VscodeLspCodeLensMiddleware, ProvideCodeLensesSignature } from "vscode-languageclient"; import { CodeLens as TabbyCodeLens } from "tabby-agent"; import { findTextEditor } from "./vscodeWindowUtils"; +import { isBrowser } from "../env"; type CodeLens = VscodeCodeLens & TabbyCodeLens; @@ -74,7 +75,9 @@ export class CodeLensMiddleware implements VscodeLspCodeLensMiddleware { if (!editor) { return codeLenses; } + this.removeDecorations(editor); + const result = codeLenses ?.map((codeLens) => this.handleCodeLens(codeLens, editor)) @@ -84,6 +87,7 @@ export class CodeLensMiddleware implements VscodeLspCodeLensMiddleware { } private handleCodeLens(codeLens: CodeLens, editor: TextEditor): CodeLens | null { + this.addShortcut(codeLens); if (!codeLens.data || codeLens.data.type !== "previewChanges") { return codeLens; } @@ -106,6 +110,19 @@ export class CodeLensMiddleware implements VscodeLspCodeLensMiddleware { return null; } + private addShortcut(codeLens: CodeLens) { + if (codeLens.command?.arguments?.[0].action === "accept") { + // FIXME: Read ~/.config/Code/User/keybindings.json from LSP client, then send to LSP server to avoid hardcode. + const acceptShortcut = isBrowser ? "" : ` (${process.platform === "darwin" ? "⌘+Enter" : "Ctrl+Enter"})`; + + codeLens.command.title += acceptShortcut; + } else if (codeLens.command?.arguments?.[0].action === "discard") { + const discardShortcut = isBrowser ? "" : ` (Esc)`; + + codeLens.command.title += discardShortcut; + } + } + private addDecorationRange(editor: TextEditor, decorationType: TextEditorDecorationType, range: Range) { let decorations: Map | undefined; if (this.decorationMap.has(editor)) {