2010-02-26 42 views
9

我正在嘗試爲Java程序創建一個Bash完成腳本。該程序的一個典型調用可能是這樣的:將空格添加到某些Bash自動填充選項的末尾,但不添加到其他人?

$ javaProgram -Dproperty=foo option1 option2 

我的腳本的一部分將表明,可用於本程序(即,當用戶鍵入-D,該腳本會提示各種Java性能,說,property=,允許用戶然後鍵入值)。

我想完成不等於等號後面插入一個空格。但是,當用戶輸入程序的各種選項時(上例中的option1option2),我希望腳本完成該操作,並在完成時插入一個空格。

我是新來Bash完成腳本,但我知道選項complete shell內置。但它似乎不適用於compgen內置,這看起來像我想要的。我試過使用nospace,然後在相應的選項末尾顯式地包含空格,但它們似乎沒有完成。

有誰知道如何在一些選項的末尾獲得空格,但在其他人的末尾沒有空格?

回答

1

到目前爲止,查看您的代碼會很有幫助。

但是,如果有,請查看scpscp的完成代碼。它在本地文件名之後放置空格,但不在主機名之後。

1

丹尼斯是正確的金錢,在你complete -F _your_func引用功能,你想這樣的事情(從/ etc/bash_completion拍攝):

# escape spaces; remove executables, aliases, pipes and sockets; 
    # add space at end of file names 
    COMPREPLY=($(ssh -o 'Batchmode yes' $userhost \ 
       command ls -aF1d "$path*" 2>/dev/null | \ 
       sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \ 
       -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g')) 
    return 0 

這個特殊的例子使用-o nospace選項,但增加了手動空間。這是最後的-e ('s/[^\/]$/& /g'),增加了空間。在這種情況下,只有當最後一個參數不以斜線結尾時(這將是一個目錄並且有文件自動完成),它纔會添加。

關鍵的區別似乎是在空格前添加一個&符號。試試看看它是否有效。

5

C4H5As中提到的保留增加空間的scp的bash完成中的功能不是和號,這只是sed語法中的「替換爲匹配」。

你必須改變IFS所以compgen不會對空格,但在換行或製表符分割輸入:

local IFS=$'\t\n' 
COMPREPLY=($(compgen -W "$options" -- $cur)) 
0

您可以通過使用相應的選項去掉空格做到這一點,然後手工將它們添加回你想讓他們的選項,全部採用簡單-W(「詞表」)完成:

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram 

自動完成,現在將插入option1option2後的空間,但沒有後210。