天天看点

python 分隔符tab_Python readline自动完成(tab):为什么破折号和问号被视为单词分隔符?...

你好编码员和勇敢的GNU-readline用户,

几个月前,我开始使用

Python的(2.7.1)readline模块来编写我编写的类似shell的应用程序.该应用程序与文件和文件系统无关 – 它是专有管理软件的定制解决方案.

昨天我发现特定文本会导致意外的自动完成行为,并且在documentation中找不到解决此问题的方法.我在这里拼命地寻求你的帮助.我将从一个示例开始,然后使用一个代码片段来重现不需要的行为.

提供自动完成的值是:

aaa0 aaa1 aaa2 bbb_0 bbb_1 bbb_2

ccc-0 ccc-1 ccc-2 ddd?0 ddd?1 ddd?2

…然后意外行为如下(每个动作后跟结果输出,管道符号代表光标):

>输入’b’.

输入> C |

>按TAB键(在我的配置中绑定到自动完成操作).

输入> bbb_ |

>再次按TAB键.您的文字将保持不变,但您会收到以下提示:

bbb_0 bbb_1 bbb_2

输入> bbb_ |

>键入“0”并按Tab键.

bbb_0 bbb_1 bbb_2

输入> bbb_0 |

注意’0’字符和光标之间的空格(下面的代码片段将解释这一点).

到目前为止一直这么好,并尝试使用’a’将导致类似的输出,只有没有下划线(aaa0,aaa1,aaa2).

>重新开始并输入’c’.

输入> C

>按TAB键.

输入> CCC-

>再次按TAB键.

aaa0 aaa1 aaa2 bbb_0 bbb_1 bbb_2 ccc-0 ccc-1 ccc-2 ddd?0 ddd?1 ddd?2

输入> CCC- |

这是我问题的前半部分.显示所有值,而不是仅显示以“ccc-”开头的值.

>键入“0”,然后按Tab键.

aaa0 aaa1 aaa2 bbb_0 bbb_1 bbb_2 ccc-0 ccc-1 ccc-2 ddd?0 ddd?1 ddd?2

输入> CCC-0 |

这是我问题的后半部分,你看,’0’字符和光标之间没有空格(同样,下面的代码片段将解释为什么应该有空格).实际上,按TAB既不会更改文本也不会显示提示,并且进一步的TAB按键表现相同.

在实践中,步骤7中发生的是误解. Readline“错误”字符分隔符的’ – ‘字符(对于问号’?’字符也是如此,如果你尝试自动完成’ddd?’;其他常见字分隔符是,例如:空格,制表符,’=’).因此,由于当前行缓冲区以字分隔符结束,那么是时候换个新单词吧?因此,在步骤7(我们所在的位置),按TAB显示所有值.

在步骤8中,一旦该行看起来像“输入> 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> ")

男孩和女孩,请 – 帮助!我保证会非常感激,甚至会回报. 🙂

首先十分感谢,

Amnon G.