diff --git a/tools/tui/readline/actions_test.go b/tools/tui/readline/actions_test.go index 037a1e0e8..589143843 100644 --- a/tools/tui/readline/actions_test.go +++ b/tools/tui/readline/actions_test.go @@ -474,4 +474,41 @@ func TestHistory(t *testing.T) { test(ActionHistoryNext, "a", "") test(ActionHistoryNext, "a", "") + ah := func(before_cursor, after_cursor string) { + ab := rl.text_upto_cursor_pos() + aa := rl.text_after_cursor_pos() + if diff := cmp.Diff(before_cursor, ab); diff != "" { + t.Fatalf("Text before cursor not as expected:\n%s", diff) + } + if diff := cmp.Diff(after_cursor, aa); diff != "" { + t.Fatalf("Text before cursor not as expected:\n%s", diff) + } + } + add_item("xyz1") + add_item("xyz2") + add_item("xyz11") + rl.perform_action(ActionHistoryIncrementalSearchBackwards, 1) + ah("", "") + + rl.text_to_be_added = "z" + rl.perform_action(ActionAddText, 1) + ah("xy", "z11") + rl.text_to_be_added = "2" + rl.perform_action(ActionAddText, 1) + ah("xy", "z2") + rl.text_to_be_added = "m" + rl.perform_action(ActionAddText, 1) + ah("No matches for: z2m", "") + rl.perform_action(ActionBackspace, 1) + ah("xy", "z2") + rl.perform_action(ActionBackspace, 1) + ah("xy", "z2") + rl.perform_action(ActionHistoryIncrementalSearchBackwards, 1) + ah("xy", "z1") + rl.perform_action(ActionHistoryIncrementalSearchBackwards, 1) + ah("xy", "z1") + rl.perform_action(ActionHistoryIncrementalSearchForwards, 1) + ah("xy", "z2") + rl.perform_action(ActionTerminateHistorySearchAndRestore, 1) + ah("a", "") } diff --git a/tools/tui/readline/history.go b/tools/tui/readline/history.go index feade6daf..c2b4cfd07 100644 --- a/tools/tui/readline/history.go +++ b/tools/tui/readline/history.go @@ -297,8 +297,8 @@ func (self *Readline) add_text_to_history_search(text string) { self.history_search.items = []*HistoryItem{} } else { items := make([]*HistoryItem, len(self.history.items)) - for i, x := range self.history.items { - items[i] = &x + for i := range self.history.items { + items[i] = &self.history.items[i] } for _, token := range self.history_search.tokens { matches := make([]*HistoryItem, 0, len(items)) @@ -319,7 +319,11 @@ func (self *Readline) add_text_to_history_search(text string) { } } if idx == -1 { - idx = len(self.history_search.items) - 1 + if self.history_search.backwards { + idx = len(self.history_search.items) - 1 + } else { + idx = 0 + } } self.history_search.current_idx = utils.Max(0, idx) self.markup_history_search()