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

gak*_*gak 85 python vi bash readline ipython

目前在Bash我用set -o vi我的bash提示启用vi模式.

我如何在ipython中实现这一目标?

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

imi*_*ric 147

如果有人最近在这里游荡,IPython 5.0从readline切换到prompt_toolkit,所以这个问题的更新答案是传递一个选项:

$ ipython --TerminalInteractiveShell.editing_mode=vi
Run Code Online (Sandbox Code Playgroud)

...或者在配置文件配置中全局设置(如果没有配置~/.ipython/profile_default/ipython_config.py,则创建ipython profile create它):

c.TerminalInteractiveShell.editing_mode = 'vi'
Run Code Online (Sandbox Code Playgroud)

  • 我来这里发布这个答案 - 谢谢你打败我:) (3认同)
  • 谢谢。这在 IPython、Jupyter 或 prompt_toolkit 的文档中很难找到。 (3认同)
  • 我在哪里添加我的自定义键绑定映射? (3认同)
  • 有什么方法可以跟踪我是处于普通模式还是插入模式? (2认同)

gak*_*gak 32

看起来解决方案适用于许多其他与readline兼容的应用:

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

set editing-mode vi
set keymap vi
set convert-meta on
Run Code Online (Sandbox Code Playgroud)

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

  • 要非常小心`set convert-meta on`.它与unicode条目冲突,因此如果您粘贴或键入unicode,您可以触发各种事件,这可能会令人惊讶.例如,尝试输入ü,您将看到一个有趣的结果. (6认同)
  • 注意:这不再适用于IPython 5.0.0.请参阅下面的@imiric的答案. (5认同)
  • 你知道最后两行是做什么的吗?快速检查显示只有第一行给出了基本的vi键绑定 - 我希望我知道是否有理由添加其他键. (4认同)

Pie*_*erz 11

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

我的〜/ .inputrc的设置如下:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
Run Code Online (Sandbox Code Playgroud)


Nou*_*him 9

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

set editing-mode vi
Run Code Online (Sandbox Code Playgroud)

该文件使所有readline基于应用程序使用vi样式的键绑定而不是Emacs.

  • ``ipython`从`readline`切换到`5.0.0`中名为`prompt_toolkit`的python库,所以这不再有效. (9认同)

Lex*_*x R 8

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

a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()
Run Code Online (Sandbox Code Playgroud)