Skip to content

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

Open
ddddajie wants to merge 1 commit into
CodebuffAI:mainfrom
ddddajie:fix/1128-ime-cursor-position-v2
Open

fix(cli): sync terminal cursor with input caret for CJK IME#1177
ddddajie wants to merge 1 commit into
CodebuffAI:mainfrom
ddddajie:fix/1128-ime-cursor-position-v2

Conversation

@ddddajie

@ddddajie ddddajie commented Sep 1, 2026

Copy link
Copy Markdown

Summary

Recreates #1142 on top of the rewritten main history, as requested by the maintainer in the closed PR. 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

Regression coverage includes:

  • 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 from #1142:

  • 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 was 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.

This branch is rebuilt directly from the current rewritten main and contains a single clean commit. Previous review context: #1142.

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

Labels

None yet

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

1 participant