如何在ipython5.0.0中设置特定的vimbindings

2024-05-16 09:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我理解,因为ipython5.0.0使用了一个新的输入库(prompt_toolkit),它不再默认为.inputrc(*nix)中指定的编辑器模式。这个选项必须在Ipython配置文件中设置(参见https://stackoverflow.com/a/38329940/2915339)。在

我的问题是:在配置文件配置文件中设置了vi模式之后,如何指定特定的keybinding?例如,我喜欢用“jk”来逃避。在


Tags: httpscom配置文件选项ipythonnix模式编辑器
2条回答

你说得对。prompt_toolkit忽略.inputrc。在ipython5.0.0概要文件配置文件中,似乎没有一种方法为vi模式定义自定义键绑定。在

以下是我当前使用的解决方法。虽然不漂亮,但现在还管用。在

根据IPython docs,可以在启动配置脚本中指定键盘快捷键。在

我没有将jk重新绑定到ESC,而是在VimInsertMode()内部创建一个unicode“j”(u'j'),后面跟着一个unicode“k”(u'k'),这是切换到导航模式的prompt_toolkit事件的快捷方式。在

我用以下代码创建了一个.ipython/profile_default/startup/keybindings.py

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将根据需要帮助您实现其他快捷方式。在

这是一篇旧文章,但它帮助我找到了答案,所以我想我应该发布我是如何在ipython中为vi模式添加一些绑定的。我在~/.ipython/profile_default/startup/00中添加了以下代码-键绑定.py在vi导航模式下绑定到K和J。在

"""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)

相关问题 更多 >