我可以在 ipython shell 中重做/撤消吗?

iMo*_*om0 3 shell python ipython

bpython 中的一项功能称为倒带。

是否有一些类似的键绑定?

小智 5

简短回答:不,IPython 没有此功能。

然而,根据我对 bpython 文档的理解,他们的倒带实际上并没有倒退,而是重新开始并重播到会话早期的某个点。如果确实如此,那么在 IPython 中,您可以通过重置和重新运行历史记录来做一些可能类似的事情:

def 倒带(ip, s=''):
    """尝试将 IPython 重置为较早的状态

    通过重置 IPython 并重放
    历史记录到(但不包括)指定的索引。
    """
    如果:
        stop = min(int(s), ip.execution_count)
    别的:
        # 默认备份 1
        停止 = ip.execution_count-1
    # 获取历史
    hist = list(ip.history_manager.get_range(stop=stop))
    # 重置 IPython
    ip.reset()
    ip.execution_count=0
    # 回放历史
    对于 _,i,cell in hist:
        ip.run_cell(单元格,store_history=True)

# 将此函数公开为 %rewind
get_ipython().define_magic('rewind', rewind)

然后在稍后调用%rewind 6,您应该让 IPython 回到输入 #6 之前的状态。这个实现远非完美,因为我只是把它扔在一起(例如,它不会抑制重播单元的回溯或输出),但它应该是一个开始。