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 .zipo .udp.
Extras
Si agrega -o defaultfinalización, completará / coincidirá todos los archivos y directorios si no hay archivos que terminen en .zipo .udp.
Si agrega -o plusdirsfinalización agregará cualquier directorio además de cualquier coincidencia de archivos que terminen en .zipo .udp.
Actual
Cuando lo complete -p unzipusas 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, extglobno está habilitado. Habilitar por:
shopt -s extglob
Verifique el estado actual de todas las shoptconfiguraciones ingresando:
shopt
Función
Si es -F somethingasí, significa que utiliza una función llamada algo para generar la lista de finalizaciones.
El _filedir_xspeces 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_completionobtener 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_xspecpor 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. completesolo 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é lsdistinguir test.zipde test.upd?
Esto no afecta complete. Los colores lsson proporcionados por $LS_COLORS. Tratar:
echo "$LS_COLORS" | tr : '\n' | sort
Deberías ver algo como lo *.zip=01;31que 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 unzipcedecomplete -f -X '!*.@(zip|udp)' unzipyunzip <tab>completa el archivo llamadotest.zip. Sin embargo, el directorio también contiene un archivo llamadotest.updque 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?~/bin/testing2.complete -f -X '!*.@(zip|udp)' testing, 3.testing <tab><tab>?shopt...extglobEstá activado. El ejemplo con 'prueba' selecciona elziparchivo solo de nuevo. Noté quetest.zipse muestra en color rojo, mientras quetest.updse muestra en color blanco conls -lambos archivos vacíos con los mismos permisos, cambio de propietario y asociación de grupo. ¿Por quélsdistinguirtest.zipdetest.upd? Tal vez esta es una pista sobre el problema que tengo?En el archivo
/etc/bash_completion, que presumiblemente está buscando en alguna parte, la finalización predeterminada, al menos para mi versión debash(v4.2.25) esIntenta cambiar toda la expresión a
Y agrega a tu
.bash_profilefuente
unzip <tab>obtengo , ni encuentra.zipni.updarchivos ni otros archivos.gzipcon.gzarchivos?gunzipcon.gzarchivos sólo seleccionar los archivos que terminan en.gz, pero la definición es también diferente:complete -F _filedir_xspec gunzip./etc/bash_completionen tu.bashrc?shopt -s extglobIntente agregar esta línea en su .bashrc:
fuente
.udparchivos, pero solo si no hay.ziparchivos presentes. Si hay un archivotest.zipytest.udpen el directorio actual,unzip <tab>solo se enumera el.ziparchivo. Esperaría ver ambos archivos (es decir, la finalización de bash daríatest.).udpyziparchivos. ¿Fuente.bashrcdespués de agregar la línea?unzip <tab>enumero todos los archivos, incluso los que terminan en una frase diferente. Ahora bastante lo que necesito.complete -f -o default -X '!*.zip' unzipycomplete -f -o default -X '!*.udp' unzipMejor uso en
_filedirlugar de "crudo"complete.Justificación
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l~caminos tilde ( ) se están expandiendo/home/tux/Do<TAB><TAB>, la lista que obtiene como respuesta elimina '/ home / tux' y, por lo tanto, es mucho más compactaMWE
fuente