Skip to content

fix(cli): support ctrl-arrow word navigation - #1108

Closed
c8dhjp4tyv-bit wants to merge 9036 commits into
CodebuffAI:mainfrom
c8dhjp4tyv-bit:fix/ctrl-arrow-word-navigation
Closed

fix(cli): support ctrl-arrow word navigation#1108
c8dhjp4tyv-bit wants to merge 9036 commits into
CodebuffAI:mainfrom
c8dhjp4tyv-bit:fix/ctrl-arrow-word-navigation

Conversation

@c8dhjp4tyv-bit

Copy link
Copy Markdown

Summary

  • support Ctrl+Left and Ctrl+Right word navigation in the CLI input
  • keep existing Alt+Left/Right and Alt+B/F behavior on the same boundary helpers
  • preserve Ctrl+B and Ctrl+F as single-character Emacs movement
  • add focused regression coverage for Windows-style arrow navigation

Fixes #847

Validation

  • targeted multiline-input and word-navigation tests: 77 passed
  • related CLI keyboard/chat-input tests: 74 passed
  • CLI typecheck: only existing missing tar and react-dom/server declarations remain
  • git diff --check passes
  • Prettier reports the pre-existing formatting drift in multiline-input.tsx; the base file has the same result

@codebuff-team

Copy link
Copy Markdown
Contributor

Nice, focused change. Extracting findPreviousWordBoundary/findNextWordBoundary into cli/src/utils/word-navigation.ts and adding getWordNavigationPosition as the single source of truth for word-wise cursor movement is a sensible refactor, and it comes with real unit tests (word-navigation.test.ts) covering Alt, Ctrl, and the Ctrl+B/F exclusion case — that's the kind of coverage this repo would want for input-handling changes.

A couple of things worth double-checking before this lands in the private tree:

  1. Please confirm Ctrl+Left/Right isn't already bound to something else in multiline-input.tsx (e.g. history navigation, line-boundary jumps) elsewhere in the keydown handler — the diff only shows the Alt block being replaced, and it'd be good to know there's no double-handling or shadowing further down in the function.
  2. isCtrlArrow = key.ctrl && !key.meta && !key.option — worth a one-line comment on why option needs excluding (presumably because some terminals report Alt as option+ctrl combos on macOS?), otherwise a future reader will wonder if this is intentional or copy-paste caution.
  3. The PR body claims Prettier drift is pre-existing — that's fine to mention but not something to fix here.

Overall this is well-scoped, in-scope (cli/), and the tests are appropriate. Recommending it be ported, pending a maintainer's quick check on point 1 above.

@codebuff-team codebuff-team added bot:triaged Classified by the community triage bot pr:port-candidate Worth porting into the private source tree labels Aug 24, 2026

Copy link
Copy Markdown
Author

Checked the navigation handler end-to-end. There is no second Ctrl+Left/Right binding after the new word-navigation block: the later branches are Cmd+Left/Right (line boundaries), Ctrl+A/E, Ctrl+Home/End, Ctrl+B/F, and unmodified arrows. Because the word-navigation branch returns immediately, plain Ctrl+Left/Right is handled exactly once.

I also addressed the modifier-question in 9400ea0 with an inline comment: option/Alt-like chords are deliberately excluded from the Windows-style Ctrl+Arrow path because OpenTUI/terminals can expose Alt-like modifiers separately or in combination; those chords belong to the existing Alt path instead.

Source: CodebuffAI/freebuff-private@241f8bfa8a8a97867900b2f71754638efa2cbe86
Source: CodebuffAI/freebuff-private@cfc7760af31f29f1acc7153a7e9fcb48d35f730b
Source: CodebuffAI/freebuff-private@6965ea40dbf54a44c932ca4df63b0dd6377bfec5
Source: CodebuffAI/freebuff-private@ecf4fa2e98fcefcec1a96cbd596b5b16bccd97e3
Source: CodebuffAI/freebuff-private@ce96ca2455d9c6a027d6e41048e8f2520f78754f
Source: CodebuffAI/freebuff-private@890653e2610c57c22298d532cae0129efb26f862
Source: CodebuffAI/freebuff-private@d60d93125f90cdca18e1fc97819b91997081a97f
Source: CodebuffAI/freebuff-private@70ba2a57ab1e48c9f799107675dfb6029dc6d54f
Source: CodebuffAI/freebuff-private@9c2be6595fa98153b9ec0474caed5ec3a58ec116
Source: CodebuffAI/freebuff-private@c1db5271ba86e1c89c3c9fc0c6e6a2a857d3b5dd
Source: CodebuffAI/freebuff-private@2846f67777f75ee23da1e3a3047176d66953d906
Source: CodebuffAI/freebuff-private@f5329a11c8431d6f5c98581c2bfc67fb2d1829ba
Source: CodebuffAI/freebuff-private@e319a9e3de31d8c4cd1d0a9285dfd5360eebb7a1
Source: CodebuffAI/freebuff-private@9cbbba39efda2071b8325bf2779b39170e35348c
Source: CodebuffAI/freebuff-private@8470da01520ea7c273efb6eca943fd37fb265189
Source: CodebuffAI/freebuff-private@884e8a41dd02bb5c0be09d8da8e465c994a6c6a4
Source: CodebuffAI/freebuff-private@b550c712e828f5211de07c5699a643fe0fa8f22e
Source: CodebuffAI/freebuff-private@ddfa6c89a27176e4e1afef0bd597077698e3d9e3
Source: CodebuffAI/freebuff-private@9b8fb92689a45c3d52b65f6d4177bb8b0e4a29db
Source: CodebuffAI/freebuff-private@e20dcb5811c89bc349a283c8fb8b474f03857eaa
Source: CodebuffAI/freebuff-private@1a9bb08ef45331c94cfa616a7e5f91dbc3375e7b
Source: CodebuffAI/freebuff-private@2204d7f013215d4a9746f87ccadb88422bdbf0ce
Source: CodebuffAI/freebuff-private@d85f7624f6df913150afd97028ce8034caf9401c
Source: CodebuffAI/freebuff-private@496a274da0db56d0465478154dbd368ead06dc33
Source: CodebuffAI/freebuff-private@2479764c0c4dc98e75a5c5778d29d10938b5997e
Source: CodebuffAI/freebuff-private@72cb80a710ca0b69c0ea1c92caa09449ae14ae23
github-actions Bot and others added 26 commits August 30, 2026 08:34
Source: CodebuffAI/freebuff-private@efe3fc4ffa4cceb2138f390c606e0ed843ca13b1
Source: CodebuffAI/freebuff-private@1b7d009da0f5d71624799fb56e47503c02d66ffe
Source: CodebuffAI/freebuff-private@c7eb55ee90b22d1963385f259958535b311dd7af
Source: CodebuffAI/freebuff-private@bb7cd6f516db0f13b8a4805f6ffe45d58e108465
Source: CodebuffAI/freebuff-private@b377dd73a9a3c03ddf1d2ac30aa31041ef41c26e
Source: CodebuffAI/freebuff-private@ebefe1ed757533292b4020b6242e2e7ce3a3e7e8
Source: CodebuffAI/freebuff-private@6681195eefb64fbce00fd6c3174ea1b9c07bb101
Source: CodebuffAI/freebuff-private@3652cdfb84c76cbfd6eaf0285588958c2e9e863d
Source: CodebuffAI/freebuff-private@4c569a6b8a413f2a7ed24ccc46e1bd6d18f4def9
Source: CodebuffAI/freebuff-private@97525b97891db562584728271a39c5ffa4f88a83
Source: CodebuffAI/freebuff-private@968cf83760c8f77a39a5aedaedc04d5f7fe2c98b
Source: CodebuffAI/freebuff-private@976b89df4e302612e31320d886053088882265fa
Source: CodebuffAI/freebuff-private@d7dc76f31a8a09229134d88ad4c4e209f052808b
Source: CodebuffAI/freebuff-private@f9c01eea0ce77cd368249f7c5d74ec024a7baf91
Source: CodebuffAI/freebuff-private@3e9ad036c6f9b7f71c2127403a89ce605c53c004
Source: CodebuffAI/freebuff-private@a98e28b9a11c0e821d5171d4fed11136ddfda460
Source: CodebuffAI/freebuff-private@5de60102491d5f19108aec59ab7a0bb41f3de60a
Source: CodebuffAI/freebuff-private@ade37e50551c2230d76dffc3fd29ca7ad02bdbfc
Source: CodebuffAI/freebuff-private@2d04668b529a04c2a90806272993d5f67a1afa1f
Source: CodebuffAI/freebuff-private@2f358ebf68b79b05acb81f18ee42ef4295edee17
Source: CodebuffAI/freebuff-private@e411009a76fbd9f689550bd51bc3b938209ec6f8
Source: CodebuffAI/freebuff-private@70a710b1d0941b7bd3a742dbc8e18f276b602850
@victorxheng

Copy link
Copy Markdown

Apologies — this PR was auto-closed by GitHub when we force-pushed a history rewrite of this repository (repository maintenance; every commit SHA changed). That was not a judgment on this PR, and GitHub does not allow us to reopen it because the commits it was based on no longer exist in the new history.

If you'd like to continue with this change: rebase your branch onto the new main (or recreate it from a fresh clone) and open a new PR — feel free to link back to this one for context, and we'll pick up the review there.

Sorry for the churn, and thanks for contributing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:triaged Classified by the community triage bot pr:port-candidate Worth porting into the private source tree

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ctrl+left/right arrow

3 participants