Linux上的Python命令行无法自动完成特殊字符或符号。

5

-+等字符在Python的基于readline的cmd模块中并不像字母数字ASCII字符被解析。这似乎只是Linux特有的问题,因为在Mac OS上它似乎按预期工作。

示例代码

import cmd

class Test(cmd.Cmd):
    def do_abc(self, line):
        print line 
    def complete_abc(self, text, line, begidx, endidx):
        return [i for i in ['-xxx', '-yyy', '-zzz'] if i.startswith(text)]

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    if 'libedit' in readline.__doc__:
        readline.parse_and_bind("bind ^I rl_complete")
    else:
        readline.parse_and_bind("tab: complete")

Test().cmdloop()

在Mac OS上的预期行为

(Cmd) abc <TAB>
abc  
(Cmd) abc -<TAB>
-xxx  -yyy  -zzz  
(Cmd) abc -x<TAB>
(Cmd) abc -xxx

在Linux上出现不正确的行为

(Cmd) abc <TAB>
abc  
(Cmd) abc -x<TAB>
 <Nothing>
(Cmd) abc -<TAB> 
(Cmd) abc --<TAB>
(Cmd) abc ---<TAB>
(Cmd) abc ----

我尝试将 - 添加到 cmd.Cmd.identchars 中,但没有帮助。

cmd.Cmd.identchars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-'

为什么Mac OS和Linux都使用GNU readline,但是在readline解析方面存在差异:
Mac OS:
>>> readline.__doc__
'Importing this module enables command line editing using GNU readline.'

Linux:

>>> readline.__doc__
'Importing this module enables command line editing using GNU readline.'

谢谢!


顺便提一下,identchars 只是用来找出命令结束和参数开始的位置,例如:cmd arg1 == cmd?arg1,因此添加到 identchars 中并没有帮助,事实上这样做是危险的,因为它会破坏解析。就像 @Dunes 所说,你必须调整分隔符。 - user881300
1个回答

6
在Linux上,readline模块将-作为制表符补全的分隔符。也就是说,在遇到-后,会尝试进行一个新的补全。
解决方案是从readline使用的分隔符集合中删除-
例如:
old_delims = readline.get_completer_delims()
readline.set_completer_delims(old_delims.replace('-', ''))

有趣!成功了。我在Mac OS和Linux上都检查了readline.get_completer_delims(),它们是一样的。但我没有想到分隔符是问题所在,你很棒,非常感谢! - rajivRaja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接