IPython 5.0和控制台中的密钥绑定

IPython 5.0和控制台中的密钥绑定,python,ipython,keyboard-shortcuts,xterm,Python,Ipython,Keyboard Shortcuts,Xterm,IPython的新版本不再依赖于readline,而是使用纯Python库prompt工具包,解决了苹果和Windows系统的维护问题 一个新功能是编辑多行代码块的能力,使用光标键在代码块中自由移动-有了这个功能,至少对我来说,出现了一个问题:因为ret会在代码中插入新行,要将整个块传递给解释器,必须使用快捷键alt+ret,或者可能使用不太方便的键序列esc,后跟ret 我说,这是一个问题,因为我选择的终端仿真器是XTerm,在许多Linux发行版上,快捷方式alt+ret不会传递给应用程序,

IPython的新版本不再依赖于
readline
,而是使用纯Python库
prompt工具包
,解决了苹果和Windows系统的维护问题

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

我说,这是一个问题,因为我选择的终端仿真器是XTerm,在许多Linux发行版上,快捷方式alt+ret不会传递给应用程序,但运行IPython的XTerm直接使用它来切换所述终端的屏幕完整性(@ThomasDickey,xterm的负责人和合著者指出,默认情况下,xterm不关心向应用程序发送Enter上的修饰符位,即使在取消绑定全屏操作时也是如此)

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

我找到了IPython以前版本的说明(某种程度上),即基于
的readline
,这些说明不适用于新的5.0版本

我需要的是一些说明,这些说明引导我在IPython的用户文档中找到我可以绑定的可能操作的名称、与这些操作绑定的快捷方式的名称以及配置新密钥绑定所遵循的过程


如果没有这种类型的规范答案,我可能会很乐意使用一个配方来完成这个特定的键绑定,条件是该配方在IPython 6.0中仍然有效。ctrl+j或ctrl+m键盘快捷键正在验证输入。

您可以更改xterm的配置

xterm是可配置的(并有文档记录)。在xterm手册中,该部分显示了此密钥的默认绑定:

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

在使用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\u或\u execute\u 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,使其具有带有操作名称的可配置键绑定,这也是值得赞赏的,这样您就可以回答您自己的问题。

我基本上比您高,因为您告诉我,我可以点击
esc
退出编辑模式来执行命令!:)在这个问题上得了30分(我迄今为止的最好成绩)我觉得有必要在这个问题上增加一点声誉+1因为我学会了
alt+return
技巧!谢谢你的回答。ctrl+j或ctrl+m快捷键与RET afaict完全相同。编辑多行代码块时,所有这些快捷键都会在当前光标位置插入一个换行符,而alt+RET或顺序Esc-RET强制执行代码块,而不考虑光标的位置。如果您认为问题的这一方面不够清楚,我可以尝试编辑我的问题。我正在使用Windows,在我的控制台中Esc-RET和ctrl+j或ctrl+m执行相同的操作:执行代码块。-,alt-RET不执行任何操作,而RET正在插入新行。您有其他经验吗?您使用的是什么操作系统(Windows、Linux、Mac OS)?Thomas,您的回答很有用,谢谢。如果IPython的文档记录为xterm的一半,我将非常高兴…1000也谢谢您的xterm。再见
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.

...