我最近在python插入器https://docs.python.org/2.7/tutorial/interactive.html中发现了自动完成功能。 对于加快我在交互式解释器中进行的测试而言,这真是太棒了。完成两件事既有用,又有用。
如果仅将C+f: complete
放入.inputrc中(或使用不带rlcompleter的readline),则当我按Ctl + f时,将在启动解释器的目录中获得文件的完成。当我加载模块readline
和rlcompleter
并将readline.parse_and_bind('C-n: complete')
添加到.pystartup文件时,它将Ctl + n和Ctl + f转换为自动完成的python对象。
我想两者都做,但是不知道如何避免rlcompleter
覆盖标准的完成。是否有一种方法可以启动两个readline
实例,一个实例可以使用,另一个实例不使用rlcompleter
?
这是我的.pystartup文件
import atexit
import os
import readline
import rlcompleter #removing this does file completion.
readline.parse_and_bind('C-n: complete')
historyPath = os.path.expanduser("~/.pyhistory")
def save_history(historyPath=historyPath):
import readline
readline.write_history_file(historyPath)
if os.path.exists(historyPath):
readline.read_history_file(historyPath)
atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath
答案 0 :(得分:0)
工作原理:
导入rlcompleter
时,它会以rlcompleter.Completer().complete
的完成者readline
的身份安装readline.set_completer(Completer().complete)
。
在没有rlcompleter
的情况下,completer
是None
,因此默认情况下,底层GNU readline lib使用rl_filename_completion_function
。
绑定键和完成逻辑是由GNU readline lib实现的,因此在Python中与start up two instances of readline
无关...
我找不到在Python中调用默认rl_filename_completion_function
的方法(在C扩展中是可能的),所以我想您必须在Python中复制rl_filename_completion_function
的逻辑。
这意味着您应该继承Completer
并构建自定义complete
。但是您仍然不能将这两个逻辑拆分为C-n
和C-f
:(