
Eu escrevi duas funções push
e pull
para copiar arquivos de e para um diretório ( $FILE_EXCHANGE_DIR
). Quero que o bash preencha automaticamente os nomes desse diretório quando uso a pull
função. Quero que o preenchimento automático receba apenas nomes do referido diretório. No formulário atual, meu preenchimento automático também encontra nomes dos arquivos no diretório atual, independentemente de haver correspondência no diretório de origem ( $FILE_EXCHANGE_DIR
) ou não.
Aqui estão duas versões da função para a qual passei complete
. Nenhum deles funcionou.
_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;
}
No final, eu faço
complete -f -F _pull pull
Existe uma boa maneira de completar nomes apenas de um diretório (que não é o atual) e não do atual? Mesmo no caso em que não houve correspondência na fonte (que deve ser o padrão de readline
conclusão?
Responder1
Se bem entendi, deve ser isso que você está procurando:
_pull () {
# Set
IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull
Ele até escapa de espaços nos nomes dos arquivos.
Observe que isso -o default
termina com readline
o padrão, mas isso não parece ser nada, a menos que você o defina explicitamente em algum lugar ( .initrc
?). Se você quiser nomes de arquivos, use -o filenames
ou fique com -f
.