Improve key inputs

Add support proper implementations of -

- backspace
- ctrl-w
- ctrl-u

Also, improved sort and filter behavior.

Fixes: https://github.com/sayanarijit/xplr/issues/77
pull/82/head
Arijit Basu 3 years ago committed by Arijit Basu
parent 468cf7f3df
commit 1bb2622f24

@ -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<Self> {
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<Self> {
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::<Vec<char>>()
.into_iter()
.rev()
.collect::<String>();
self.input_buffer = Some(buf);
};
self.msg_out.push_back(MsgOut::Refresh);
Ok(self)
}
fn reset_input_buffer(mut self) -> Result<Self> {
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> {
self.explorer_config.filters.pop();
Ok(self)
}
fn reset_node_filters(mut self) -> Result<Self> {
self.explorer_config.filters.clear();
@ -1773,6 +1824,11 @@ impl App {
}
}
fn remove_last_node_sorter(mut self) -> Result<Self> {
self.explorer_config.sorters.pop();
Ok(self)
}
fn reverse_node_sorters(mut self) -> Result<Self> {
self.explorer_config.sorters = self
.explorer_config

@ -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

@ -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,

Loading…
Cancel
Save