IPython 5.0和控制台

时间:2016-07-29 13:07:08

标签: python ipython keyboard-shortcuts xterm

新版本的IPython不再依赖于readline,而是使用纯Python库prompt-toolkit,解决Apple和Windows上的维护问题。系统

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

我说,这是一个问题,因为我选择的终端模拟器是XTerm,并且在许多Linux发行版中,快捷方式 alt + ret 未传递给应用程序,但它直接由运行IPython的XTerm使用,切换所述终端的屏幕丰满度(@ThomasDickey,xterm' s mantainer和共同作者指出,默认情况下,xterm不会&# 39;即使在解除全屏动作的情况下,也要小心在Enter上发送修改符位。

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

我已经找到了适用于新版5.0版本的以前版本的基于readline的IPython版本的说明(类型)。

我需要的是指示,让我在IPython的用户文档中找到我可以绑定的可能操作的名称,与操作绑定的快捷方式的名称以及要遵循的过程配置新的密钥绑定。

如果没有这种类型的规范答案,我可能对完成此特定键绑定的配方感到满意,条件是配方仍可在IPython 6.0中使用

3 个答案:

答案 0 :(得分:4)

您可以更改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("\033[27;3;13~")

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用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(输入)绑定到负责添加新行的函数newline_or_execute_outer;它稍后在文件中定义。特别是如果你在代码块的末尾按两次输入,它应该执行块而不需要使用任何其他快捷方式。

剥离添加新行的逻辑:

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以使用动作名称进行可配置的键绑定也很受欢迎,因此您将能够回答您自己的问题。