Merge pull request #9 from Edmund-a7/master

fix: support IME input for Chinese and other UTF-8 characters
This commit is contained in:
Can Celik 2026-04-08 01:23:23 +03:00 committed by GitHub
commit d739880f43
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 39 additions and 6 deletions

View File

@ -309,19 +309,31 @@ fn kitty_modifier(mods: KeyModifiers) -> u32 {
}
fn encode_text_input(key: &TerminalKey) -> Option<Vec<u8>> {
let ch = match key.code {
KeyCode::Char(ch) => ch,
_ => return None,
};
if key.modifiers.is_empty() {
match key.kind {
crossterm::event::KeyEventKind::Press | crossterm::event::KeyEventKind::Repeat => {
let mut buf = [0u8; 4];
return Some(ch.encode_utf8(&mut buf).as_bytes().to_vec());
}
crossterm::event::KeyEventKind::Release => return Some(Vec::new()),
}
}
if key.modifiers != KeyModifiers::SHIFT {
return None;
}
let ch = match key.code {
KeyCode::Char(ch) => shifted_text_char(key, ch)?,
_ => return None,
};
let shifted_ch = shifted_text_char(key, ch)?;
match key.kind {
crossterm::event::KeyEventKind::Press | crossterm::event::KeyEventKind::Repeat => {
let mut buf = [0u8; 4];
Some(ch.encode_utf8(&mut buf).as_bytes().to_vec())
Some(shifted_ch.encode_utf8(&mut buf).as_bytes().to_vec())
}
crossterm::event::KeyEventKind::Release => Some(Vec::new()),
}

View File

@ -720,3 +720,25 @@ fn protocol_from_nonzero_flags_is_kitty() {
KeyboardProtocol::Kitty { flags: 7 }
);
}
#[test]
fn chinese_char_encodes_as_utf8() {
let key = TerminalKey::new(KeyCode::Char('中'), KeyModifiers::empty());
let encoded = encode_terminal_key(key, KeyboardProtocol::Legacy);
assert_eq!(encoded, "".as_bytes());
}
#[test]
fn chinese_char_with_kitty_protocol_encodes_as_utf8() {
let key = TerminalKey::new(KeyCode::Char('文'), KeyModifiers::empty());
let encoded = encode_terminal_key(key, KeyboardProtocol::Kitty { flags: 7 });
assert_eq!(encoded, "".as_bytes());
}
#[test]
fn chinese_char_with_modifiers_falls_back_to_kitty_encoding() {
let key = TerminalKey::new(KeyCode::Char('测'), KeyModifiers::ALT);
let encoded = encode_terminal_key(key, KeyboardProtocol::Kitty { flags: 7 });
assert!(!encoded.is_empty());
assert_ne!(encoded, "".as_bytes());
}

View File

@ -341,7 +341,6 @@ fn main() -> io::Result<()> {
KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
| KeyboardEnhancementFlags::REPORT_EVENT_TYPES
| KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS
| KeyboardEnhancementFlags::REPORT_ALL_KEYS_AS_ESCAPE_CODES
)
)?;