如何在* nix下的ipython中使用vi键?


94

当前在Bash中,我用于set -o vi在bash提示符中启用vi模式。

我如何在ipython中进行此操作?

注意:如果答案适用于所有* nix,我将从标题中删除OS X :)

Answers:


165

如果有人最近在这里闲逛,那么IPython 5.0从readline切换到hint_toolkit,因此对此问题的更新答案是传递一个选项:

$ ipython --TerminalInteractiveShell.editing_mode=vi

...或在配置文件配置中进行全局设置(~/.ipython/profile_default/ipython_config.pyipython profile create如果没有,则使用创建):

c.TerminalInteractiveShell.editing_mode = 'vi'

4
我来这里发布答案-感谢您击败我:)
杰森·桑德拉姆

2
谢谢。在IPython,Jupyter或hint_toolkit的文档中找不到任何地方都非常麻烦。
第n

2
在哪里添加我的自定义键绑定映射?
Aravinda

我对这个问题的回答显示了一种添加自定义键绑定的方法。
jellycola'8

2
有什么方法可以跟踪我是处于普通模式还是插入模式?
Peeyush Kushwaha

32

看来解决方案适用于许多其他与Readline兼容的应用程序:

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

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

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


7
非常小心set convert-meta on。它与unicode输入冲突,因此,如果粘贴或键入unicode,则可以触发各种事件,这可能令人惊讶。例如,尝试键入ü,您将看到一个有趣的结果。
明斯克2012年

4
您知道最后两行做什么吗?快速检查表明,仅第一行给出了基本的vi键盘绑定-我希望我知道是否有理由添加其他键。
weronika


@weronika因此,set convert-meta on(以及该行下的所有内容)将仅适用于命令模式,而不适用于插入模式。
s4y

6
注意:从IPython 5.0.0开始,这不再起作用。请参阅下面的@imiric答案。
杰森·桑德拉姆

11

您也可以在Vi-mode和Emacs模式之间交互切换。根据readline文档在它们之间进行切换,您应该能够使用MCj组合键,但这似乎只允许我切换到vi模式-在Mac上(其中ESC被用作“ Meta”键) )是:ESC+ CTRL+ j。要切换回Emacs模式,可以使用Ce,但对我而言似乎不起作用-我不得不改用MCe-在Mac上是:ESC+ CTRL+ e

仅供参考我的〜/ .inputrc设置如下:

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

我一直想弄清楚为什么MCj一直没有工作!
shangxiao 2015年

9

ipython使用readline库,并且可以使用该~/.inputrc文件进行配置。你可以加

set editing-mode vi

到该文件,以使所有readline基础应用程序都使用vi样式键绑定而不是Emacs。


9
ipythonreadlinepython库切换到prompt_toolkit5.0.0因此不再起作用。
jellycola'8

谢谢,这对于处理旧版本的IPython非常有用。
timgeb

8

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

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

0

您可以在.ipython启动配置文件中设置vi。如果没有,则创建一个文件,方法是添加一个~/.ipython/profile_default/startup/名为的文件start.py。这是一个例子:

# 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一起使用,并且要默认导入所有模型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.