diff --git a/doc_src/cmds/bind.rst b/doc_src/cmds/bind.rst index 2f08909fe..9b4f166cf 100644 --- a/doc_src/cmds/bind.rst +++ b/doc_src/cmds/bind.rst @@ -100,6 +100,10 @@ The following special input functions are available: move one character to the left. If the completion pager is active, select the previous completion instead. +``backward-char-passive`` + move one character to the left, but do not trigger any non-movement-related operations. If the cursor is at the start of + the commandline, does nothing. Does not change the selected item in the completion pager UI when shown. + ``backward-bigword`` move one whitespace-delimited word to the left @@ -191,6 +195,11 @@ The following special input functions are available: move one character to the right; or if at the end of the commandline, accept the current autosuggestion. If the completion pager is active, select the next completion instead. +``forward-char-passive`` + move one character to the right, but do not trigger any non-movement-related operations. If the cursor is at the end of the + commandline, does not accept the current autosuggestion (if any). Does not change the selected item in the completion pager, + if shown. + ``forward-single-char`` move one character to the right; or if at the end of the commandline, accept a single char from the current autosuggestion. diff --git a/src/input.rs b/src/input.rs index 7f286a9c8..270ddad08 100644 --- a/src/input.rs +++ b/src/input.rs @@ -119,6 +119,7 @@ const fn make_md(name: &'static wstr, code: ReadlineCmd) -> InputFunctionMetadat make_md(L!("and"), ReadlineCmd::FuncAnd), make_md(L!("backward-bigword"), ReadlineCmd::BackwardBigword), make_md(L!("backward-char"), ReadlineCmd::BackwardChar), + make_md(L!("backward-char-passive"), ReadlineCmd::BackwardCharPassive), make_md(L!("backward-delete-char"), ReadlineCmd::BackwardDeleteChar), make_md(L!("backward-jump"), ReadlineCmd::BackwardJump), make_md(L!("backward-jump-till"), ReadlineCmd::BackwardJumpTill), @@ -153,6 +154,7 @@ const fn make_md(name: &'static wstr, code: ReadlineCmd) -> InputFunctionMetadat make_md(L!("force-repaint"), ReadlineCmd::ForceRepaint), make_md(L!("forward-bigword"), ReadlineCmd::ForwardBigword), make_md(L!("forward-char"), ReadlineCmd::ForwardChar), + make_md(L!("forward-char-passive"), ReadlineCmd::ForwardCharPassive), make_md(L!("forward-jump"), ReadlineCmd::ForwardJump), make_md(L!("forward-jump-till"), ReadlineCmd::ForwardJumpTill), make_md(L!("forward-single-char"), ReadlineCmd::ForwardSingleChar), diff --git a/src/input_common.rs b/src/input_common.rs index ce7b73471..cd97c6231 100644 --- a/src/input_common.rs +++ b/src/input_common.rs @@ -34,7 +34,9 @@ pub enum ReadlineCmd { EndOfLine, ForwardChar, BackwardChar, + BackwardCharPassive, ForwardSingleChar, + ForwardCharPassive, ForwardWord, BackwardWord, ForwardBigword, diff --git a/src/reader.rs b/src/reader.rs index 1322008f8..343adb8a5 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -2497,6 +2497,14 @@ fn handle_readline_command(&mut self, c: ReadlineCmd, rls: &mut ReadlineLoopStat self.update_buff_pos(elt, Some(el.position() - 1)); } } + rl::BackwardCharPassive => { + let (elt, el) = self.active_edit_line(); + if el.position() != 0 { + if elt == EditableLineTag::SearchField || !self.is_navigating_pager_contents() { + self.update_buff_pos(elt, Some(el.position() - 1)); + } + } + } rl::ForwardChar | rl::ForwardSingleChar => { let (elt, el) = self.active_edit_line(); if self.is_navigating_pager_contents() { @@ -2511,6 +2519,14 @@ fn handle_readline_command(&mut self, c: ReadlineCmd, rls: &mut ReadlineLoopStat self.update_buff_pos(elt, Some(el.position() + 1)); } } + rl::ForwardCharPassive => { + let (elt, el) = self.active_edit_line(); + if !self.is_at_end(el) { + if elt == EditableLineTag::SearchField || !self.is_navigating_pager_contents() { + self.update_buff_pos(elt, Some(el.position() + 1)); + } + } + } rl::BackwardKillWord | rl::BackwardKillPathComponent | rl::BackwardKillBigword => { let style = match c { rl::BackwardKillBigword => MoveWordStyle::Whitespace, @@ -4494,7 +4510,9 @@ fn command_ends_paging(c: ReadlineCmd, focused_on_search_field: bool) -> bool { | rl::CompleteAndSearch | rl::HistoryPager | rl::BackwardChar + | rl::BackwardCharPassive | rl::ForwardChar + | rl::ForwardCharPassive | rl::ForwardSingleChar | rl::UpLine | rl::DownLine diff --git a/tests/checks/tmux-complete.fish b/tests/checks/tmux-complete.fish index a9195f21e..81ab019d1 100644 --- a/tests/checks/tmux-complete.fish +++ b/tests/checks/tmux-complete.fish @@ -102,3 +102,13 @@ isolated-tmux send-keys C-e M-f Space nothing tmux-sleep isolated-tmux capture-pane -p # CHECK: prompt 7> echo suggest nothing + +isolated-tmux send-keys C-u 'bind \cs forward-char-passive' Enter C-l +isolated-tmux send-keys C-u 'bind \cb backward-char-passive' Enter C-l +isolated-tmux send-keys C-u 'echo do not accept this' Enter C-l +tmux-sleep +isolated-tmux send-keys 'echo do not accept thi' C-b C-b Delete C-b C-s 'h' +tmux-sleep +isolated-tmux send-keys C-s C-s C-s 'x' +isolated-tmux capture-pane -p +# CHECK: prompt 10> echo do not accept thix