aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEdmund-a7 <J18115025119@163.com>2026-04-07 20:57:51 +0800
committerGitHub <noreply@github.com>2026-04-07 20:57:51 +0800
commit53bb02b53720d00464843fa565850cbdef35aaad (patch)
tree803d8b81b49ec8f54a82ac61b28763123e6e1e85 /src
parent78fc0721a3d014fe96e778c6bb452cfdfbe67603 (diff)
parent34bc876c665c0b5560766bc89dd6536aefce2cb7 (diff)
Merge pull request #1 from Edmund-a7/fix/ime-input-support
fix: support IME input for Chinese and other UTF-8 characters
Diffstat (limited to 'src')
-rw-r--r--src/input/encode.rs22
-rw-r--r--src/input/tests.rs22
-rw-r--r--src/main.rs1
3 files changed, 39 insertions, 6 deletions
diff --git a/src/input/encode.rs b/src/input/encode.rs
index 4aa68e17..1311d4a0 100644
--- a/src/input/encode.rs
+++ b/src/input/encode.rs
@@ -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()),
}
diff --git a/src/input/tests.rs b/src/input/tests.rs
index a3c71675..a5b4e8bd 100644
--- a/src/input/tests.rs
+++ b/src/input/tests.rs
@@ -707,3 +707,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());
+}
diff --git a/src/main.rs b/src/main.rs
index aeeb277c..7256df66 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -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
)
)?;