IPython 5.0 和控制台中的键绑定

IPython 5.0 and key bindings in console

IPython的新版本不再依赖readline,而是使用纯Python库prompt-toolkit,解决了Apple和[=51的维护问题=]' 系统。

一个新功能是能够编辑多行代码块,使用光标键在代码块中自由移动——有了这个功能,至少对我来说,这是一个问题:因为 ret 在您的代码中插入一个新行,要将整个块传递给解释器,您必须使用快捷方式 alt+ret 或不太方便的键序列 esc 后跟 ret.

我说,这是个问题,因为我选择的终端仿真器是 XTerm,在许多 Linux 发行版上,快捷方式 alt+ret 未传递给应用程序,但它直接由 XTerm 使用,其中 IPython 为 运行,以切换所述终端的屏幕填充度(@ThomasDickey, xterm 的维护者和合著者指出,默认情况下,xterm 不关心向应用程序发送 Enter 上的修饰符位,即使在取消绑定 Fullscreen 操作时也是如此。

出于这个原因,我想至少修改这个特定的 IPython 键绑定。

我找到了 IPython 的基于 readline 的先前版本的说明(某种程度上)不适用于新的 5.0 版本。

我需要的是引导我在 IPython 的用户文档中找到我可以绑定的可能操作的名称、与操作绑定的快捷方式的名称以及配置新键绑定的过程。

如果没有这种规范的答案,我 可能 对完成此特定键绑定的方法感到满意,条件是该方法仍然适用于 IPython 6.0

ctrl+j或者ctrl+m 键盘快捷键正在验证条目。

您可以更改 xterm 的配置。

xterm 是可配置的(并记录在案)。在 xterm 手册中,Default Key Bindings 部分显示了此键的默认绑定:

                        Alt <Key>Return:fullscreen() \n\

您可以通过不止一种方式抑制绑定:

  • 使用 omitTranslation 资源抑制功能
  • fullscreen 资源设置为 never

然而,仅仅抑制它不会让它发送一些有趣的东西(xterm 忽略 Enter 的修饰符)。设置 translation 资源有效,例如,在您的 $HOME/.Xdefaults 文件中:

*VT100*translations:      #override \n\ 
     Alt <Key>Return: string("3[27;3;13~")

在使用 prompt_toolkit 时修改配置中的键盘快捷键(目前)是不可能的;尽管如果您从源代码安装 IPython 会很容易。如果您查看文件 IPython/terminal/shortcuts.py,您会发现它包含各种逻辑;特别是你会发现:

# Ctrl+J == Enter, seemingly
registry.add_binding(Keys.ControlJ,
                     filter=(HasFocus(DEFAULT_BUFFER)
                             & ~HasSelection()
                             & insert_mode
                    ))(newline_or_execute_outer(shell))

这会将 CtrlJ (enter) 绑定到负责添加新行的函数 newline_or_execute_outer;它稍后在文件中定义。特别是如果您在代码块末尾按两次 Enter,它应该执行该块而无需使用任何其他快捷方式。

剥离添加新行的逻辑:

def execute_outer(shell):
    def execute(event):
        """When the user presses return, insert a newline or execute the code."""
        b = event.current_buffer

        # some logic to also dismiss the completer

        b.accept_action.validate_and_handle(event.cli, b)
    return execute

将其绑定在第 20 行附近:

registry.add_binding(Keys.ControlE,
                     filter=(HasFocus(DEFAULT_BUFFER)
                             & ~HasSelection()
                             & insert_mode
                    ))(execute_outer(shell))

并享受。如果您对文档不满意,我们欢迎提供帮助;例如,从那里提取答案的要点并将它们贡献回来。当我们在发行说明中说时,阅读严厉的评论有点伤人:

New terminal interface

The overhaul of the terminal interface will probably cause a range of minor
issues for existing users. This is inevitable for such a significant
change, and we’ve done our best to minimise these issues. Some changes that
we’re aware of, with suggestions on how to handle them:

IPython no longer uses readline configuration (~/.inputrc). We hope that
the functionality you want (e.g. vi input mode) will be available by
configuring IPython directly (see Terminal IPython options). If something’s
missing, please file an issue.

...

帮助实际改进 IPython 以使用操作名称进行可配置的键绑定也非常感谢,这样您就可以回答自己的问题了。