从ipython中的历史记录中完成命令

从ipython中的历史记录中完成命令,ipython,Ipython,出于我无法控制的原因,我一直在使用python 2.6.6和IPython 0.10.2。我也通常使用tcshshell,并且已经习惯于使用完成历史记录中的命令(即按下ALT键和p)。但是,这在IPython中不起作用。我知道我可以按,然后开始键入命令,但不可避免的是,我启动一个命令,按,得到一个冒号表示某种奇怪的状态,然后退出该状态,删除我的命令,按,然后搜索我的命令。越来越让人恼火了。有没有办法依靠历史记录使完成我已经启动的命令 哎哟,这是IPython、Python(和pip)的旧版本。坏

出于我无法控制的原因,我一直在使用python 2.6.6和IPython 0.10.2。我也通常使用
tcsh
shell,并且已经习惯于使用
完成历史记录中的命令(即按下
ALT
键和
p
)。但是,这在IPython中不起作用。我知道我可以按
,然后开始键入命令,但不可避免的是,我启动一个命令,按
,得到一个冒号表示某种奇怪的状态,然后退出该状态,删除我的命令,按
,然后搜索我的命令。越来越让人恼火了。有没有办法依靠历史记录使
完成我已经启动的命令

哎哟,这是IPython、Python(和pip)的旧版本。坏消息是我没有太多的经验与这样一个老版本的IPython,好的是新的;那时候要简单得多

大多数快捷方式和功能都是使用readline和提供的。这意味着您最有可能尝试配置的是readline本身,而不仅仅是IPython;所以你可以在IPython之外找到更多的信息

秘密是在
parse_and_bind
的源代码中
grep
,然后您会发现,这导致我在第99行左右将
~/.ipython/ipy_user_conf.py
更改为这样(在
main()
函数中都缩进了额外的4个空格):

命令的重复让我觉得
\C
\M
[e
的意思可能取决于系统。我打赌
\C
是控制,而
\M
是元(Alt,Opt),但至少有一行对我起了作用(现在
选项卡也允许完成)。另请参见
man readline
,了解您可以绑定到的命令列表,并享受!希望您能在某个时候升级到Python 3和IPython 6

[编辑]


请参阅此答案下的Eric Carlsen第二条评论,了解其解决方法。

感谢您的提示。这让我很接近,但我不确定如何克服上一个问题。我尝试修改配置文件,并将搜索更改为
“\m-p”:history search backward
但这不起作用。我甚至打印了它以确保它被调用。但是,我能够将它更改为另一个未使用的绑定。我猜Alt-p不知何故被捕获或在其他地方使用,我无法覆盖它。目前,我发现修改
tcsh
使用C更容易-p作为一个历史搜索,所以我将开始在任何地方使用它。我终于让它工作了,提示就在您的代码部分的上面。结果表明,
\C-
是您控制所需要的,但是对于Alt-您只需要
\e
ipython
尊重您的
。inputrc
读取行绑定,so我将以下行添加到
.inputrc
“\ep”:历史向后搜索
“\en”:历史向前搜索
import readline
readline.parse_and_bind('set completion-query-items 1000')
readline.parse_and_bind('set page-completions no')
rlopts = """\
tab: complete
"\C-l": possible-completions
set show-all-if-ambiguous on
"\C-o": tab-insert
"\M-i": "    "
"\M-o": "\d\d\d\d"
"\M-I": "\d\d\d\d"
"\C-r": reverse-search-history
"\C-s": forward-search-history
"\C-p": history-search-backward
"\C-n": history-search-forward
"\e[A": history-search-backward
"\e[B": history-search-forward
"\C-k": kill-line
"\C-u": unix-line-discard"""

for cmd in rlopts.split('\n'):
    readline.parse_and_bind(cmd)