From 61e382444a69409b066a6c8382379f86492d579f Mon Sep 17 00:00:00 2001 From: Jacob Richman Date: Thu, 31 Jul 2025 16:16:29 -0700 Subject: fix(ux) bug in replaceRange dealing with newLines that was breaking vim support (#5320) --- .../cli/src/ui/components/shared/text-buffer.ts | 35 ++++++++++------------ 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'packages/cli/src/ui/components/shared/text-buffer.ts') diff --git a/packages/cli/src/ui/components/shared/text-buffer.ts b/packages/cli/src/ui/components/shared/text-buffer.ts index d2d9087a..cf5ce889 100644 --- a/packages/cli/src/ui/components/shared/text-buffer.ts +++ b/packages/cli/src/ui/components/shared/text-buffer.ts @@ -271,26 +271,23 @@ export const replaceRangeInternal = ( .replace(/\r/g, '\n'); const replacementParts = normalisedReplacement.split('\n'); - // Replace the content - if (startRow === endRow) { - newLines[startRow] = prefix + normalisedReplacement + suffix; + // The combined first line of the new text + const firstLine = prefix + replacementParts[0]; + + if (replacementParts.length === 1) { + // No newlines in replacement: combine prefix, replacement, and suffix on one line. + newLines.splice(startRow, endRow - startRow + 1, firstLine + suffix); } else { - const firstLine = prefix + replacementParts[0]; - if (replacementParts.length === 1) { - // Single line of replacement text, but spanning multiple original lines - newLines.splice(startRow, endRow - startRow + 1, firstLine + suffix); - } else { - // Multi-line replacement text - const lastLine = replacementParts[replacementParts.length - 1] + suffix; - const middleLines = replacementParts.slice(1, -1); - newLines.splice( - startRow, - endRow - startRow + 1, - firstLine, - ...middleLines, - lastLine, - ); - } + // Newlines in replacement: create new lines. + const lastLine = replacementParts[replacementParts.length - 1] + suffix; + const middleLines = replacementParts.slice(1, -1); + newLines.splice( + startRow, + endRow - startRow + 1, + firstLine, + ...middleLines, + lastLine, + ); } const finalCursorRow = startRow + replacementParts.length - 1; -- cgit v1.2.3