Autocompletar bash con comodín

Autocompletar bash con comodín

Me gustaría escribir en la terminal como lo hago en emacs:

emacs 2019-*subject*

Cuando golpeo Tabobtengo el primer partido:

2019-08-03-subject.markdown 

Lo que me gustaría es que me muestre las opciones como:

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

Busqué en todas partes en línea y no puedo creer que esto no sea una característica.

Haymuchos similarpreguntas formuladas.Las respuestas no funcionan como las quiero (como se muestra arriba). Otras soluciones que probé:aquí.

PD: uso Ubuntu 16. Esta es una funcionalidad típica que encuentro en emacs cuando abro archivos. Sería muy conveniente.

Respuesta1

Lo que sucede después Tabdepende de los guiones de finalización.esta respuestame hace creer que el comportamiento deseado estaba ahí para al menos un usuario en 2013, pero en 2019 el comportamiento en mi Debian 9 es como lo describiste; posiblemente los guiones/comportamiento hayan cambiado desde entonces.

Además, Bash elige un script según el comando escrito (primera palabra en la línea actual). No es inmediatamente obvio que un solo cambio pueda afectar todas las terminaciones para proporcionar lo que desea (supongo que la _filedirfunción es un buen comienzo).


Afortunadamente puedes conseguir posibles ampliaciones bajo demanda. De man 1 bash(debajo del READLINEencabezado):

glob-complete-word( M-g)
La palabra antes del punto se trata como un patrón para la expansión del nombre de la ruta, con un asterisco implícitamente añadido. Este patrón se utiliza para generar una lista de nombres de archivos coincidentes para posibles terminaciones.

glob-expand-word( C-x *)
La palabra antes del punto se trata como un patrón para la expansión del nombre de ruta y se inserta la lista de nombres de archivos coincidentes, reemplazando la palabra. Si se proporciona un argumento numérico, se añade un asterisco antes de la expansión del nombre de ruta.

glob-list-expansions( C-x g) Se muestra
la lista de expansiones que se habrían generado glob-expand-wordy se vuelve a dibujar la línea. Si se proporciona un argumento numérico, se añade un asterisco antes de la expansión del nombre de ruta.

M-gy describir C-x *las C-x gcombinaciones de teclas predeterminadas. En un formato más amigable estos son:

  • Meta+ g( Alt+ g) para glob-complete-word,
  • Ctrl+ x, (soltar Ctrl) *para glob-expand-word(nota: *de hecho está Shift+ 8en mi teclado),
  • Ctrl+ x, (liberar Ctrl) gpara glob-list-expansions.

El siguiente código establece estos enlaces (en caso de que falten por cualquier motivo):

  • solo para el shell actual:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • o en su configuración permanente ( /etc/inputrco ~/.inputrc):

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (tenga en cuenta que esto sólo afectará a los nuevos shells, a menos querecargar).


Te interesará glob-complete-wordo glob-list-expansions. Principales diferencias:

  • glob-complete-wordsiempre añade un asterisco, mientras que glob-list-expansionslo hace de forma condicional (consulte el manual citado).
  • Si hay muchas coincidencias, es posible que necesite activar glob-complete-worddos veces (es decir, presionar la combinación de teclas dos veces) antes de que imprima algo; esto depende de show-all-if-ambiguous, compare elrespuesta ya mencionada.
  • Si solo hay una coincidencia, glob-complete-wordse realizará una finalización de línea real, mientras que glob-list-expansionssolo se mostrará la coincidencia.

En tu caso particular escribe esto:

emacs 2019-*subject*

entonces Ctrl+ x, g.

información relacionada