【发布时间】:2012-05-10 18:42:28
【问题描述】:
目前在 Bash 中,我使用 set -o vi 在我的 bash 提示符中启用 vi 模式。
如何在 ipython 中实现这一点?
【问题讨论】:
标签: python bash vi ipython readline
目前在 Bash 中,我使用 set -o vi 在我的 bash 提示符中启用 vi 模式。
如何在 ipython 中实现这一点?
【问题讨论】:
标签: python bash vi ipython readline
您可以在 .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 一起使用,并且希望默认导入所有模型。
【讨论】:
我需要能够在 IPython 5 中以交互方式切换模式,我发现您可以通过即时重新创建提示管理器来做到这一点:
a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()
【讨论】:
如果最近有人在这里闲逛,IPython 5.0 switched from readline to prompt_toolkit,所以这个问题的更新答案是传递一个选项:
$ ipython --TerminalInteractiveShell.editing_mode=vi
... 或在配置文件配置中全局设置(~/.ipython/profile_default/ipython_config.py;如果没有,请使用ipython profile create 创建):
c.TerminalInteractiveShell.editing_mode = 'vi'
【讨论】:
pip install ipython --upgrade
您还可以在 Vi 模式和 Emacs 模式之间进行交互切换。根据readline docs 在它们之间切换,您应该能够使用 MCj 组合键,但这似乎只允许我切换到 vi 模式 - 在我的 Mac 上(ESC 用作“元”)键)它是: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
【讨论】:
ipython 使用 readline 库,这可以使用 ~/.inputrc 文件进行配置。你可以添加
set editing-mode vi
到该文件以使所有基于readline 的应用程序使用vi 样式键绑定而不是Emacs。
【讨论】:
ipython 从readline 切换到5.0.0 中名为prompt_toolkit 的python 库,所以这不再有效。
看起来该解决方案适用于许多其他 readline 兼容应用:
在您的~/.inputrc 文件中设置以下内容:
set editing-mode vi
set keymap vi
set convert-meta on
【讨论】:
set convert-meta on要非常小心。它与 unicode 条目冲突,因此如果粘贴或键入 unicode,则可以触发各种事件,这可能会令人惊讶。例如,尝试输入 ü,您会看到一个有趣的结果。
set convert-meta on(以及该行以下的任何内容)仅适用于命令模式,而不适用于插入模式。