How does one set specific vim-bindings in Ipython 5.0.0

ipython, linux, prompt-toolkit, python, vim

Solution

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.

Problem

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 be set in an Ipython profile configuration file (see https://stackoverflow.com/a/38329940/2915339). My question is: having set vi-mode in the profile configuration file, how does one specify a particular keybinding? I like to use 'jk' for escape, for instance.

Original source

Related problems