
Ich habe zwei Funktionen geschrieben push
und pull
um 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 pull
Funktion 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 default
mit readline
dem 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 filenames
oder bleiben Sie dabei -f
.