bash 中不同目錄中的完整檔案

bash 中不同目錄中的完整檔案

我編寫了兩個函數pushpull用於將檔案複製到目錄 ( ) 和從目錄複製檔案$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.

相關內容