Skip to content

fix(cli): sync terminal cursor with input caret for CJK IME - #1142

Closed
ddddajie wants to merge 8920 commits into
CodebuffAI:mainfrom
ddddajie:fix/1128-ime-cursor-position
Closed

fix(cli): sync terminal cursor with input caret for CJK IME#1142
ddddajie wants to merge 8920 commits into
CodebuffAI:mainfrom
ddddajie:fix/1128-ime-cursor-position

Conversation

@ddddajie

@ddddajie ddddajie commented Aug 28, 2026

Copy link
Copy Markdown

Summary

Fixes #1128.

The CLI rendered a visual caret but did not move the real terminal hardware cursor to the input position. CJK IMEs use the terminal cursor position to anchor their composition and candidate windows, which caused the popup to appear at unrelated screen locations.

This change:

  • synchronizes the real terminal cursor with the MultilineInput caret
  • accounts for CJK terminal-cell width using string-width
  • handles tabs, wrapped visual lines, viewport offsets, and vertical scrolling
  • hides the hardware cursor when the input loses focus or unmounts
  • keeps the existing visual cursor behavior unchanged
  • centralizes OpenTUI 0.3.4 visual textBufferView.lineInfo access behind a guarded adapter while preserving wrapped-line semantics
  • keeps the line-info-change subscription stable instead of re-subscribing on ordinary caret/value changes

Tests

Added regression coverage for:

  • ASCII cursor positioning
  • CJK wide characters
  • mixed ASCII/CJK input
  • tab expansion
  • wrapped visual lines
  • viewport and vertical scroll offsets
  • cursor visibility on focus/unmount
  • component-level OpenTUI renderer cursor positioning after a CJK character
  • renderer-level cursor placement on a wrapped visual row

Validation:

  • bun test cli/src/components/__tests__/multiline-input.test.tsx — 81 passed
  • repeated focused test run (--rerun-each 3) — 243 passed
  • git diff --check — passed

CLI typecheck is currently blocked by pre-existing missing tar and react-dom/server typings; no errors were reported in the changed files.

Manual verification

Manually verified in Windows Terminal with Microsoft Pinyin. Candidate-window positioning followed the input caret correctly across normal CJK input, cursor movement, wrapped lines, and scrolling.

Loading
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:needs-work Right idea, not mergeable as written

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CJK IME candidate window anchors to wherever text last changed on screen, not to the input caret — real terminal cursor is never moved

3 participants