我正在使用 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] 这正确完成了单词“test”。
输入: 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”。
有没有解决这个问题的正确方法?