
Me pregunto cómo puedo configurarzshanoexpanda el comodín en un nombre de archivo. Por ejemplo, tengo un directorio de unos cientos de archivos con el siguiente nombre:
a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo
Me gustaría poder realizar una coincidencia de finalización de tabulacióndespuésun comodín, entonces
cat *.foo-< tab > => cat *.foo-bar
Esto es lo que obtengo en su lugar:
$ gato *.foo- => gato a.foo-bar archivo a.foo-bar b.foo-bar c.foo-bar
Respuesta1
Una opción es reemplazar la combinación de teclas predeterminada para la TAB
clave.
bindkey "^I" expand-or-complete
con
bindkey "^I" complete-word
que no expandirá *
a todos los archivos coincidentes, pero dejará la estrella intacta. De esta manera te deshaces de la lista interminable, pero aún así no completará la expresión global.
Resolver esto es mucho más complicado. Tienes que escribir el tuyowidget de finalización(ver man zshcompwid
).
Comencemos con la definición:
zle -C complete-glob menu-complete compglob
Esto presenta el nuevo widget.globo completo, que se comporta comomenú completoy utiliza elfunción de shell compglobpara generar las coincidencias.
[Nota: si no desea completar el menú, utilice las opciones mucho más rudimentariaspalabra completaoopciones de lista]
Vincula este nuevo widget a un acceso directo conveniente, como
CTRL+K
:bindkey "^K" complete-glob
¡No vincule esto a
TAB
, ya que el widget en su forma actual solo completa archivos!Definir la función de shellcompglobde la siguiente manera, que hace el trabajo real:
compglob () { setopt localoptions globsubst compset -P '*' files=(${IPREFIX}*) display=(${files/${IPREFIX}/${(q)IPREFIX}}) glob=(${files/${IPREFIX}/}) compadd -d display -- $glob }
Demostración:
$ touch a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo $ cat *.f<CTRL+K> $ cat *.foo \*.foo \*.foo-bar
El único defecto que veo es el
\
frente de la estrella en la lista presentada. Pero esto es sólo un defecto óptico, ya que la finalización es correcta:*.foo
o*.foo-bar
.
Respuesta2
No creo que eso sea posible. Le está pidiendo al shell no solo que determine qué archivos desea y cuáles no desea que terminen como "válidos según su expansión comodín", sino que también desea que el shell determine cuál es la "mejor" expresión comodín que se expandirá. Por aquí. Esperaría que la segunda parte sea NP-completa.
Respuesta3
Todavía no veo una manera de que puedas obtener lo que buscas, pero puedes obtener una pequeña modificación (que puede ser útil o no) a través de setopt GLOB_COMPLETE
(esto te dará solo una expansión, y luego puedes pasar por ellos... o editar solo ese para que *
vuelva a ser uno, lo que al menos puede ser una pequeña mejora).
También puedes investigar en man zshoptions
, man zshcompctl
y man zshcompwid
/o similares. El proceso de finalización de zsh es bastante complejo, por lo que supongo que puede haber una manera de hacerlo.
También tenga en cuenta una pregunta algo relacionada:
¿Cómo consigo que el autocompletado de zsh complete comodines como lo hace bash?