develop #6

Merged
Fabel merged 35 commits from develop into main 2024-10-09 18:50:26 +00:00
1 changed files with 25 additions and 18 deletions
Showing only changes of commit 8ac3879ee0 - Show all commits

View File

@ -75,7 +75,7 @@ async function autocompleteCommand(textEditor: vscode.TextEditor, cancellationTo
async (progress, progressCancellationToken) => { async (progress, progressCancellationToken) => {
try { try {
progress.report({ message: "Starting model..." }); progress.report({ message: "Starting model..." });
let axiosCancelPost: () => void; let axiosCancelPost: () => void;
const axiosCancelToken = new axios.CancelToken((c) => { const axiosCancelToken = new axios.CancelToken((c) => {
axiosCancelPost = () => { axiosCancelPost = () => {
@ -85,7 +85,7 @@ async function autocompleteCommand(textEditor: vscode.TextEditor, cancellationTo
progressCancellationToken.onCancellationRequested(axiosCancelPost); progressCancellationToken.onCancellationRequested(axiosCancelPost);
vscode.workspace.onDidCloseTextDocument(axiosCancelPost); vscode.workspace.onDidCloseTextDocument(axiosCancelPost);
}); });
const response = await axios.post(apiEndpoint, { const response = await axios.post(apiEndpoint, {
model: apiModel, model: apiModel,
prompt: fimPrompt, prompt: fimPrompt,
@ -102,15 +102,15 @@ async function autocompleteCommand(textEditor: vscode.TextEditor, cancellationTo
'Authorization': apiAuthentication 'Authorization': apiAuthentication
} }
}); });
progress.report({ message: "Generating..." }); progress.report({ message: "Generating..." });
let completionText = response.data.response; let completionText = response.data.response;
completionText = completionText.replace(/<fim_middle>|<fim_suffix>|<fim_prefix>/g, '').trim(); completionText = completionText.replace(/<fim_middle>|<fim_suffix>|<fim_prefix>/g, '').trim();
// Split the completion text by new lines // Split the completion text by new lines
const lines = completionText.split('\n'); const lines = completionText.split('\n');
// Create a decoration for each line of the response // Create a decoration for each line of the response
const previewRanges = lines.map((line: string, idx: number) => { const previewRanges = lines.map((line: string, idx: number) => {
const linePos = new vscode.Position(position.line + idx, 0); const linePos = new vscode.Position(position.line + idx, 0);
@ -126,20 +126,22 @@ async function autocompleteCommand(textEditor: vscode.TextEditor, cancellationTo
} }
}; };
}); });
// Apply the decorations for multiline preview // Apply the decorations for multiline preview
textEditor.setDecorations(previewDecorationType, previewRanges); textEditor.setDecorations(previewDecorationType, previewRanges);
let completionInserted = false; // Flag to track insertion
const disposable = vscode.workspace.onDidChangeTextDocument(async (event) => { const disposable = vscode.workspace.onDidChangeTextDocument(async (event) => {
if (event.document.uri.toString() === document.uri.toString()) { if (event.document.uri.toString() === document.uri.toString()) {
const change = event.contentChanges[0]; const change = event.contentChanges[0];
// Handle Backspace to decline the preview // Handle Backspace to decline the preview
if (change && change.text === '' && change.rangeLength === 1) { if (change && change.text === '' && change.rangeLength === 1) {
textEditor.setDecorations(previewDecorationType, []); // Remove preview decorations textEditor.setDecorations(previewDecorationType, []); // Remove preview decorations
disposable.dispose(); disposable.dispose();
} }
// Handle Ctrl + Enter (or Cmd + Enter on macOS) to accept the preview // Handle Ctrl + Enter (or Cmd + Enter on macOS) to accept the preview
const isCtrlOrCmdPressed = event.contentChanges.some( const isCtrlOrCmdPressed = event.contentChanges.some(
(change) => { (change) => {
@ -148,28 +150,31 @@ async function autocompleteCommand(textEditor: vscode.TextEditor, cancellationTo
return isCtrlOrCmd; return isCtrlOrCmd;
} }
); );
if (isCtrlOrCmdPressed) { if (isCtrlOrCmdPressed && !completionInserted) {
// Ensure that we insert the completion text only once
completionInserted = true;
// Remove the preview decoration before applying the final completion // Remove the preview decoration before applying the final completion
textEditor.setDecorations(previewDecorationType, []); textEditor.setDecorations(previewDecorationType, []);
const edit = new vscode.WorkspaceEdit(); const edit = new vscode.WorkspaceEdit();
const insertPosition = new vscode.Position(position.line, 0); const insertPosition = new vscode.Position(position.line, 0);
// Insert the completion only once // Avoid duplicating the completion text
if (!document.getText().includes(completionText)) { if (!document.getText().includes(completionText)) {
edit.insert(document.uri, insertPosition, '\n' + completionText); edit.insert(document.uri, insertPosition, '\n' + completionText);
await vscode.workspace.applyEdit(edit); await vscode.workspace.applyEdit(edit);
} }
const newPosition = new vscode.Position(position.line + lines.length, lines[lines.length - 1].length); const newPosition = new vscode.Position(position.line + lines.length, lines[lines.length - 1].length);
textEditor.selection = new vscode.Selection(newPosition, newPosition); textEditor.selection = new vscode.Selection(newPosition, newPosition);
disposable.dispose(); // Clean up the listener after accepting the completion disposable.dispose(); // Clean up the listener after accepting the completion
} }
} }
}); });
} catch (err: any) { } catch (err: any) {
vscode.window.showErrorMessage( vscode.window.showErrorMessage(
"Fabelous Autocoder encountered an error: " + err.message "Fabelous Autocoder encountered an error: " + err.message
@ -178,6 +183,8 @@ async function autocompleteCommand(textEditor: vscode.TextEditor, cancellationTo
} }
} }
); );
} }