
我編寫了兩個函數push
,pull
用於將檔案複製到目錄 ( ) 和從目錄複製檔案$FILE_EXCHANGE_DIR
。我希望 bash 在使用該pull
函數時自動完成該目錄中的名稱。我希望自動補全僅從所述目錄中取得名稱。在目前表單中,我的自動補全功能也會尋找目前目錄中的檔案名稱,無論來源目錄 ( $FILE_EXCHANGE_DIR
) 中是否存在符合項目。
這是我傳遞給的函數的兩個版本complete
。他們都沒有工作。
_pull () {
local cmd="${1##*/}";
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )
local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )
COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
return 0;
}
_pull ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
local pat="$FILE_EXCHANGE_DIR/*"
COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));
i=0
for item in "${COMPREPLY[@]}"; do
COMPREPLY[$i]="${item##*/}"
i+=1
done;
return 0;
}
最後,我做
complete -f -F _pull pull
有沒有一種好方法只從一個目錄(不是當前目錄)而不是從當前目錄完成名稱?即使在來源中沒有匹配的情況下(應該預設為readline
預設完成?
答案1
如果我理解正確的話,這應該是您要尋找的:
_pull () {
# Set
IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull
它甚至轉義檔名中的空格。
請注意,-o default
以 的預設值完成,但除非您在某處明確設定它( ?),readline
否則實際上似乎什麼都不是。.initrc
如果您需要文件名,請使用-o filenames
或堅持使用-f
.