Fix fish_key_reader --verbose output

This commit is contained in:
Johannes Altmanninger 2024-08-11 15:15:50 +02:00
parent e3196446fa
commit 423e5f6c03
2 changed files with 18 additions and 7 deletions

View File

@ -20,7 +20,7 @@ use fish::{
eprintf, fprintf, eprintf, fprintf,
input::input_terminfo_get_name, input::input_terminfo_get_name,
input_common::{terminal_protocols_enable_ifn, CharEvent, InputEventQueue, InputEventQueuer}, input_common::{terminal_protocols_enable_ifn, CharEvent, InputEventQueue, InputEventQueuer},
key::{self, char_to_symbol, Key}, key::{self, byte_to_symbol, Key},
panic::panic_handler, panic::panic_handler,
print_help::print_help, print_help::print_help,
printf, printf,
@ -104,7 +104,7 @@ fn process_input(continuous_mode: bool, verbose: bool) -> i32 {
if verbose { if verbose {
printf!("# decoded from: "); printf!("# decoded from: ");
for byte in kevt.seq.chars() { for byte in kevt.seq.chars() {
printf!("%s", &char_to_symbol(byte)); printf!("%s", &byte_to_symbol(byte));
} }
printf!("\n"); printf!("\n");
} }

View File

@ -418,7 +418,7 @@ fn ctrl_to_symbol(buf: &mut WString, c: char) {
// 2. key names that are given as raw escape sequence (\e123); those we want to display // 2. key names that are given as raw escape sequence (\e123); those we want to display
// similar to how they are given. // similar to how they are given.
let ctrl_symbolic_names: [&wstr; 29] = { let ctrl_symbolic_names: [&wstr; 28] = {
std::array::from_fn(|i| match i { std::array::from_fn(|i| match i {
8 => L!("\\b"), 8 => L!("\\b"),
9 => L!("\\t"), 9 => L!("\\t"),
@ -453,15 +453,26 @@ fn ascii_printable_to_symbol(buf: &mut WString, c: char) {
} }
} }
pub fn byte_to_symbol(c: char) -> WString {
let mut buff = WString::new();
let buf = &mut buff;
if c <= '\x1b' {
ctrl_to_symbol(buf, c);
} else if ('\u{30}'..'\u{7f}').contains(&c) {
// ASCII characters that are not control characters
ascii_printable_to_symbol(buf, c);
} else {
sprintf!(=> buf, "\\x%02x", 0x7f);
}
buff
}
/// Convert a wide-char to a symbol that can be used in our output. /// Convert a wide-char to a symbol that can be used in our output.
pub fn char_to_symbol(c: char) -> WString { pub(crate) fn char_to_symbol(c: char) -> WString {
let mut buff = WString::new(); let mut buff = WString::new();
let buf = &mut buff; let buf = &mut buff;
if c <= ' ' { if c <= ' ' {
ctrl_to_symbol(buf, c); ctrl_to_symbol(buf, c);
} else if c == '\u{7f}' {
// DEL is at the end of the ASCII range
sprintf!(=> buf, "\\x%02x", 0x7f);
} else if c < '\u{80}' { } else if c < '\u{80}' {
// ASCII characters that are not control characters // ASCII characters that are not control characters
ascii_printable_to_symbol(buf, c); ascii_printable_to_symbol(buf, c);