From ebd23c9f863f2aab8afc98a4bff60233fbb89821 Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Sun, 11 Aug 2024 14:39:29 +0200 Subject: [PATCH] Add back fish_key_reader --verbose See #10663 --- CHANGELOG.rst | 2 +- src/bin/fish_key_reader.rs | 28 +++++++++++++++++++--------- src/key.rs | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6dab4770f..bc49e2b1b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -100,7 +100,7 @@ Deprecations and removed features This bind mode has been removed. The behavior on paste is currently not meant to be configurable. - When an interactive fish is stopped or terminated by a signal that cannot be caught (SIGSTOP or SIGKILL), it may leave the terminal in a state where keypresses with modifiers are sent as CSI u sequences instead of traditional control characters or escape sequecnes (that are recognized by bash/readline). If this happens, you can use the ``reset`` command from ``ncurses`` to restore the terminal state. -- ``fish_key_reader --verbose`` is now ignored, so it no longer shows raw byte values or timing information. +- ``fish_key_reader --verbose`` no longer shows timing information. Raw byte values should no longer be necessary because fish now decodes them to the new human-readable key names for builtin bind. - Instant propagation of universal variables now only works on Linux and macOS. On other platforms, changes to universal variables may only become visible on the next prompt. diff --git a/src/bin/fish_key_reader.rs b/src/bin/fish_key_reader.rs index 1b41b8c2f..6d83da1a4 100644 --- a/src/bin/fish_key_reader.rs +++ b/src/bin/fish_key_reader.rs @@ -20,7 +20,7 @@ use fish::{ eprintf, fprintf, input::input_terminfo_get_name, input_common::{terminal_protocols_enable_ifn, CharEvent, InputEventQueue, InputEventQueuer}, - key::{self, Key}, + key::{self, char_to_symbol, Key}, panic::panic_handler, print_help::print_help, printf, @@ -83,7 +83,7 @@ fn sequence_name(recent_chars: &mut Vec, c: char) -> Option { } /// Process the characters we receive as the user presses keys. -fn process_input(continuous_mode: bool) -> i32 { +fn process_input(continuous_mode: bool, verbose: bool) -> i32 { let mut first_char_seen = false; let mut queue = InputEventQueue::new(STDIN_FILENO); let mut recent_chars1 = vec![]; @@ -101,6 +101,13 @@ fn process_input(continuous_mode: bool) -> i32 { if c == key::Invalid { continue; } + if verbose { + printf!("# decoded from: "); + for byte in kevt.seq.chars() { + printf!("%s", &char_to_symbol(byte)); + } + printf!("\n"); + } printf!("bind %s 'do something'\n", kevt.key); if let Some(name) = sequence_name(&mut recent_chars1, c) { printf!("bind -k %ls 'do something'\n", name); @@ -117,7 +124,7 @@ fn process_input(continuous_mode: bool) -> i32 { } /// Setup our environment (e.g., tty modes), process key strokes, then reset the environment. -fn setup_and_process_keys(continuous_mode: bool) -> i32 { +fn setup_and_process_keys(continuous_mode: bool, verbose: bool) -> i32 { set_interactive_session(true); topic_monitor_init(); threads::init(); @@ -141,16 +148,16 @@ fn setup_and_process_keys(continuous_mode: bool) -> i32 { eprintf!("\n"); } - process_input(continuous_mode) + process_input(continuous_mode, verbose) } -fn parse_flags(continuous_mode: &mut bool) -> ControlFlow { +fn parse_flags(continuous_mode: &mut bool, verbose: &mut bool) -> ControlFlow { let short_opts: &wstr = L!("+chvV"); let long_opts: &[WOption] = &[ wopt(L!("continuous"), ArgType::NoArgument, 'c'), wopt(L!("help"), ArgType::NoArgument, 'h'), wopt(L!("version"), ArgType::NoArgument, 'v'), - wopt(L!("verbose"), ArgType::NoArgument, 'V'), // Removed + wopt(L!("verbose"), ArgType::NoArgument, 'V'), ]; let args: Vec = std::env::args_os() @@ -178,7 +185,9 @@ fn parse_flags(continuous_mode: &mut bool) -> ControlFlow { ); return ControlFlow::Break(0); } - 'V' => {} + 'V' => { + *verbose = true; + } '?' => { printf!( "%s", @@ -210,8 +219,9 @@ fn main() { fn throwing_main() -> i32 { let mut continuous_mode = false; + let mut verbose = false; - if let ControlFlow::Break(i) = parse_flags(&mut continuous_mode) { + if let ControlFlow::Break(i) = parse_flags(&mut continuous_mode, &mut verbose) { return i; } @@ -220,5 +230,5 @@ fn throwing_main() -> i32 { return 1; } - setup_and_process_keys(continuous_mode) + setup_and_process_keys(continuous_mode, verbose) } diff --git a/src/key.rs b/src/key.rs index b5f476528..01e94ed90 100644 --- a/src/key.rs +++ b/src/key.rs @@ -454,7 +454,7 @@ fn ascii_printable_to_symbol(buf: &mut WString, c: char) { } /// Convert a wide-char to a symbol that can be used in our output. -pub(crate) fn char_to_symbol(c: char) -> WString { +pub fn char_to_symbol(c: char) -> WString { let mut buff = WString::new(); let buf = &mut buff; if c <= ' ' {