-
、+
等字符在 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 之间的 readline 解析存在差异,即使两者都使用 GNU readline:
Mac 操作系统:
>>> 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.'
谢谢!
最佳答案
在 linux 上,readline
模块将 -
视为制表符完成的定界符。也就是说,在遇到 -
之后,将尝试重新完成。
您的问题的解决方案是从 readline 用作分隔符的字符集中删除 -
。
例如。
old_delims = readline.get_completer_delims()
readline.set_completer_delims(old_delims.replace('-', ''))
关于Linux 上的 Python cmd 不会自动完成特殊字符或符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27288340/