Amn*_*man 5 python gnu readline python-2.7
你好编码器和勇敢的GNU-readline用户,
几个月前我开始使用Python的(2.7.1)readline模块来编写我编写的shell类应用程序.该应用程序与文件和文件系统无关 - 它是专有管理软件的定制解决方案.
昨天我发现特定文本会导致意外的自动完成行为,并且在文档中找不到解决此问题的方法.我在这里拼命地请求你的帮助.我将从一个示例开始,然后使用一个代码片段来重现不需要的行为.
提供自动完成的值是:
aaa0 aaa1 aaa2 bbb_0 bbb_1 bbb_2
ccc-0 ccc-1 ccc-2 ddd?0 ddd?1 ddd?2
Run Code Online (Sandbox Code Playgroud)
...然后意外行为如下(每个动作后跟结果输出,管道符号代表光标):
Input> b|Input> bbb_|bbb_0 bbb_1 bbb_2
Input> bbb_|bbb_0 bbb_1 bbb_2
Input> bbb_0 |Input> cInput> ccc-aaa0 aaa1 aaa2 bbb_0 bbb_1 bbb_2 ccc-0 ccc-1 ccc-2 ddd?0 ddd?1 ddd?2
Input> ccc-|aaa0 aaa1 aaa2 bbb_0 bbb_1 bbb_2 ccc-0 ccc-1 ccc-2 ddd?0 ddd?1 ddd?2
Input> ccc-0|在实践中,步骤7中发生的是误解.Readline"错误"字符分隔符的' - '字符(对于问号'?'字符也是如此,如果你尝试自动完成'ddd?';其他常见字分隔符是,例如:空格,制表符,'=').因此,由于当前行缓冲区以字分隔符结束,那么是时候换个新单词吧?因此,在步骤7(我们所在的位置),按TAB显示所有值.
在步骤8中,一旦该行看起来像" Input> ccc-0|",按下TAB就没有效果,因为短划线是一个字分隔符,将该行分成两个单词:'ccc'和'0'.所以,要完成的单词是'0',但是唉,没有一个可能的值以'0'开头,所以没有效果.
现在,遗憾的是,这里没有对错.例如,在我的应用程序中,等号'='实际上是一个单词分隔符,但短划线' - '不是.我想这必须是配置问题,但我还没有找到一种方法来配置哪些字符分隔单词.这就是我需要帮助的地方.
我是一个忠诚的人,所以这是我承诺的代码片段:
import readline
values = ['aaa0', 'aaa1', 'aaa2', 'bbb_0', 'bbb_1', 'bbb_2',
'ccc-0', 'ccc-1', 'ccc-2', 'ddd?0', 'ddd?1', 'ddd?2']
def complete(text, state):
matches = [v for v in values if v.startswith(text)]
if len(matches) == 1 and matches[0] == text:
# Add space if the current text is the same as the only match
return "{} ".format(matches[0]) if state == 0 else None
if state >= len(matches):
return None
return matches[state]
readline.set_completer(complete)
for line in ("tab: complete", "set show-all-if-unmodified on"):
readline.parse_and_bind(line)
raw_input("Input> ")
Run Code Online (Sandbox Code Playgroud)
男孩和女孩,请 - 帮助!我保证会非常感激,甚至会回报.:)
非常感谢Amnon G.
只盯着的输出dir(readline),功能get_completer_delims()和set_completer_delims()看起来像他们可能是有用的.实际上,该readline模块的文档包括:
set_completer_delims(...)
set_completer_delims(string) -> None
set the readline word delimiters for tab-completion
Run Code Online (Sandbox Code Playgroud)
我认为这完全描述了你想要的东西.这是在Python 2.6.7上; 如果您之前正在运行某些功能,则可能无法使用此功能.