有没有办法在IPython Vi模式下替换存在的默认键绑定?

时间:2017-03-16 08:37:04

标签: python ipython jupyter

我正在使用IPython Vi模式,而IPython设置了许多默认键映射here。我做了一项研究herehere,发现我可以使用KeyBindingManager创建新的密钥绑定。

但是,如果我想创建的绑定存在,那么它就无法工作。例如,我在~/.ipython/profile_default/startup/vikeys.py中编写了一些代码:

from prompt_toolkit.filters.cli import ViNavigationMode, ViMode
from prompt_toolkit.filters import Always, IsReadOnly

# create `handle`
from IPython import get_ipython
ip = get_ipython()
if getattr(ip, 'pt_cli'):
    registry = ip.pt_cli.application.key_bindings_registry
    handle = registry.add_binding

navigation_mode = ViNavigationMode() & ViMode() & Always()

@handle('t', filter=navigation_mode)
def _(event):
    """
    Go up, but if we enter a new history entry, move to the start of the
    line.
    """
    event.current_buffer.auto_up(
        count=event.arg, go_to_start_of_line_if_history_changes=True)

由于t已映射here,因此我的绑定不起作用。

我还尝试用下面的代码替换handle,但没有效果:

# create `handle`
from prompt_toolkit.key_binding.manager import KeyBindingManager
manager = KeyBindingManager.for_prompt()
handle = manager.registry.add_binding

那么,有没有办法替换IPython中现有的键绑定?

1 个答案:

答案 0 :(得分:0)

自己回答问题,帮助那些遇到同样问题的人。

在阅读源代码后,我发现向eager=True添加handle参数将覆盖默认的键绑定。

Here是替换Dvorak用户的默认导航键的示例。