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