2010-09-13 60 views
2

我试图建立的bash完成了实用剧本我写的,所以我加了下面的脚本/etc/bash_completion.d:bash补防止退格

_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(或源代码脚本)时,我可以成功完成标签,但如果我这样做了,我不能再退格一个完整的字符。另外,如果我尝试列出所有选项(例如,我试图将选项卡填充到w /没有适当的词),bash会向该命令添加一个选项卡,我也不能退格。

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


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

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

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

当我做'词=“一些测试词”'它似乎工作。请发布'mcd-completion-words'的内容。问题可能在那里。 – 2010-09-13 18:14:14

+0

我在Ubuntu 11.10上遇到了完全相同的问题。 – scribu 2011-10-04 00:58:53

回答

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 & 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邮件列表?