2

我正在尝试为我编写的实用程序脚本设置 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 的简化测试用例,它仍然表现出相同的行为。奇怪的是,丹尼斯的案例也适用于我(例如,当用 words="one two three" 代替时)。

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

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

1 回答 1

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

这是在具有 bash-3.2.48/bash-4.0.33 和 php-5.2.6-3ubuntu4 的机器(Ubuntu)上。在另一台带有 bash-3.2.39 和 php-5.2.6-1+lenny9 的机器(Debian)上,完成和退格没问题。

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

不知道怎么回事,php和readline冲突?也许你可以试试 bug-bash 邮件列表?

于 2010-09-13T21:26:29.893 回答