Don't reattempt failing history pager search

In particular, this fixes the case

    ctrl-r foo ctrl-r

where foo substring-matches no more than one page's worth of results.
The second attempt will fall back to subsequence matching which is wrong.
This commit is contained in:
Johannes Altmanninger 2024-09-28 11:09:42 +02:00
parent ae7fd770ee
commit d00e900e5a

View file

@ -2362,7 +2362,11 @@ impl<'a> Reader<'a> {
} }
} }
rl::PagerToggleSearch => { rl::PagerToggleSearch => {
if self.history_pager.is_some() { if let Some(history_pager) = &self.history_pager {
if history_pager.history_index_start == 0 {
self.flash();
return;
}
self.fill_history_pager( self.fill_history_pager(
HistoryPagerInvocation::Advance, HistoryPagerInvocation::Advance,
SearchDirection::Forward, SearchDirection::Forward,
@ -2624,7 +2628,11 @@ impl<'a> Reader<'a> {
} }
} }
rl::HistoryPager => { rl::HistoryPager => {
if self.history_pager.is_some() { if let Some(history_pager) = &self.history_pager {
if !history_pager.can_go_backwards {
self.flash();
return;
}
self.fill_history_pager( self.fill_history_pager(
HistoryPagerInvocation::Advance, HistoryPagerInvocation::Advance,
SearchDirection::Backward, SearchDirection::Backward,
@ -2640,6 +2648,7 @@ impl<'a> Reader<'a> {
direction: SearchDirection::Backward, direction: SearchDirection::Backward,
history_index_start: 0, history_index_start: 0,
history_index_end: 0, history_index_end: 0,
can_go_backwards: false,
}); });
// Update the pager data. // Update the pager data.
self.pager.set_search_field_shown(true); self.pager.set_search_field_shown(true);
@ -4509,6 +4518,7 @@ struct HistoryPager {
/// The range in history covered by the history pager's current page. /// The range in history covered by the history pager's current page.
history_index_start: usize, history_index_start: usize,
history_index_end: usize, history_index_end: usize,
can_go_backwards: bool,
} }
fn history_pager_search( fn history_pager_search(
@ -4610,21 +4620,19 @@ impl ReaderData {
if search_term != zelf.pager.search_field_line.text() { if search_term != zelf.pager.search_field_line.text() {
return; // Stale request. return; // Stale request.
} }
if result.matched_commands.is_empty() && why == HistoryPagerInvocation::Advance {
// No more matches, keep the existing ones and flash.
zelf.flash();
return;
}
let history_pager = zelf.history_pager.as_mut().unwrap(); let history_pager = zelf.history_pager.as_mut().unwrap();
history_pager.direction = direction; history_pager.direction = direction;
match direction { match direction {
SearchDirection::Forward => { SearchDirection::Forward => {
assert!(index > result.final_index);
history_pager.history_index_start = result.final_index; history_pager.history_index_start = result.final_index;
history_pager.history_index_end = index; history_pager.history_index_end = index;
history_pager.can_go_backwards = true;
} }
SearchDirection::Backward => { SearchDirection::Backward => {
history_pager.history_index_start = index; history_pager.history_index_start = index;
history_pager.history_index_end = result.final_index; history_pager.history_index_end = result.final_index;
history_pager.can_go_backwards = result.have_more_results;
} }
}; };
zelf.pager.extra_progress_text = if result.have_more_results { zelf.pager.extra_progress_text = if result.have_more_results {