diff --git a/src/model.rs b/src/model.rs index 6e122461..c820e12b 100644 --- a/src/model.rs +++ b/src/model.rs @@ -425,6 +425,7 @@ impl Model { cmd: self.query.get_cmd(), query: self.query.get_fz_query(), cmd_query: self.query.get_cmd_query(), + in_query_mode: self.query.in_query_mode(), clear_selection: ClearStrategy::DontClear, }; @@ -503,7 +504,7 @@ impl Model { } Event::EvActDeleteCharEOF => { - if env.query.is_empty() { + if env.in_query_mode && env.query.is_empty() || !env.in_query_mode && env.cmd_query.is_empty() { next_event = Some(Event::EvActAbort); continue; } @@ -754,6 +755,7 @@ struct ModelEnv { pub query: String, pub cmd_query: String, pub clear_selection: ClearStrategy, + pub in_query_mode: bool, } #[derive(Clone)] diff --git a/src/query.rs b/src/query.rs index c780ff58..6fab3525 100644 --- a/src/query.rs +++ b/src/query.rs @@ -131,6 +131,13 @@ impl Query { self.cmd_history_before = options.cmd_history.to_vec(); } + pub fn in_query_mode(&self) -> bool { + match self.mode { + QueryMode::CMD => false, + QueryMode::QUERY => true, + } + } + pub fn get_fz_query(&self) -> String { self.fz_query_before .iter() diff --git a/test/test_skim.py b/test/test_skim.py index b37361c6..d3ed1b1f 100644 --- a/test/test_skim.py +++ b/test/test_skim.py @@ -385,6 +385,70 @@ class TestSkim(TestBase): self.tmux.send_keys(Ctrl('m')) self.tmux.until(lambda lines: not lines[-1].startswith('>')) + def test_key_bindings_interactive(self): + self.tmux.send_keys(f"{SK} -i --cmd-query 'foo bar foo-bar'", Key('Enter')) + self.tmux.until(lambda lines: lines[-1].startswith('c>')) + + # Ctrl-A + self.tmux.send_keys(Ctrl('a'), Key('(')) + self.tmux.until(lambda lines: lines[-1] == 'c> (foo bar foo-bar') + + ## Meta-F + self.tmux.send_keys(Alt('f'), Key(')')) + self.tmux.until(lambda lines: lines[-1] == 'c> (foo) bar foo-bar') + + # CTRL-B + self.tmux.send_keys(Ctrl('b'), 'var') + self.tmux.until(lambda lines: lines[-1] == 'c> (foovar) bar foo-bar') + + # Left, CTRL-D + self.tmux.send_keys(Key('Left'), Key('Left'), Ctrl('d')) + self.tmux.until(lambda lines: lines[-1] == 'c> (foovr) bar foo-bar') + + # # META-BS + self.tmux.send_keys(Alt('BSpace')) + self.tmux.until(lambda lines: lines[-1] == 'c> (r) bar foo-bar') + + # # # CTRL-Y + self.tmux.send_keys(Ctrl('y'), Ctrl('y')) + self.tmux.until(lambda lines: lines[-1] == 'c> (foovfoovr) bar foo-bar') + + # META-B + self.tmux.send_keys(Alt('b'), Key('Space'), Key('Space')) + self.tmux.until(lambda lines: lines[-1] == 'c> ( foovfoovr) bar foo-bar') + + # CTRL-F / Right + self.tmux.send_keys( Ctrl('f'), Key('Right'), '/') + self.tmux.until(lambda lines: lines[-1] == 'c> ( fo/ovfoovr) bar foo-bar') + + # CTRL-H / BS + self.tmux.send_keys( Ctrl('h'), Key('BSpace')) + self.tmux.until(lambda lines: lines[-1] == 'c> ( fovfoovr) bar foo-bar') + + # CTRL-E + self.tmux.send_keys(Ctrl('e'), 'baz') + self.tmux.until(lambda lines: lines[-1] == 'c> ( fovfoovr) bar foo-barbaz') + + # CTRL-U + self.tmux.send_keys( Ctrl('u')) + self.tmux.until(lambda lines: lines[-1] == 'c>') + + # CTRL-Y + self.tmux.send_keys( Ctrl('y')) + self.tmux.until(lambda lines: lines[-1] == 'c> ( fovfoovr) bar foo-barbaz') + + # CTRL-W + self.tmux.send_keys( Ctrl('w'), 'bar-foo') + self.tmux.until(lambda lines: lines[-1] == 'c> ( fovfoovr) bar bar-foo') + + # # META-D + self.tmux.send_keys(Alt('b'), Alt('b'), Alt('d'), Ctrl('a'), Ctrl('y')) + self.tmux.until(lambda lines: lines[-1] == 'c> bar( fovfoovr) bar -foo') + + # CTRL-M + self.tmux.send_keys(Ctrl('m')) + self.tmux.until(lambda lines: not lines[-1].startswith('c>')) + def test_read0(self): nfiles = subprocess.check_output("find .", shell=True).decode("utf-8").strip().split("\n") num_of_files = len(nfiles)