【问题标题】:How do I use vi keys in ipython under *nix?如何在 *nix 下的 ipython 中使用 vi 键?
【发布时间】:2012-05-10 18:42:28
【问题描述】:

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

如何在 ipython 中实现这一点?

【问题讨论】:

    标签: python bash vi ipython readline


    【解决方案1】:

    您可以在 .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 一起使用,并且希望默认导入所有模型。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果最近有人在这里闲逛,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'
        

        【讨论】:

        • 谢谢。这在 IPython、Jupyter 或 prompt_toolkit 的文档中的任何地方都很难找到。
        • 在哪里添加自定义键绑定映射?
        • 我对@9​​87654322@ 的回答显示了一种添加自定义键绑定的方法。
        • 在此之前必须将 ipython 升级到 5.0:pip install ipython --upgrade
        • 有什么方法可以跟踪我是处于正常模式还是插入模式?
        【解决方案4】:

        您还可以在 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
        

        【讨论】:

        • 我一直在试图弄清楚为什么 M-C-j 一直没有工作!
        【解决方案5】:

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

        set editing-mode vi
        

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

        【讨论】:

        • ipythonreadline 切换到5.0.0 中名为prompt_toolkit 的python 库,所以这不再有效。
        • 谢谢,这对于处理旧版本的 IPython 非常有用。
        【解决方案6】:

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

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

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

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

        【讨论】:

        • set convert-meta on非常小心。它与 unicode 条目冲突,因此如果粘贴或键入 unicode,则可以触发各种事件,这可能会令人惊讶。例如,尝试输入 ü,您会看到一个有趣的结果。
        • 你知道最后两行是做什么的吗?快速检查显示只有第一行给出了基本的 vi 键绑定 - 我希望我知道是否有理由添加其他的。
        • @weronika 所以,set convert-meta on(以及该行以下的任何内容)仅适用于命令模式,而不适用于插入模式。
        • 注意:这不再适用于 IPython 5.0.0。请参阅下面@imiric 的回答。
        猜你喜欢
        • 1970-01-01
        • 2012-08-18
        • 2012-03-09
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多