像-
,+
等字符在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.'
谢谢!
cmd arg1
==cmd?arg1
,因此添加到 identchars 中并没有帮助,事实上这样做是危险的,因为它会破坏解析。就像 @Dunes 所说,你必须调整分隔符。 - user881300