En lugar de seguir comentando ...
complete -f -X '!*.@(zip|udp)' unzip
debería agregar terminación para
-f -X '!*.@(zip|udp)'
| | | |||________|
| | | || |
| | | || +- filterpat: zip or udp
| | | |+------------- @ : Matches one of the given patterns
| | | +-------------- *. : Anything+<dot>
| | +---------------- ! : Negate
| +------------------- -X : Filter out matches in "filterpat"
+---------------------- -f : files
En otras palabras: complete los archivos y elimine todos los que no terminen en .zip
o .udp
.
Extras
Si agrega -o default
finalización, completará / coincidirá todos los archivos y directorios si no hay archivos que terminen en .zip
o .udp
.
Si agrega -o plusdirs
finalización agregará cualquier directorio además de cualquier coincidencia de archivos que terminen en .zip
o .udp
.
Actual
Cuando lo complete -p unzip
usas obtienes el patrón actual.
De sus comentarios, suena principalmente como si faltara +
o @
en el patrón, como en:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
lo que significaría coincidir con cualquier archivo que literalmente termine en.(zip|udp)
. P.ej
touch 'file_test.(zip|udp)'
También eche un vistazo a esta sección del manual:
es posible, por ejemplo, extglob
no está habilitado. Habilitar por:
shopt -s extglob
Verifique el estado actual de todas las shopt
configuraciones ingresando:
shopt
Función
Si es -F something
así, significa que utiliza una función llamada algo para generar la lista de finalizaciones.
El _filedir_xspec
es típicamente una función Debian. Puede que tengas algo como esto:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Lo que significa /usr/share/bash-completion/bash_completion
obtener fuentes. Aquí encontrarás la función en cuestión . Algunas líneas más abajo, verá que esta función / finalización se agrega mediante una función denominada, _install_xspec
por ejemplo:
_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
Entradas manuales:
Actualización a los comentarios 1:
- No coincide debido a archivos inválidos o permisos de archivo.
Esto no debería afectar el resultado. complete
solo coincide con los archivos dados por las reglas y no procesa los archivos. Si puede enumerarlos ls
, deberían coincidir.
Como nota al margen, se podría agregar dicha funcionalidad mediante el uso de una función completa:
function _unzip_validated() {
# 1. Generate list of files ending in e.g. .zip and .udp
# 2. Validate each file and remove invalid ones from file list.
}
complete -F _unzip_validated unzip
- Colores. ¿Por qué ls
distinguir test.zip
de test.upd
?
Esto no afecta complete
. Los colores ls
son proporcionados por $LS_COLORS
. Tratar:
echo "$LS_COLORS" | tr : '\n' | sort
Deberías ver algo como lo *.zip=01;31
que significa:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
Por otro lado, no tiene ninguna entrada asociada, por lo que no tiene color.
Siguiente paso (debería haber sido el primero)
- Abra la terminal y vaya a un directorio con archivos de prueba. Tanto .zip como .udp
- Entrar
bash --norc
- Entrar
complete -f -X '!*.@(zip|udp)' unzip
- Entrar
shopt -s extglob
- Entrar
unzip <tab><tab>
¿Resultado?
Además, haga clic en editar debajo de su pregunta y agregue la salida de:
bind -V
shopt
env
Podría ser útil.
complete -p unzip
cedecomplete -f -X '!*.@(zip|udp)' unzip
yunzip <tab>
completa el archivo llamadotest.zip
. Sin embargo, el directorio también contiene un archivo llamadotest.upd
que no se encuentra al completar la pestañaunzip
. ¿El hecho de los permisos de archivo o una longitud cero del archivo puede explicar este comportamiento extraño?