python "up-button" 命令完成,matlab/julia 样式

python "up-button" command completion, matlab/julia style

我最近从 Matlab 转向了 Numpy,我很喜欢它。但是,我真正喜欢 Matlab 的一个优点是能够完成命令。有两种方法可以做到这一点:

1) 选项卡完成。如果我有一个叫做 foobar(...) 的函数,我可以做 'fo' 它会自动填充 'foobar'

2) "up-button" 完成(我不知道该怎么称呼它)。如果我最近输入了一个命令,例如 'x = linspace(0, 1, 100); A = eye(50);' 然后我希望快速输入相同的命令,以便我可以重新评估它或稍微更改它,然后我只需输入 'x =' 然后按向上键,它将循环显示您之前输入的所有以 [ 开头的命令=32=]。这是 Matlab 中一个非常棒的功能(如果你听说过 Julia,它做得更好,允许你自动重新输入 整个代码块,比如当你正在交互式提示中定义函数)

普通 python 交互 shell 中似乎不存在这两个功能。我相信之前已经讨论过选项卡自动完成功能,并且可能可以使用 .pythonrc 启动脚本和一些模块来启用;但是我还没有找到关于 "up-button" 完成的任何信息。 Python 是否具有基本的向上按钮功能,可以简单地滚动浏览所有以前的命令,但是您不能在命令的开头键入并缩小范围滚动浏览的命令,这有很大的不同。

有谁知道在普通 python 交互式 shell 上获得此功能的方法,而不需要像 IPython 需要单独安装的笔记本这样的花哨东西?

使用 iPython 或其他一些 Python shell。有很多。您甚至可以编写自己的程序来做任何您想做的事情。

  1. tab 完成。如果我有一个叫做 foobar(...) 的函数,我可以做 'fo' 它会自动填充 'foobar'

真的吗?您使用的 Python 是哪个版本?您是如何获得它的?对于 python 2.7 和 python 3.4,windows 和 Linux 都适用于我的常规 python shell。听起来您的 Python 版本可能没有使用 readline 支持构建,我认为这是此类事情所必需的。

这是我试过的:

>>> sup

tab之后变成:

>>> super(
  1. "up-button" 完成(我不知道该怎么称呼它)。如果我最近输入了一个命令,例如 'x = linspace(0, 1, 100); A = eye(50);',然后我希望快速输入相同的命令,以便我可以重新评估它或稍微更改它,那么我只需输入 'x =',然后按向上和它将循环显示您之前键入的所有以 'x ='.
  2. 开头的命令

它被称为 "History search",它在 windows 和 Linux 中的默认 Python shell 中也对我有效。同样,我认为这需要 readline

>>> a = 'test'
>>> a

然后我按 up,我得到:

>>> a = 'test'

您也可以按 Ctrl+r,然后开始输入。这将在历史记录中搜索包含您键入的内容的最后一个命令。所以,例如:

>>> a = 'test'
>>> b = 5
>>> c = a

然后ctrl+r:

>>>
forward-i-search1`b: b = 5

然后点击 Enter 执行该命令。

>>>
>>> b = 5
>>>

如果匹配项不是您想要的,您可以键入更多内容,或反复按 Ctrl+r 以循环匹配项。

编辑:

看起来这是 Python 的内置 Mac Os X 版本的一个已知问题。由于 readline 是 GPL,因此它不附带 readline。相反,它包括不完全兼容的 libedit。有关如何让它在 Mac Os X here

上工作的说明

Tab 补全不是 python 2.x 解释器的标准功能。一个特定的发行版(打算 Linux 发行版)可能带有启用制表符完成的初始化文件。另一方面,python 3.x 默认启用自动完成功能。

要在 2.x 中启用制表符补全,您需要指示解释器关于 loading some startup code, using an environment variable

export PYTHONSTARTUP=$HOME/.whatever

您要放入启动文件的代码各不相同,但用于启用制表符补全 the docs have

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

最终来到你的 ast 问题,你命名为 “向上按钮”命令完成,matlab/julia 风格 IPython 有它,我'我不知道实现它的模块,即使在我看来我一个月前在 comp.lang.python 上读到过关于这样一个野兽的东西。

在你的问题中你引用了IPython的notebook...可能需要提醒的是你不需要notebook界面来使用IPython,它可以用来即使在文本控制台中也能发挥全部潜力。