【问题标题】:Python cmd on linux does not autocomplete special characters or symbolsLinux 上的 Python cmd 不会自动完成特殊字符或符号
【发布时间】:2015-02-01 23:55:42
【问题描述】:

-+ 等字符与 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.'

谢谢!

【问题讨论】:

  • btw identchars 仅用于找出命令结束和 args 开始的点,例如:cmd arg1 == cmd?arg1 所以添加到 identchars 将无济于事,事实上它很危险像@Dunes 所说的那样打破解析,你必须调整分隔符。

标签: python linux readline tab-completion python-cmd


【解决方案1】:

在 linux 上,readline 模块将- 视为制表符完成的分隔符。也就是说,在遇到 - 之后,将尝试重新完成。

解决您的问题的方法是从 readline 用作分隔符的字符集中删除 -

例如。

old_delims = readline.get_completer_delims()
readline.set_completer_delims(old_delims.replace('-', ''))

【讨论】:

  • 有趣!做到了。我确实在 mac os 和 linux 上检查了 readline.get_completer_delims(),它们是一样的。但我没有想到分隔符是问题所在,很好,非常感谢!
猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2011-09-23
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多