Vervollständigen Sie Dateien aus einem anderen Verzeichnis in Bash

Vervollständigen Sie Dateien aus einem anderen Verzeichnis in Bash

Ich habe zwei Funktionen geschrieben pushund pullum Dateien in ein Verzeichnis und aus einem Verzeichnis zu kopieren ( $FILE_EXCHANGE_DIR). Ich möchte, dass Bash Namen aus diesem Verzeichnis automatisch vervollständigt, wenn ich die pullFunktion verwende. Ich möchte, dass die automatische Vervollständigung nur Namen aus dem besagten Verzeichnis übernimmt. In der aktuellen Form findet meine automatische Vervollständigung auch Namen der Dateien im aktuellen Verzeichnis, unabhängig davon, ob es eine Übereinstimmung im Quellverzeichnis ( $FILE_EXCHANGE_DIR) gab oder nicht.

Hier sind zwei Versionen der Funktion, die ich übergeben habe complete. Keine von beiden hat funktioniert.

_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;
}

Am Ende

complete -f -F _pull pull

Gibt es eine gute Möglichkeit, Namen nur aus einem Verzeichnis (das nicht das aktuelle ist) und nicht aus dem aktuellen zu vervollständigen? Auch in dem Fall, dass es in der Quelle keine Übereinstimmung gab (was die Standardvervollständigung sein sollte) readline?

Antwort1

Wenn ich das richtig verstehe, dürfte das das sein, was Sie suchen:

_pull () {
    # Set
    IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
    COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull

Es maskiert sogar Leerzeichen in Dateinamen.

Beachten Sie, dass -o defaultmit readlinedem Standard von abgeschlossen wird, aber das scheint eigentlich nichts zu bedeuten, sofern Sie es nicht irgendwo explizit festlegen ( .initrc?). Wenn Sie Dateinamen möchten, verwenden Sie -o filenamesoder bleiben Sie dabei -f.

verwandte Informationen