diff --git a/CHANGELOG.md b/CHANGELOG.md index 202375f..15f8818 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Extension versions are released as `vscode-v` on the [Releases](https://git.harvmaster.com/Harvmaster/autocomplete-model/releases) page. Models are versioned by their name in [`models/manifest.json`](models/manifest.json). +## vscode 0.6.4 + +- **Accepting a suggestion asks for the next edit immediately** (setting `nextEdit.afterAccept`, on by default). After + Tab on a completion or a next-edit, the follow-up is requested right away instead of after the typing pause, so + accepted next-edits chain (rename → next use → …). + ## vscode 0.6.3 - **Fix: model choice didn't stick in managed mode.** The daemon's saved state (last model used) overrode both the diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 688fd01..cfff19c 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Local Autocomplete", "description": "Inline code completion from a local fine-tuned model via the acd daemon", "publisher": "harvmaster", - "version": "0.6.3", + "version": "0.6.4", "license": "MIT", "engines": { "vscode": "^1.90.0" @@ -218,6 +218,11 @@ "default": 700, "description": "Pause after typing before asking for a next-edit suggestion." }, + "localAutocomplete.nextEdit.afterAccept": { + "type": "boolean", + "default": true, + "description": "After you accept a completion or a next-edit suggestion, immediately ask for the next edit (without waiting for the typing pause). Accepted next-edits chain: a rename suggests the next use, and so on." + }, "localAutocomplete.triggerOnCursorMove": { "type": "boolean", "default": false, diff --git a/extensions/vscode/src/extension.ts b/extensions/vscode/src/extension.ts index 140f129..df926be 100644 --- a/extensions/vscode/src/extension.ts +++ b/extensions/vscode/src/extension.ts @@ -259,6 +259,7 @@ const modelSupportsNextEdit = () => !!(daemonConfig && daemonConfig.models[daemo // ---------- next-edit prediction (models trained for it, e.g. Stage E) const nextEdit = new NextEditController(s => { api('POST', '/v1/feedback', { event: 'next-edit-accepted', lines: s.newText.split('\n').length }).catch(() => {}) + nextEditAfterAccept('accepted-next-edit') }) let nextEditTimer: NodeJS.Timeout | null = null let nextEditAbort: AbortController | null = null @@ -281,6 +282,15 @@ async function requestNextEdit(editor: vscode.TextEditor, reason: string) { } } +/** Accepting a suggestion (next-edit or completion) asks for the follow-up right away instead of after the typing pause. */ +function nextEditAfterAccept(reason: string) { + const editor = vscode.window.activeTextEditor + if (!editor || !modelSupportsNextEdit() || !settings().get('nextEdit.afterAccept', true)) return + if (nextEditTimer) clearTimeout(nextEditTimer) + // Next tick: the accepted text and the cursor move have been applied by then. + nextEditTimer = setTimeout(() => void requestNextEdit(editor, reason), 0) +} + function scheduleNextEdit(editor: vscode.TextEditor, reason: string, delay: number) { if (nextEditTimer) clearTimeout(nextEditTimer) nextEditTimer = setTimeout(() => void requestNextEdit(editor, reason), delay) @@ -535,6 +545,7 @@ export async function activate(ctx: vscode.ExtensionContext) { vscode.commands.registerCommand('localAutocomplete.showLog', () => log.show()), vscode.commands.registerCommand('localAutocomplete.accepted', (requestId: string, text: string) => { api('POST', '/v1/feedback', { requestId, event: 'accepted', chars: text.length }).catch(() => {}) + nextEditAfterAccept('accepted-completion') }), vscode.workspace.onDidChangeConfiguration(e => { if (!e.affectsConfiguration('localAutocomplete')) return