在ipython中完成历史记录

时间:2017-11-30 17:50:31

标签: ipython

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

1 个答案:

答案 0 :(得分:1)

哎呀,这是IPython,Python(和pip)的旧版本。坏消息是我对这样一个旧版本的IPython没有多少经验,好的新东西是;那个时候比较简单。

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

秘密在grep的源代码中parse_and_bind,然后您会找到the following example configuration,导致我将~/.ipython/ipy_user_conf.py更改为如此在第99行附近(所有缩进的额外4个空格都在main()函数中):

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)

重复命令让我认为\C\M[e的含义可能与系统有关。我打赌\C是控制,而\M是Meta(Alt,Opt),但这些线中至少有一条为我做了伎俩(现在tab也允许完成)。另请参阅man readline以获取可绑定到的内容的命令列表,并享受!希望你能在某些时候升级到Python 3和IPython 6。

[编辑]

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