在较旧的(我相信是 5.0 之前的)IPython 版本中,如果我正在处理一行/块,并且突然发现我需要调查其他内容来完成它,我的方法是按 Ctrl-C,这会留下不完整的行/block 在屏幕上,但未执行,并给了我一个新的提示。也就是说,我会看到类似:
In [1]: def foo():
...: stuff^C # <-- Just realized I needed to check something on stuff usage
In [2]: # <-- cursor goes to new line, but old stuff still on terminal
在较新的 IPython(似乎已从“CLI 支持框架”切换readline
到)中,Ctrl-C 的行为有所不同;prompt_toolkit
现在,它没有给我一个换行符,而是重置当前行,丢弃我输入的所有内容并将光标返回到行首。
# Before:
In [1]: def foo():
...: stuff
# After Ctrl-C:
In [1]: # Hey, where'd everything go?
这非常烦人,因为在我完成任何导致需要新提示的副任务之后,我再也看不到或复制/粘贴我正在处理的代码以恢复我的工作。
我的问题是:有没有办法恢复旧的 IPython 行为,其中 Ctrl-C 执行以下操作:
- 不执行到目前为止键入的行/块
- 留在屏幕上
- 能够选择(在配置时很好)是否添加到历史记录(这将是个人喜好;您想要历史记录中的半成品,还是只是在终端上进行复制/粘贴?)
- 在到目前为止键入的文本下方为我提供了一个全新的提示
我到处搜索,发现最多的是一个错误报告评论,其中提到了这种新行为“......从早期版本的 IPython 的变化,但它是故意的。”
我找不到任何关于修改 IPython 或文档中的行为的prompt_toolkit
文档;我发现了很多这些处理程序的安装位置,但是尝试通过猴子修补来改变当前行为的尝试失败了(坦率地说,猴子修补未记录的代码意味着我冒着破坏每次升级的风险,所以我想找到对此进行了一些半支持的修复;如果失败了,hacky Monkey-patching 是可以接受的)。