2010-09-13 61 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郵件列表?