使用'$'完成Python readline选项卡

时间:2012-09-26 18:29:45

标签: python console readline

我正在使用Cmd.py创建一个自定义交互式控制台,并使用readline来完成标签。这是在Mac上使用python 2.7.1进行测试的。

我使用complete_ [cmd_name]定义完成候选项,以便cmd.py可以使用它来获取可能的完成列表。正在完成的参数是一个字符串。我的候选人完成是一个字符串列表。一切都在正常情况下起作用。问题是当参数以'$'开头时。 Readline显然正在剥离领先的'$'字符,当我构建候选列表时,它正在弄乱我的比较。

例如:

completion_list = ['test', 'another_test', '$t_problem_case']

输入:cmd te [tab] 这正确地完成了'测试'这个词。

输入:cmd $ t_ [tab] 没有完成

输入:cmd $ te [tab] 错误地完成$ test

好的,所以问题起初看起来很明显。我认为readline使用'$'作为分隔符。这可以通过使用:

轻松解决

readline.set_completer_delims(readline.get_completer_delims().replace("$", ""))

只有这不起作用。同样的事情仍然发生。

完成函数接受参数'text'和'line',其中text是完成的参数(缺少'$'的参数),line是完整的行。尝试超越readline我检查参数是否实际上在行中有$,如果是,我将其附加到我正在检查的参数,以便我可以正确地过滤候选。这几乎可行。

输入:$ t [tab] 正确完成字符串...几乎。因为readline忽略了我的'$'所以它不会在替换上删除这个字符。结果实际上是“$$ t_problem_case”。

作为最后的努力,我修改了cmd.py默认完整函数,以返回与前面的'$'匹配的匹配。这种方式readline实际上将替换为't_problem_case',一切看起来都是正确的。这是朝着正确方向迈出的一步,但问题是标签完成建议现在不显示'$'。所以在建议'$ t_problem_case'会显示为't_problem_case'。

有没有正确的方法来解决这个问题?

0 个答案:

没有答案