如何在Ipython 5.0.0中设置特定的vim绑定

jei*_*her 6 python linux vim ipython prompt-toolkit

据我所知,因为IPython的5.0.0采用了新的输入库(prompt_toolkit)不再默认为.inputrc文件(*nix中)指定的编辑模式.必须在Ipython配置文件配置文件中设置此选项(请参阅/sf/answers/2683095831/).

我的问题是:在配置文件配置文件中设置了vi-mode,如何指定特定的键绑定?例如,我喜欢用'jk'来逃避.

jel*_*ola 8

你是对的.prompt_toolkit无视.inputrc.似乎没有办法为viIPython 5.0.0配置文件配置文件中的模式定义自定义键绑定.

这是我正在使用的解决方法.它不漂亮,但它现在有效.

根据IPython文档,您可以在启动配置脚本中指定键盘快捷键.

代替再结合的jkESC,我正在做一个unicode"J"( u'j'),随后一个unicode"K"(u'k'内部)VimInsertMode()用于快捷方式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)
Run Code Online (Sandbox Code Playgroud)

prompt_toolkit源代码将帮助您根据需要实现其他快捷方式.

  • 这个`keybindings.py`在IPython 5.1.0和7.0.1之间停止了一段时间,错误信息''TerminalInteractiveShell'对象没有属性'pt_cli'.有关修复,请参阅https://github.com/ipython/ipython/pull/11426/commits/e08dc1b4dd30e8d2b607134693f226e8a22100ec#diff-d47c339db04f28c44a59c6662dbd53eaR228. (3认同)

Gar*_*hop 7

这是一篇旧帖子,但它帮助我找到了答案,所以我想我会发布如何在 ipython 中向 vi 模式添加几个绑定。我在 ~/.ipython/profile_default/startup/00-keybindings.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)
Run Code Online (Sandbox Code Playgroud)