我正在使用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'。
有没有正确的方法来解决这个问题?