mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-15 00:21:09 -07:00
feat(ui) Make useAlternateBuffer the default (#12976)
This commit is contained in:
49
packages/cli/src/ui/utils/CodeColorizer.test.tsx
Normal file
49
packages/cli/src/ui/utils/CodeColorizer.test.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2025 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { colorizeCode } from './CodeColorizer.js';
|
||||
import { renderWithProviders } from '../../test-utils/render.js';
|
||||
import { LoadedSettings } from '../../config/settings.js';
|
||||
|
||||
describe('colorizeCode', () => {
|
||||
it('renders empty lines correctly when useAlternateBuffer is true', () => {
|
||||
const code = 'line 1\n\nline 3';
|
||||
const settings = new LoadedSettings(
|
||||
{ path: '', settings: {}, originalSettings: {} },
|
||||
{ path: '', settings: {}, originalSettings: {} },
|
||||
{
|
||||
path: '',
|
||||
settings: { ui: { useAlternateBuffer: true, showLineNumbers: false } },
|
||||
originalSettings: {
|
||||
ui: { useAlternateBuffer: true, showLineNumbers: false },
|
||||
},
|
||||
},
|
||||
{ path: '', settings: {}, originalSettings: {} },
|
||||
true,
|
||||
new Set(),
|
||||
);
|
||||
|
||||
const result = colorizeCode({
|
||||
code,
|
||||
language: 'javascript',
|
||||
maxWidth: 80,
|
||||
settings,
|
||||
hideLineNumbers: true,
|
||||
});
|
||||
|
||||
const { lastFrame } = renderWithProviders(<>{result}</>);
|
||||
// We expect the output to preserve the empty line.
|
||||
// If the bug exists, it might look like "line 1\nline 3"
|
||||
// If fixed, it should look like "line 1\n \nline 3" (if we use space) or just have the newline.
|
||||
|
||||
// We can check if the output matches the code (ignoring color codes if any, but lastFrame returns plain text usually unless configured otherwise)
|
||||
// Actually lastFrame() returns string with ANSI codes stripped by default in some setups, or not.
|
||||
// But ink-testing-library usually returns the visual representation.
|
||||
|
||||
expect(lastFrame()).toMatch(/line 1\s*\n\s*\n\s*line 3/);
|
||||
});
|
||||
});
|
||||
@@ -22,6 +22,7 @@ import {
|
||||
} from '../components/shared/MaxSizedBox.js';
|
||||
import type { LoadedSettings } from '../../config/settings.js';
|
||||
import { debugLogger } from '@google/gemini-cli-core';
|
||||
import { isAlternateBufferEnabled } from '../hooks/useAlternateBuffer.js';
|
||||
|
||||
// Configure theming and parsing utilities.
|
||||
const lowlight = createLowlight(common);
|
||||
@@ -150,7 +151,7 @@ export function colorizeCode({
|
||||
? false
|
||||
: (settings?.merged.ui?.showLineNumbers ?? true);
|
||||
|
||||
const useMaxSizedBox = settings?.merged.ui?.useAlternateBuffer !== true;
|
||||
const useMaxSizedBox = !isAlternateBufferEnabled(settings);
|
||||
try {
|
||||
// Render the HAST tree using the adapted theme
|
||||
// Apply the theme's default foreground color to the top-level Text element
|
||||
@@ -160,10 +161,7 @@ export function colorizeCode({
|
||||
let hiddenLinesCount = 0;
|
||||
|
||||
// Optimization to avoid highlighting lines that cannot possibly be displayed.
|
||||
if (
|
||||
availableHeight !== undefined &&
|
||||
settings?.merged.ui?.useAlternateBuffer === false
|
||||
) {
|
||||
if (availableHeight !== undefined && useMaxSizedBox) {
|
||||
availableHeight = Math.max(availableHeight, MINIMUM_MAX_HEIGHT);
|
||||
if (lines.length > availableHeight) {
|
||||
const sliceIndex = lines.length - availableHeight;
|
||||
@@ -180,7 +178,7 @@ export function colorizeCode({
|
||||
);
|
||||
|
||||
return (
|
||||
<Box key={index}>
|
||||
<Box key={index} minHeight={useMaxSizedBox ? undefined : 1}>
|
||||
{/* We have to render line numbers differently depending on whether we are using MaxSizeBox or not */}
|
||||
{showLineNumbers && useMaxSizedBox && (
|
||||
<Text color={activeTheme.colors.Gray}>
|
||||
@@ -238,7 +236,7 @@ export function colorizeCode({
|
||||
const lines = codeToHighlight.split('\n');
|
||||
const padWidth = String(lines.length).length; // Calculate padding width based on number of lines
|
||||
const fallbackLines = lines.map((line, index) => (
|
||||
<Box key={index}>
|
||||
<Box key={index} minHeight={useMaxSizedBox ? undefined : 1}>
|
||||
{/* We have to render line numbers differently depending on whether we are using MaxSizeBox or not */}
|
||||
{showLineNumbers && useMaxSizedBox && (
|
||||
<Text color={activeTheme.defaultColor}>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
import { lerp } from '../../utils/math.js';
|
||||
import { type LoadedSettings } from '../../config/settings.js';
|
||||
import { isAlternateBufferEnabled } from '../hooks/useAlternateBuffer.js';
|
||||
|
||||
const getMainAreaWidthInternal = (terminalWidth: number): number => {
|
||||
if (terminalWidth <= 80) {
|
||||
@@ -27,7 +28,7 @@ export const calculateMainAreaWidth = (
|
||||
settings: LoadedSettings,
|
||||
): number => {
|
||||
if (settings.merged.ui?.useFullWidth !== false) {
|
||||
if (settings.merged.ui?.useAlternateBuffer) {
|
||||
if (isAlternateBufferEnabled(settings)) {
|
||||
return terminalWidth - 1;
|
||||
}
|
||||
return terminalWidth;
|
||||
|
||||
Reference in New Issue
Block a user