目前我在Bash中使用set -o vi
命令启用bash提示符的vi模式。
那么在ipython中如何启用这个功能呢?
如果有人最近进来,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'
看起来这个解决方案适用于许多其他支持readline的应用程序:
在你的~/.inputrc
文件中设置以下内容:
set editing-mode vi
set keymap vi
set convert-meta on
set convert-meta on
命令。它与Unicode输入冲突,因此如果您粘贴或键入Unicode字符,可能会触发各种事件,这可能会令人惊讶。例如尝试输入ü字符,您会看到一个有趣的结果。 - minrkset keymap vi
会改变接下来的命令所影响的键位映射(即模式),而 set convert-meta on
则会改变某些键的行为。我不确定你是否需要它们。 - s4yset convert-meta on
(及该行以下的任何内容)仅适用于命令模式,而不适用于插入模式。 - s4y你还可以交互式地在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
ipython
使用 readline 库,而这可以通过 ~/.inputrc
文件进行配置。你可以添加
set editing-mode vi
为了使所有基于readline
的应用程序使用vi风格的按键绑定而不是Emacs,您需要编辑该文件。
ipython
在版本5.0.0
中从readline
切换到了一个名为prompt_toolkit
的Python库,因此这个不再适用。 - jellycola我需要在IPython 5中能够交互式地切换模式,我发现可以通过即时重新创建提示管理器来实现:
a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()
~/.ipython/profile_default/ipython_config.py
中,可以帮助您使用vi绑定并防止烦人的 slowness issue(与切换vim模式有关)。c.TerminalInteractiveShell.editing_mode = 'vi'
c.TerminalInteractiveShell.emacs_bindings_in_vi_insert_mode = False
您可以在.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,并希望默认导入所有模型,则可以使用上述最后一行代码。
esc
行为,请设置c.TerminalInteractiveShell.emacs_bindings_in_vi_insert_mode = False
(在8.0.0上)。 - micimize