
Escribí dos funciones push
y pull
copiar archivos hacia y desde un directorio ( $FILE_EXCHANGE_DIR
). Quiero que bash complete automáticamente los nombres de ese directorio cuando uso la pull
función. Quiero que el autocompletado solo tome nombres de dicho directorio. En el formulario actual, mi autocompletado también encuentra nombres de archivos en el directorio actual, independientemente de si hubo una coincidencia en el directorio de origen ( $FILE_EXCHANGE_DIR
) o no.
Aquí hay dos versiones de la función a la que pasé complete
. Ninguno de los dos funcionó.
_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;
}
Al final lo hago
complete -f -F _pull pull
¿Existe una buena manera de completar nombres solo de un directorio (que no es el actual) y no del actual? Incluso en el caso de que no hubiera ninguna coincidencia en la fuente (¿cuál debería ser la readline
finalización predeterminada de forma predeterminada?
Respuesta1
Si entendí correctamente, esto debería ser lo que estás buscando:
_pull () {
# Set
IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull
Incluso escapa espacios en los nombres de archivos.
Tenga en cuenta que -o default
se completa con readline
el valor predeterminado de , pero en realidad no parece ser nada a menos que lo establezca explícitamente en algún lugar ( .initrc
?). Si desea nombres de archivos, utilice -o filenames
o quédese con -f
.