我正在尝试为我编写的实用程序脚本设置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核算单词的简化测试柜,仍然表现出相同的行为。奇怪的是,丹尼斯的案例也对我有用(例如,用单词代替=“一两个三”)。

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

print "one two three four five six seven eight nine";
有帮助吗?

解决方案

这是一个减少的测试案例;即使是空的“ 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和PHP-5.2.6-3ubuntu4。在另一台机器(Debian)上,带有BASH-3.2.39和PHP-5.2.6-1+Lenny9,完成和backspace可以很好。

使用 perl -e "" 代替 php -r "" 也没事。

不知道发生了什么,PHP与Readline冲突吗?也许您可以尝试使用Bug-Bash邮件列表?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top