skip to Main Content

In my shell (zsh) or in python, I can go backward through command history by pressing PageDown, and I can go forward by pressing PageUp.

But in ipython, these shortcuts are reversed.

Where are these shortcuts defined for ipython, and how can I reverse them back, so that

PageDown goes back in history, and PageUp goes forward in history?

I am using ipython3 version 5.8.0 on Debian 10.

2

Answers


  1. In IPython version 5.x, this is mentioned in the documentation: Specific config details — IPython 5.11.0.dev documentation

    To get the function to bind to, see key_binding/bindings/basic.py: The default is

    handle("pageup", filter=~has_selection)(get_by_name("previous-history"))
    handle("pagedown", filter=~has_selection)(get_by_name("next-history"))
    

    So, put this code in a startup file:

    from IPython import get_ipython
    from prompt_toolkit.filters import HasSelection
    from prompt_toolkit.keys import Keys
    from prompt_toolkit.key_binding.bindings.named_commands import get_by_name
    
    registry = get_ipython().pt_cli.application.key_bindings_registry
    registry.add_binding(Keys.PageUp, filter=~HasSelection())(get_by_name("next-history"))
    registry.add_binding(Keys.PageDown, filter=~HasSelection())(get_by_name("previous-history"))
    

    On newer IPython versions (such as 7.19.0) replace the registry = ... line with

    registry = get_ipython().pt_app.key_bindings
    

    Reference: Specific config details — IPython 7.19.0 documentation

    Login or Signup to reply.
  2. Create script in ~/.ipython/profile_default/startup directory with any name ending with extension .py or .ipy

    For example i created history_keybindings.py and put it inside ~/.ipython/profile_default/startup directory

    from IPython import get_ipython
    from IPython.terminal.shortcuts import previous_history_or_previous_completion, next_history_or_next_completion
    from prompt_toolkit.keys import Keys
    from prompt_toolkit.filters import HasSelection
    
    ip = get_ipython()
    
    registry = None
    
    if (getattr(ip, 'pt_app', None)):
       # for IPython versions 7.x
       registry = ip.pt_app.key_bindings
    elif (getattr(ip, 'pt_cli', None)):
       # for IPython versions 5.x
       registry = ip.pt_cli.application.key_bindings_registry
    
    if registry:
       registry.add_binding(Keys.PageUp, filter=(~HasSelection()))(previous_history_or_previous_completion)
       registry.add_binding(Keys.PageDown, filter=(~HasSelection()))(next_history_or_next_completion)
    

    Note: For more info check here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search