diff --git a/src/app.rs b/src/app.rs index d6ef89e..b8df975 100644 --- a/src/app.rs +++ b/src/app.rs @@ -832,6 +832,12 @@ pub enum ExternalMsg { /// Example: `SetInputBuffer: foo` SetInputBuffer(String), + /// Remove input buffer's last character. + RemoveInputBufferLastCharacter, + + /// Remove input buffer's last word. + RemoveInputBufferLastWord, + /// Reset the input buffer back to null. It will not show in the UI. ResetInputBuffer, @@ -929,6 +935,9 @@ pub enum ExternalMsg { /// Example: `RemoveNodeFilterFromInput: RelativePathDoesStartWith` RemoveNodeFilterFromInput(NodeFilter), + /// Remove the last node filter. + RemoveLastNodeFilter, + /// Reset the node filters back to the default configuration. ResetNodeFilters, @@ -958,6 +967,9 @@ pub enum ExternalMsg { /// Reverse the node sorters. ReverseNodeSorters, + /// Remove the last node sorter. + RemoveLastNodeSorter, + /// Reset the node sorters back to the default configuration. ResetNodeSorters, @@ -1281,6 +1293,10 @@ impl App { ExternalMsg::BufferInput(input) => self.buffer_input(&input), ExternalMsg::BufferInputFromKey => self.buffer_input_from_key(key), ExternalMsg::SetInputBuffer(input) => self.set_input_buffer(input), + ExternalMsg::RemoveInputBufferLastCharacter => { + self.remove_input_buffer_last_character() + } + ExternalMsg::RemoveInputBufferLastWord => self.remove_input_buffer_last_word(), ExternalMsg::ResetInputBuffer => self.reset_input_buffer(), ExternalMsg::SwitchMode(mode) => self.switch_mode(&mode), ExternalMsg::Call(cmd) => self.call(cmd), @@ -1302,12 +1318,14 @@ impl App { ExternalMsg::RemoveNodeFilter(f) => self.remove_node_filter(f), ExternalMsg::RemoveNodeFilterFromInput(f) => self.remove_node_filter_from_input(f), ExternalMsg::ToggleNodeFilter(f) => self.toggle_node_filter(f), + ExternalMsg::RemoveLastNodeFilter => self.remove_last_node_filter(), ExternalMsg::ResetNodeFilters => self.reset_node_filters(), ExternalMsg::ClearNodeFilters => self.clear_node_filters(), ExternalMsg::AddNodeSorter(f) => self.add_node_sorter(f), ExternalMsg::RemoveNodeSorter(f) => self.remove_node_sorter(f), ExternalMsg::ReverseNodeSorter(f) => self.reverse_node_sorter(f), ExternalMsg::ToggleNodeSorter(f) => self.toggle_node_sorter(f), + ExternalMsg::RemoveLastNodeSorter => self.remove_last_node_sorter(), ExternalMsg::ReverseNodeSorters => self.reverse_node_sorters(), ExternalMsg::ResetNodeSorters => self.reset_node_sorters(), ExternalMsg::ClearNodeSorters => self.clear_node_sorters(), @@ -1500,6 +1518,34 @@ impl App { Ok(self) } + fn remove_input_buffer_last_character(mut self) -> Result { + if let Some(mut buf) = self.input_buffer { + buf.pop(); + self.input_buffer = Some(buf); + }; + self.msg_out.push_back(MsgOut::Refresh); + Ok(self) + } + + fn remove_input_buffer_last_word(mut self) -> Result { + if let Some(buf) = self.input_buffer { + let buf = buf + .chars() + .into_iter() + .rev() + .skip_while(|c| !c.is_ascii_alphanumeric()) + .skip_while(|c| c.is_ascii_alphanumeric()) + .collect::>() + .into_iter() + .rev() + .collect::(); + + self.input_buffer = Some(buf); + }; + self.msg_out.push_back(MsgOut::Refresh); + Ok(self) + } + fn reset_input_buffer(mut self) -> Result { self.input_buffer = None; self.msg_out.push_back(MsgOut::Refresh); @@ -1728,6 +1774,11 @@ impl App { } } + fn remove_last_node_filter(mut self) -> Result { + self.explorer_config.filters.pop(); + Ok(self) + } + fn reset_node_filters(mut self) -> Result { self.explorer_config.filters.clear(); @@ -1773,6 +1824,11 @@ impl App { } } + fn remove_last_node_sorter(mut self) -> Result { + self.explorer_config.sorters.pop(); + Ok(self) + } + fn reverse_node_sorters(mut self) -> Result { self.explorer_config.sorters = self .explorer_config diff --git a/src/config.yml b/src/config.yml index 7ad632d..4b9e102 100644 --- a/src/config.yml +++ b/src/config.yml @@ -391,22 +391,26 @@ modes: echo Refresh >> "${XPLR_PIPE_MSG_IN:?}" fi - SwitchMode: default - backspace: - help: clear + help: remove last character + messages: + - RemoveInputBufferLastCharacter + ctrl-w: + help: remove last word + messages: + - RemoveInputBufferLastWord + ctrl-u: + help: remove line messages: - SetInputBuffer: "" - esc: help: cancel messages: - SwitchMode: default - ctrl-c: help: terminate messages: - Terminate - default: messages: - BufferInputFromKey @@ -434,7 +438,17 @@ modes: - SwitchMode: default backspace: - help: clear + help: remove last character + messages: + - RemoveInputBufferLastCharacter + + ctrl-w: + help: remove last word + messages: + - RemoveInputBufferLastWord + + ctrl-u: + help: remove line messages: - SetInputBuffer: "" @@ -507,7 +521,17 @@ modes: - SwitchMode: default backspace: - help: clear + help: remove last character + messages: + - RemoveInputBufferLastCharacter + + ctrl-w: + help: remove last word + messages: + - RemoveInputBufferLastWord + + ctrl-u: + help: remove line messages: - SetInputBuffer: "" @@ -529,26 +553,59 @@ modes: name: filter key_bindings: on_key: + ctrl-x: + help: remove last filter + messages: + - RemoveLastNodeFilter + - SetInputBuffer: "" + - Explore backspace: - help: clear + help: remove last character + messages: + - RemoveNodeFilterFromInput: IRelativePathDoesContain + - RemoveInputBufferLastCharacter + - AddNodeFilterFromInput: IRelativePathDoesContain + - Explore + ctrl-w: + help: remove last word + messages: + - RemoveNodeFilterFromInput: IRelativePathDoesContain + - RemoveInputBufferLastWord + - AddNodeFilterFromInput: IRelativePathDoesContain + - Explore + ctrl-u: + help: remove line messages: + - RemoveNodeFilterFromInput: IRelativePathDoesContain - SetInputBuffer: "" - - ClearNodeFilters + - AddNodeFilterFromInput: IRelativePathDoesContain - Explore ctrl-r: - help: reset + help: reset filters messages: - SetInputBuffer: "" - ResetNodeFilters - Explore + ctrl-l: + help: clear filters + messages: + - SetInputBuffer: "" + - ClearNodeFilters + - Explore enter: - help: apply + help: apply filter messages: - SwitchMode: default esc: help: cancel messages: + - RemoveNodeFilterFromInput: IRelativePathDoesContain - SwitchMode: default + - Explore + ctrl-c: + help: terminate + messages: + - Terminate default: help: null messages: @@ -565,20 +622,25 @@ modes: remaps: {} on_key: backspace: - help: clear + help: remove last sorter messages: - - ClearNodeSorters + - RemoveLastNodeSorter - Explore '!': - help: reverse all + help: reverse sorters messages: - ReverseNodeSorters - Explore ctrl-r: - help: reset + help: reset sorters messages: - ResetNodeSorters - Explore + ctrl-l: + help: clear sorters + messages: + - ClearNodeSorters + - Explore r: help: by relative path messages: @@ -769,6 +831,11 @@ modes: help: next visited path messages: - NextVisitedPath + ctrl-l: + help: clear screen + messages: + - ClearScreen + - Refresh q: help: quit messages: @@ -828,7 +895,15 @@ modes: k: up on_key: backspace: - help: clear + help: remove last character + messages: + - RemoveInputBufferLastCharacter + ctrl-w: + help: remove last word + messages: + - RemoveInputBufferLastWord + ctrl-u: + help: remove line messages: - SetInputBuffer: "" ctrl-c: @@ -980,10 +1055,25 @@ modes: remaps: {} on_key: backspace: - help: clear + help: remove last character messages: - RemoveNodeFilterFromInput: IRelativePathDoesContain - - SetInputBuffer: '' + - RemoveInputBufferLastCharacter + - AddNodeFilterFromInput: IRelativePathDoesContain + - Explore + ctrl-w: + help: remove last word + messages: + - RemoveNodeFilterFromInput: IRelativePathDoesContain + - RemoveInputBufferLastWord + - AddNodeFilterFromInput: IRelativePathDoesContain + - Explore + ctrl-u: + help: remove line + messages: + - RemoveNodeFilterFromInput: IRelativePathDoesContain + - SetInputBuffer: "" + - AddNodeFilterFromInput: IRelativePathDoesContain - Explore ctrl-c: help: terminate diff --git a/src/input.rs b/src/input.rs index 0abc7e8..bfdf059 100644 --- a/src/input.rs +++ b/src/input.rs @@ -445,6 +445,7 @@ impl Key { Self::ShiftY => Some('Y'), Self::ShiftZ => Some('Z'), + Self::Space => Some(' '), Self::Special(c) => Some(c.to_owned()), _ => None,