No expandir el comodín al completar la pestaña

No expandir el comodín al completar la pestaña

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 TABclave.

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).

  1. 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]

  2. 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!

  3. 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
    }
    
  4. 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: *.fooo *.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 zshcompctly 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?

información relacionada