6

我知道因为 Ipython 5.0.0 使用新的输入库 (prompt_toolkit),它不再默认为 .inputrc (*nix) 中指定的编辑器模式。此选项必须在 Ipython 配置文件中设置(请参阅https://stackoverflow.com/a/38329940/2915339)。

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

4

2 回答 2

10

你是对的。prompt_toolkit忽略.inputrc。似乎没有办法vi在 IPython 5.0.0 配置文件中为模式定义自定义键绑定。

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

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

我没有重新绑定jk到,而是在切换到导航模式的事件的快捷方式中创建了一个 unicode "j" ( ),后跟一个 unicode "k" ( ) 。ESCu'j'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)

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

于 2016-08-07T04:12:15.620 回答
8

这是一篇旧帖子,但它帮助我找到了答案,所以我想我会发布如何在 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)
于 2018-11-28T17:37:30.613 回答