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?~/bin/testing
2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
...extglob
Está activado. El ejemplo con 'prueba' selecciona elzip
archivo solo de nuevo. Noté quetest.zip
se muestra en color rojo, mientras quetest.upd
se muestra en color blanco conls -l
ambos archivos vacíos con los mismos permisos, cambio de propietario y asociación de grupo. ¿Por quéls
distinguirtest.zip
detest.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_profile
fuente
unzip <tab>
obtengo , ni encuentra.zip
ni.upd
archivos ni otros archivos.gzip
con.gz
archivos?gunzip
con.gz
archivos sólo seleccionar los archivos que terminan en.gz
, pero la definición es también diferente:complete -F _filedir_xspec gunzip
./etc/bash_completion
en tu.bashrc
?shopt -s extglob
Intente agregar esta línea en su .bashrc:
fuente
.udp
archivos, pero solo si no hay.zip
archivos presentes. Si hay un archivotest.zip
ytest.udp
en el directorio actual,unzip <tab>
solo se enumera el.zip
archivo. Esperaría ver ambos archivos (es decir, la finalización de bash daríatest.
).udp
yzip
archivos. ¿Fuente.bashrc
despué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' unzip
ycomplete -f -o default -X '!*.udp' unzip
Mejor uso en
_filedir
lugar 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