Skip to content

[BUG] Korean IME: Characters completely invisible during composition in input field (macOS) #22732

Description

@minislively

Environment

  • Platform: macOS Darwin 25.2.0
  • Terminal: iTerm2, VS Code integrated terminal, Terminal.app
  • Claude Code Version: Latest (installed via npm)
  • IME: macOS default Korean IME
  • Locale: ko_KR.UTF-8

Description

When typing Korean in the Claude Code input field, characters are completely invisible during IME composition. The input field appears empty while typing. Only after pressing Enter does the output show the Korean text was actually received.

This is different from the cursor positioning issues (#16322, #16372) - here the characters do not display at all during composition, not even at a wrong position.

Steps to Reproduce

  1. Open Claude Code in terminal
  2. Switch to Korean IME
  3. Type Korean characters (e.g., "안녕하세요")
  4. Observe: Input field shows nothing - completely blank
  5. Press Enter
  6. Observe: Output correctly shows "안녕하세요"

Expected Behavior

Korean characters should be visible during IME composition, showing intermediate states:

  • Type ㅎ → see ㅎ
  • Type ㅎ + ㅏ → see 하
  • Type ㅎ + ㅏ + ㄴ → see 한

Actual Behavior

  • Input field remains completely empty during entire composition
  • No characters visible at any point until Enter is pressed
  • Makes Korean input essentially "blind typing"

Impact

  • Severity: Critical for Korean users
  • Affected users: All Korean IME users on macOS
  • Workaround: Type in external editor and paste (disrupts workflow significantly)

Related Issues

Root Cause Analysis

Based on investigation, the root cause is React Ink's TextInput component in terminal raw mode:

  1. Terminal raw mode (setRawMode true) provides byte-level STDIN without IME composition events
  2. Ink TextInput processes keystrokes individually without understanding multi-stage character formation
  3. No composition buffer exists for tracking in-progress IME input
  4. CJK double-width characters may confuse the cursor positioning/rendering logic

Suggested Fix Direction

  1. Detect IME composition state heuristically from raw byte sequences
  2. Maintain a separate composition buffer for pre-edit text
  3. Render composition text inline with visual indicator (underline) at cursor position
  4. Handle compositionend equivalent when final character is committed

This is the most requested fix across multiple CJK-related issues and would benefit Korean, Japanese, and Chinese users.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:a11yarea:tuibugSomething isn't workinghas reproHas detailed reproduction stepsplatform:macosIssue specifically occurs on macOS

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions