bash完成阻止退格

时间:2010-09-13 14:11:59

标签: bash tab-completion

我正在尝试为我编写的实用程序脚本设置bash完成,所以我将以下脚本添加到/etc/bash_completion.d中:

_mcd()
{
    local cur words
    COMPREPLY=()

    cur="${COMP_WORDS[COMP_CWORD]}"
    words=`mcd-completion-words`
    COMPREPLY=( $(compgen -W "${words}" -- "$cur") )
    return 0
}
complete -F _mcd mcd

mcd-completion-words脚本以编程方式查找命令的可用运算符。当我重新启动bash(或源脚本)时,我可以成功完成选项卡,但是如果我这样做,我就不能再通过已完成的角色退格。

另外,如果我尝试列出所有选项(例如我尝试选项卡完成没有任何单词),bash会在命令中添加一个选项卡,我也无法退格。

如何使bash模仿正常的文件完成行为?任何帮助表示赞赏。谢谢!


这是一个简化的mcd-completion-words测试用例,它仍然表现出相同的行为。奇怪的是,丹尼斯的案例也适用于我(例如,当用词=“一二三”代替时)。

#!/usr/bin/env php
<?php

print "one two three four five six seven eight nine";

1 个答案:

答案 0 :(得分:1)

这是一个简化的测试用例;即使是空的`php'命令也会导致错误的完成行为:

$ _mcd() { php -r ""; COMPREPLY=( one ); }
$ complete -F _mcd mcd
$ mcd <TAB>            # Becomes 'mcd one' all right
$ mcd one <BACKSPACE>  # ERROR: doesn't work

这是在机器(Ubuntu)上同时使用bash-3.2.48 / bash-4.0.33&amp; PHP-5.2.6-3ubuntu4。在另一台机器(Debian)上使用bash-3.2.39&amp; php-5.2.6-1 + lenny9,完成&amp;退格没事。

使用perl -e ""代替php -r ""也可以。

不知道发生了什么,php与readline冲突?也许你可以试试bug-bash邮件列表?