From 366fac3cfdbdf949a33678ed7da05faea0bbfec5 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 3 May 2024 07:24:54 -0700 Subject: [PATCH] Adjust prompt based on last prompt line Part of #211945 --- .../common/capabilities/capabilities.ts | 2 +- .../commandDetection/promptInputModel.ts | 20 +++++++++++++++++++ .../commandDetectionCapability.ts | 12 ++++++----- .../common/xterm/shellIntegrationAddon.ts | 6 +++--- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/terminal/common/capabilities/capabilities.ts b/src/vs/platform/terminal/common/capabilities/capabilities.ts index 7fd0b01f81a..426de4a8ff7 100644 --- a/src/vs/platform/terminal/common/capabilities/capabilities.ts +++ b/src/vs/platform/terminal/common/capabilities/capabilities.ts @@ -181,7 +181,7 @@ export interface ICommandDetectionCapability { readonly onCommandInvalidated: Event; readonly onCurrentCommandInvalidated: Event; setContinuationPrompt(value: string): void; - setPromptTerminator(value: string): void; + setPromptTerminator(value: string, lastPromptLine: string): void; setCwd(value: string): void; setIsWindowsPty(value: boolean): void; setIsCommandStorageDisabled(): void; diff --git a/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts b/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts index 56f32460fe8..d8b89fb7e4d 100644 --- a/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts +++ b/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts @@ -54,6 +54,7 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { private _commandStartMarker: IMarker | undefined; private _commandStartX: number = 0; + private _lastPromptLine: string | undefined; private _continuationPrompt: string | undefined; private _lastUserInput: string = ''; @@ -117,6 +118,11 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { this._continuationPrompt = value; } + setLastPromptLine(value: string): void { + this._lastPromptLine = value; + this._sync(); + } + setConfidentCommandLine(value: string): void { if (this._value !== value) { this._value = value; @@ -153,6 +159,17 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { this._cursorIndex = 0; this._onDidStartInput.fire(this._createStateObject()); this._onDidChangeInput.fire(this._createStateObject()); + + // Trigger a sync if prompt terminator is set as that could adjust the command start X + if (this._lastPromptLine) { + if (this._commandStartX !== this._lastPromptLine.length) { + const line = this._xterm.buffer.active.getLine(this._commandStartMarker.line); + if (line?.translateToString(true).startsWith(this._lastPromptLine)) { + this._commandStartX = this._lastPromptLine.length; + this._sync(); + } + } + } } private _handleCommandExecuted() { @@ -190,6 +207,9 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { return; } + console.log('commandStartX', this._commandStartX); + console.log('promptTerminator', this._lastPromptLine); + const buffer = this._xterm.buffer.active; let line = buffer.getLine(commandStartY); const commandLine = line?.translateToString(true, this._commandStartX); diff --git a/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts b/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts index c4b764f92d2..8df3d3b8f42 100644 --- a/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts +++ b/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts @@ -205,6 +205,13 @@ export class CommandDetectionCapability extends Disposable implements ICommandDe this._promptInputModel.setContinuationPrompt(value); } + // TODO: Simplify this, can everything work off the last line? + setPromptTerminator(promptTerminator: string, lastPromptLine: string) { + this._logService.debug('CommandDetectionCapability#setPromptTerminator', promptTerminator); + this._promptTerminator = promptTerminator; + this._promptInputModel.setLastPromptLine(lastPromptLine); + } + setCwd(value: string) { this._cwd = value; } @@ -454,11 +461,6 @@ export class CommandDetectionCapability extends Disposable implements ICommandDe this._onCommandFinished.fire(newCommand); } } - - setPromptTerminator(promptTerminator: string) { - this._logService.debug('CommandDetectionCapability#setPromptTerminator', promptTerminator); - this._promptTerminator = promptTerminator; - } } /** diff --git a/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts b/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts index 3435b5335ba..cacc170e5cd 100644 --- a/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts +++ b/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts @@ -484,10 +484,10 @@ export class ShellIntegrationAddon extends Disposable implements IShellIntegrati if (!this._terminal) { return; } - const lastPromptLine = prompt.substring(prompt.lastIndexOf('\n')).trim(); - const promptTerminator = lastPromptLine.substring(lastPromptLine.lastIndexOf(' ')).trim(); + const lastPromptLine = prompt.substring(prompt.lastIndexOf('\n') + 1); + const promptTerminator = lastPromptLine.substring(lastPromptLine.lastIndexOf(' ')); if (promptTerminator) { - this._createOrGetCommandDetection(this._terminal).setPromptTerminator(promptTerminator); + this._createOrGetCommandDetection(this._terminal).setPromptTerminator(promptTerminator, lastPromptLine); } }