Skip to content

fix(cli): refine platform-specific undo/redo and smart bubbling for WSL#26202

Merged
cocosheng-g merged 9 commits intomainfrom
fix-issue-23648-refine
Apr 30, 2026
Merged

fix(cli): refine platform-specific undo/redo and smart bubbling for WSL#26202
cocosheng-g merged 9 commits intomainfrom
fix-issue-23648-refine

Conversation

@cocosheng-g
Copy link
Copy Markdown
Contributor

Summary

This PR refines the platform-specific Undo/Redo shortcuts to specifically address WSL users on Windows 11 while ensuring no regressions for other platforms.

Details

  • WSL/Linux Optimization: Promoted 'Alt+Z' (Undo) and 'Alt+Shift+Z' (Redo) as primary shortcuts on Linux/WSL. This avoids the OS-level interception of 'Win+Z' (Snap Layouts) on Windows 11.
  • Smart Bubbling: Enhanced the text buffer input handler to only consume 'Ctrl+Z' when there is actual text to undo. This allows WSL users to use 'Ctrl+Z' for undoing text (natural behavior) while still being able to use it for terminal suspension when the buffer is empty.
  • Native Windows/Mac: Restored 'Ctrl+Z' for native Windows and kept 'Cmd+Z' for macOS, following platform standards.
  • Documentation: Updated references to explicitly mention WSL support for 'Alt+Z'.

Related Issues

Fixes #23648

How to Validate

  1. Run unit tests for keybindings:
    npm test -w @google/gemini-cli -- src/ui/key/keyBindings.test.ts
  2. Run functional tests for the text buffer:
    npm test -w @google/gemini-cli -- src/ui/components/shared/text-buffer.test.ts
  3. Verify that on Linux/WSL, 'Alt+Z' is the primary suggested shortcut.

@cocosheng-g cocosheng-g requested review from a team as code owners April 29, 2026 16:05
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request optimizes the CLI's keyboard shortcut handling to improve the user experience on WSL/Linux environments while maintaining standard behavior for native Windows and macOS users. By implementing smarter input consumption and platform-aware key mapping, it resolves conflicts with OS-level shortcuts and ensures consistent, expected behavior for text manipulation commands.

Highlights

  • Platform-Specific Keybindings: Refined Undo/Redo shortcuts to prioritize platform-appropriate keys, specifically promoting 'Alt+Z' and 'Alt+Shift+Z' for Linux/WSL to avoid conflicts with Windows 11 OS-level shortcuts.
  • Smart Bubbling: Updated the text buffer input handler to only consume 'Ctrl+Z' when there is content to undo, preserving terminal suspension functionality when the buffer is empty.
  • Documentation and Testing: Updated documentation to reflect new shortcut mappings and added comprehensive unit tests to verify platform-specific keybinding logic and buffer behavior.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@cocosheng-g cocosheng-g self-assigned this Apr 29, 2026
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces platform-specific keyboard shortcuts for undo and redo operations across Windows, macOS, and Linux/WSL. It updates the documentation, refines the useTextBuffer hook to prevent handling undo/redo when the respective stacks are empty, and adds comprehensive unit tests to verify the new behavior and key bindings. I have no feedback to provide.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 29, 2026

Size Change: +638 B (0%)

Total Size: 33.9 MB

Filename Size Change
./bundle/chunk-B5EYDN26.js 0 B -19.5 kB (removed) 🏆
./bundle/chunk-C6X7MEUZ.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-FHRSRKTR.js 0 B -14.7 MB (removed) 🏆
./bundle/chunk-KYZEOF3Z.js 0 B -3.8 kB (removed) 🏆
./bundle/chunk-KZ6AC35Y.js 0 B -3.43 kB (removed) 🏆
./bundle/chunk-OCFMZT2V.js 0 B -2.72 MB (removed) 🏆
./bundle/chunk-OGUBFKDI.js 0 B -655 kB (removed) 🏆
./bundle/chunk-VYW4BWTG.js 0 B -12.6 kB (removed) 🏆
./bundle/core-AGS6H7YH.js 0 B -48.2 kB (removed) 🏆
./bundle/devtoolsService-WZWBBVEM.js 0 B -28 kB (removed) 🏆
./bundle/gemini-3NLNOTQG.js 0 B -576 kB (removed) 🏆
./bundle/interactiveCli-EJPOBPZP.js 0 B -1.31 MB (removed) 🏆
./bundle/liteRtServerManager-KDIBDWV4.js 0 B -2.11 kB (removed) 🏆
./bundle/oauth2-provider-J7FYUO63.js 0 B -9.16 kB (removed) 🏆
./bundle/chunk-6S7F2UXQ.js 14.7 MB +14.7 MB (new file) 🆕
./bundle/chunk-6X324HUK.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/chunk-F3WYLHYM.js 2.72 MB +2.72 MB (new file) 🆕
./bundle/chunk-FTT4VIRH.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-GSJMDR7Y.js 12.6 kB +12.6 kB (new file) 🆕
./bundle/chunk-MNFZHHUE.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/chunk-P4F3BEYE.js 3.8 kB +3.8 kB (new file) 🆕
./bundle/chunk-TCPU4DMR.js 655 kB +655 kB (new file) 🆕
./bundle/core-VL6U5G4O.js 48.2 kB +48.2 kB (new file) 🆕
./bundle/devtoolsService-EROTF2VK.js 28 kB +28 kB (new file) 🆕
./bundle/gemini-HBMXB6QJ.js 576 kB +576 kB (new file) 🆕
./bundle/interactiveCli-R3SYYJPC.js 1.31 MB +1.31 MB (new file) 🆕
./bundle/liteRtServerManager-QJFDWRMX.js 2.11 kB +2.11 kB (new file) 🆕
./bundle/oauth2-provider-X54NJPOW.js 9.16 kB +9.16 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-RJTRUG2J.js 39.8 kB 0 B
./bundle/chunk-XRLFHCHC.js 1.97 MB 0 B
./bundle/cleanup-QWAIIFVM.js 0 B -932 B (removed) 🏆
./bundle/devtools-36NN55EP.js 696 kB 0 B
./bundle/dist-T73EYRDX.js 356 B 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/examples/hooks/scripts/on-start.js 188 B 0 B
./bundle/examples/mcp-server/example.js 1.43 kB 0 B
./bundle/gemini.js 5.1 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/memoryDiscovery-FN3IAPBT.js 980 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 222 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 229 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 13.4 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B 0 B
./bundle/sandbox-macos-permissive-open.sb 890 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.82 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/start-GAGTZPUS.js 0 B -652 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/cleanup-4YVKUHVP.js 932 B +932 B (new file) 🆕
./bundle/start-7YV4NQPP.js 652 B +652 B (new file) 🆕

compressed-size-action

@gemini-cli gemini-cli Bot added priority/p2 Important but can be addressed in a future release. area/core Issues related to User Interface, OS Support, Core Functionality labels Apr 29, 2026
@devr0306
Copy link
Copy Markdown
Contributor

devr0306 commented Apr 29, 2026

from /review-frontend

Thanks for the PR! The overall approach for smart bubbling is a great idea to solve the WSL collision, and the tests properly wrap synchronous React state updates in act().

However, there is a critical bug where the implementation contradicts the PR description:

  1. Missing Ctrl+Z Binding on Linux/WSL: The PR description states: "This allows WSL users to use Ctrl+Z for undoing text (natural behavior) while still being able to use it for terminal suspension when the buffer is empty."
    However, in packages/cli/src/ui/key/keyBindings.ts, the getPlatformUndoBindings function for Linux (the fallback return) is [new KeyBinding('alt+z'), new KeyBinding('cmd+z')]. It explicitly omits Ctrl+Z.

    Because Ctrl+Z is not bound to Command.UNDO on Linux, keyMatchers[Command.UNDO](key) will return false for Ctrl+Z. Thus, the smart bubbling logic in useTextBuffer will never evaluate Ctrl+Z on Linux/WSL, and it will always suspend the terminal, even if there is text to undo.

  2. Test Masks the Issue: In packages/cli/src/ui/components/shared/text-buffer.test.ts, the new test should only handle Undo if there is something to undo defines the undoKey for Linux as Alt+Z (alt: true, ctrl: false) rather than Ctrl+Z. This causes the test to pass without actually verifying the intended Ctrl+Z behavior for WSL users.

Recommended Fix:
Add new KeyBinding('ctrl+z') to the fallback return in getPlatformUndoBindings (and similarly for Redo with Ctrl+Y if intended). Additionally, update the test to specifically verify the bubbling behavior using Ctrl+Z on Linux.

Comment thread docs/reference/keyboard-shortcuts.md Outdated
Copy link
Copy Markdown
Contributor

@devr0306 devr0306 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving but just want to make sure this has been manually tested on Windows

@cocosheng-g cocosheng-g added this pull request to the merge queue Apr 30, 2026
Merged via the queue into main with commit a15568e Apr 30, 2026
26 of 27 checks passed
@cocosheng-g cocosheng-g deleted the fix-issue-23648-refine branch April 30, 2026 14:25
TirthNaik-99 pushed a commit to TirthNaik-99/gemini-cli that referenced this pull request May 4, 2026
kimjune01 pushed a commit to kimjune01/gemini-cli-claude that referenced this pull request May 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/core Issues related to User Interface, OS Support, Core Functionality priority/p2 Important but can be addressed in a future release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Undo function not working

2 participants