python完成,文件与对象

时间:2018-08-23 16:48:14

标签: python readline complete

我最近在python插入器https://docs.python.org/2.7/tutorial/interactive.html中发现了自动完成功能。 对于加快我在交互式解释器中进行的测试而言,这真是太棒了。完成两件事既有用,又有用。

如果仅将C+f: complete放入.inputrc中(或使用不带rlcompleter的readline),则当我按Ctl + f时,将在启动解释器的目录中获得文件的完成。当我加载模块readlinerlcompleter并将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

1 个答案:

答案 0 :(得分:0)

工作原理:

导入rlcompleter时,它会以rlcompleter.Completer().complete的完成者readline的身份安装readline.set_completer(Completer().complete)

在没有rlcompleter的情况下,completerNone,因此默认情况下,底层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-nC-f:(