diff --git a/examples/select_actions_pager.py b/examples/select_actions_pager.py new file mode 100644 index 0000000..ee0ee30 --- /dev/null +++ b/examples/select_actions_pager.py @@ -0,0 +1,12 @@ +import questionary + +if __name__ == "__main__": + action = ( + questionary.select( + "Press Left/Right arraw keys or PageUp/PageDown or h/l(vim mode) to move one page", + choices=[str(x) for x in range(200)], + ).ask() + or "do nothing" + ) + + print(f"Selected {action}. Bye! 👋") diff --git a/questionary/prompts/select.py b/questionary/prompts/select.py index e41dbe5..b539546 100644 --- a/questionary/prompts/select.py +++ b/questionary/prompts/select.py @@ -243,6 +243,32 @@ def move_cursor_up(event): while not ic.is_selection_valid(): ic.select_previous() + def move_cursor_page_down(event): + rows = event.app.output.get_size().rows - 1 + current_row = ic.pointed_at % rows + for _ in range(rows): + ic.select_next() + for _ in range(rows - current_row - 1): + ic.select_next() + event.app._redraw() + for _ in range(rows - current_row - 1): + ic.select_previous() + while not ic.is_selection_valid(): + ic.select_next() + + def move_cursor_page_up(event): + rows = event.app.output.get_size().rows - 1 + current_row = ic.pointed_at % rows + for _ in range(rows): + ic.select_previous() + for _ in range(current_row): + ic.select_previous() + event.app._redraw() + for _ in range(current_row): + ic.select_next() + while not ic.is_selection_valid(): + ic.select_previous() + if use_search_filter: def search_filter(event): @@ -255,10 +281,16 @@ def search_filter(event): if use_arrow_keys: bindings.add(Keys.Down, eager=True)(move_cursor_down) bindings.add(Keys.Up, eager=True)(move_cursor_up) + bindings.add(Keys.Right, eager=True)(move_cursor_page_down) + bindings.add(Keys.Left, eager=True)(move_cursor_page_up) + bindings.add(Keys.PageDown, eager=True)(move_cursor_page_down) + bindings.add(Keys.PageUp, eager=True)(move_cursor_page_up) if use_jk_keys: bindings.add("j", eager=True)(move_cursor_down) bindings.add("k", eager=True)(move_cursor_up) + bindings.add("l", eager=True)(move_cursor_page_down) + bindings.add("h", eager=True)(move_cursor_page_up) if use_emacs_keys: bindings.add(Keys.ControlN, eager=True)(move_cursor_down)