
Я написал две функции 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
.