44import ansi from "ansi-escapes" ;
55
66import type { ISTerm } from "../isterm/pty.js" ;
7- import { eraseViewport } from "../utils/ansi.js" ;
7+ import { eraseViewport , shouldFallbackToDec } from "../utils/ansi.js" ;
8+ import * as dec from "../utils/dec.js" ;
89import { endTiming , startTiming } from "../utils/performance.js" ;
910import { getMaxLines , type SuggestionManager } from "./suggestionManager.js" ;
1011
@@ -24,10 +25,16 @@ type RenderCache = {
2425 clear ?: string ;
2526} ;
2627
28+ type CursorPositionSequences = {
29+ cursorSavePosition : string ;
30+ cursorRestorePosition : string ;
31+ } ;
32+
2733export class SuggestionRenderer {
2834 readonly #term: ISTerm ;
2935 readonly #suggestions: SuggestionManager ;
3036 readonly #writeOutput: ( data : string ) => void ;
37+ readonly #cursorPositionSequences: CursorPositionSequences ;
3138 readonly #cache: RenderCache = { } ;
3239 #visible = false ;
3340 #direction: Direction ;
@@ -39,6 +46,7 @@ export class SuggestionRenderer {
3946 this . #term = term ;
4047 this . #suggestions = suggestions ;
4148 this . #writeOutput = writeOutput ;
49+ this . #cursorPositionSequences = shouldFallbackToDec ( ) ? dec : ansi ;
4250 this . #direction = this . #snapshot( ) . layout . direction ;
4351 }
4452
@@ -169,10 +177,11 @@ export class SuggestionRenderer {
169177 cursor : { hidden : cursorHidden } ,
170178 } = snapshot ;
171179 const showCursor = cursorHidden ? "" : ansi . cursorShow ;
180+ const { cursorSavePosition, cursorRestorePosition } = this . #cursorPositionSequences;
172181 if ( direction === "above" ) {
173- return data + ansi . cursorHide + ansi . cursorSavePosition + ansi . cursorPrevLine . repeat ( lines ) + patch + ansi . cursorRestorePosition + showCursor ;
182+ return data + ansi . cursorHide + cursorSavePosition + ansi . cursorPrevLine . repeat ( lines ) + patch + cursorRestorePosition + showCursor ;
174183 }
175- return ansi . cursorHide + ansi . cursorSavePosition + ansi . cursorNextLine + patch + ansi . cursorRestorePosition + showCursor + data ;
184+ return ansi . cursorHide + cursorSavePosition + ansi . cursorNextLine + patch + cursorRestorePosition + showCursor + data ;
176185 }
177186
178187 #clearOutput( direction : Direction , snapshot : RenderSnapshot , bufferType : PatchBuffer = "active" ) : string {
@@ -182,11 +191,12 @@ export class SuggestionRenderer {
182191 const lines = direction === "above" ? Math . min ( getMaxLines ( ) , cursorY ) : Math . min ( getMaxLines ( ) , remainingLines ) ;
183192 const patch = this . #term. getPatch ( lines , [ ] , direction , bufferType ) ;
184193 const showCursor = cursorHidden ? "" : ansi . cursorShow ;
194+ const { cursorSavePosition, cursorRestorePosition } = this . #cursorPositionSequences;
185195
186196 if ( direction === "above" ) {
187- return ansi . cursorHide + ansi . cursorSavePosition + ansi . cursorPrevLine . repeat ( lines ) + patch + ansi . cursorRestorePosition + showCursor ;
197+ return ansi . cursorHide + cursorSavePosition + ansi . cursorPrevLine . repeat ( lines ) + patch + cursorRestorePosition + showCursor ;
188198 }
189- return ansi . cursorHide + ansi . cursorSavePosition + ansi . cursorNextLine + patch + ansi . cursorRestorePosition + showCursor ;
199+ return ansi . cursorHide + cursorSavePosition + ansi . cursorNextLine + patch + cursorRestorePosition + showCursor ;
190200 }
191201
192202 #clearPreviousDirection( snapshot : RenderSnapshot ) : void {
0 commit comments