How does one set specific vim-bindings in Ipython 5.0.0

前端 未结 2 1355
后悔当初
后悔当初 2021-01-12 21:33

I understand that because Ipython 5.0.0 uses a new input library (prompt_toolkit) it no longer defaults to the editor mode specified in .inputrc (*nix). This option has to b

相关标签:
2条回答
  • 2021-01-12 22:08

    This is an old post but it helped me find my answer so I thought I would post how I added a couple of bindings to vi mode in ipython. I added the following code in ~/.ipython/profile_default/startup/00-keybindings.py to bind to K and J in vi navigation mode.

    """Improve history access so I can skip over functions"""
    
    from IPython import get_ipython
    from prompt_toolkit.enums import DEFAULT_BUFFER
    from prompt_toolkit.filters import HasFocus, ViNavigationMode
    from prompt_toolkit.key_binding.bindings.named_commands import get_by_name
    
    ip = get_ipython()
    registry = ip.pt_app.key_bindings
    ph = get_by_name('previous-history')
    nh = get_by_name('next-history')
    registry.add_binding('K',
                         filter=(HasFocus(DEFAULT_BUFFER) &
                                 ViNavigationMode()))(ph)
    registry.add_binding('J',
                         filter=(HasFocus(DEFAULT_BUFFER) &
                                 ViNavigationMode()))(nh)
    
    0 讨论(0)
  • 2021-01-12 22:10

    You're right. prompt_toolkit ignores .inputrc. There does not seem to be a way to define custom keybindings for the vi mode in the IPython 5.0.0 profile configuration file.

    Here's workaround I'm currently using. It's not pretty, but it works for now.

    According to the IPython docs, you can specify Keyboard Shortcuts in a startup configuration script.

    Instead of rebinding jk to ESC, I'm making a unicode "j" (u'j') followed by a unicode "k" (u'k') inside of VimInsertMode() a shortcut for a prompt_toolkit event that switches to navigation mode.

    I created a .ipython/profile_default/startup/keybindings.py with the following code:

    from IPython import get_ipython
    from prompt_toolkit.enums import DEFAULT_BUFFER
    from prompt_toolkit.filters import HasFocus, ViInsertMode
    from prompt_toolkit.key_binding.vi_state import InputMode
    
    
    ip = get_ipython()
    
    def switch_to_navigation_mode(event):
        vi_state = event.cli.vi_state
        vi_state.reset(InputMode.NAVIGATION)
    
    if getattr(ip, 'pt_cli'):
        registry = ip.pt_cli.application.key_bindings_registry
        registry.add_binding(u'j',u'k',
                             filter=(HasFocus(DEFAULT_BUFFER)
                                     & ViInsertMode()))(switch_to_navigation_mode)
    

    The prompt_toolkit source will help you implement other shortcuts as needed.

    0 讨论(0)
提交回复
热议问题