如何在*nix系统下在IPython中使用vi键?

115

目前我在Bash中使用set -o vi命令启用bash提示符的vi模式。

那么在ipython中如何启用这个功能呢?

7个回答

213

如果有人最近进来,IPython 5.0从readline转换到prompt_toolkit,因此对这个问题的更新答案是传递一个选项:

$ ipython --TerminalInteractiveShell.editing_mode=vi

……或者在个人配置文件(~/.ipython/profile_default/ipython_config.py)中全局设置。如果您没有该文件,请使用ipython profile create进行创建。

c.TerminalInteractiveShell.editing_mode = 'vi'

7
谢谢。在IPython、Jupyter或prompt_toolkit的文档中,要找到这个信息实在太难了。我会尽力让翻译更加通俗易懂,但不改变原意。 - nth
3
我应该把我的自定义按键绑定映射添加到哪里? - Aravinda
3
有没有方法可以追踪我当前是在普通模式还是插入模式下? - Peeyush Kushwaha
非常好的答案,谢谢。当你读到这样简单的答案时,总是让人放心,知道你正在处理一个经过深思熟虑的工具,它会支持你。 - arcseldon
为了避免emacs绑定干扰您的esc行为,请设置c.TerminalInteractiveShell.emacs_bindings_in_vi_insert_mode = False(在8.0.0上)。 - micimize
显示剩余4条评论

32

看起来这个解决方案适用于许多其他支持readline的应用程序:

在你的~/.inputrc文件中设置以下内容:

set editing-mode vi
set keymap vi
set convert-meta on

来源: http://www.jukie.net/bart/blog/20040326082602


8
非常小心使用 set convert-meta on 命令。它与Unicode输入冲突,因此如果您粘贴或键入Unicode字符,可能会触发各种事件,这可能会令人惊讶。例如尝试输入ü字符,您会看到一个有趣的结果。 - minrk
4
你知道最后两行是做什么的吗?快速检查显示只有第一行提供了基本的vi键绑定 - 我希望知道是否有添加其他行的原因。 - weronika
@weronika 所以,set convert-meta on(及该行以下的任何内容)仅适用于命令模式,而不适用于插入模式。 - s4y
6
注意:截至IPython 5.0.0,此方法已不再有效。请参见下面@imiric的答案。 - Jason Sundram

13

你还可以交互式地在Vi模式和Emacs模式之间切换。根据readline文档,要在它们之间切换,您应该能够使用“Meta”+CTRL+j键组合,但这似乎只允许我切换到vi模式 - 在我的Mac上(其中ESC用作“Meta”键),它是: ESC+CTRL+j。要切换回Emacs模式,可以使用CTRL+e,但对我来说似乎不起作用 - 我必须改为使用'Meta'+CTRL+e - 在我的Mac上是:ESC+CTRL+e

请注意,我的~/.inputrc设置如下:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

我一直在努力弄清楚为什么 M-C-j 一直都不能工作! - shangxiao

11

ipython 使用 readline 库,而这可以通过 ~/.inputrc 文件进行配置。你可以添加

set editing-mode vi

为了使所有基于readline的应用程序使用vi风格的按键绑定而不是Emacs,您需要编辑该文件。


13
ipython在版本5.0.0中从readline切换到了一个名为prompt_toolkit的Python库,因此这个不再适用。 - jellycola
谢谢,这对处理旧版本的IPython非常有用。 - timgeb

10

我需要在IPython 5中能够交互式地切换模式,我发现可以通过即时重新创建提示管理器来实现:

a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()

1
将以下两个配置添加到~/.ipython/profile_default/ipython_config.py中,可以帮助您使用vi绑定并防止烦人的 slowness issue(与切换vim模式有关)。
c.TerminalInteractiveShell.editing_mode = 'vi'
c.TerminalInteractiveShell.emacs_bindings_in_vi_insert_mode = False

0

您可以在.ipython启动配置文件中设置vi。如果没有,请创建一个,通过将一个名为start.py的文件添加到~/.ipython/profile_default/startup/。以下是一个示例:

# Initializing script for ipython in ~/.ipython/profile_default/startup/
from IPython import get_ipython
ipython = get_ipython()

# If in ipython, set vi and load autoreload extension
if 'ipython' in globals():
    ipython.editing_mode = 'vi'
    ipython.magic('load_ext autoreload')
    ipython.magic('autoreload 2')
from Myapp.models import * 

如果您使用IPython与Django,并希望默认导入所有模型,则可以使用上述最后一行代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接