Forzar la finalización normal de la pestaña Bash si falla la finalización inteligente

10

Desde que la finalización de la pestaña se convirtió en una característica estándar en los shells, he sido un usuario muy feliz. Incluso me gusta la finalización inteligente de Bash (donde solo busca archivos PDF, si escribo evince foo <TAB>), siempre que adivine correctamente.

Arruina un día feliz cuando Bash usa su terminación inteligente para negarse a completarla.

Hoy quería:

tar xvf centos5.8_x86_1.ova

Entonces entré:

tar xvf cent<TAB>

y Bash se niega a completar la ruta porque .ova-files no es lo que usualmente usa con tar.

Sé que puedo desinstalar el paquete bash-complete para eliminar la finalización inteligente. ¿Pero puedo tener mi pastel y comerlo también?

¿Puedo pedirle a bash que use primero la finalización inteligente, y si eso falla, entonces use la finalización no inteligente?

Ole Tange
fuente
1
<spam> Zsh puede hacerlo. </spam>
Gilles 'SO- deja de ser malvado'

Respuestas:

9

Lo siguiente debería activar la finalización de bash normal después de que todas las finalizaciones 'inteligentes' hayan fallado para los programas tar, vim y emacs:

compopt -o bashdefault tar vim emacs

vea también la página correspondiente en el manual de bash en línea.

Advertencia: obtiene el comportamiento normal para el tipo de finalización (comandos / nombres de archivo / nombres de usuario, etc.) definido por la finalización inteligente del comando en cuestión, por ejemplo, la finalización de serviceno completará los nombres de archivo incluso si llama complete -o bashdefault service.

En este y otros casos en los que falla el autocompletado inteligente, siempre puede presionar Alt-/(o M-/en la notación del manual bash) para completar los nombres de archivo casi de la misma manera que TAB funciona si la finalización inteligente está desactivada (casi de la misma manera en el sentido que M-/no patrones completos como *.txt). Consulte aquí las secuencias de teclas para otros tipos de finalizaciones, como comandos y nombres de usuario.

Matthieu
fuente
2
Gracias por la Alt- / mención, no tenía idea de que estaba allí
Michael Speer
1

La finalización de bash es una extensión de la finalización estándar de bash y es en sí misma un programa de bash. Entonces, si desea cambiar la forma en que actúa el programa, simplemente cámbielo. Esto es software libre, eres libre de hacerlo. Para el caso específico del tarcomando, el archivo es /usr/share/bash-completion/completions/tar. Para tarautocompletar un archivo con extensión ova, simplemente agréguelo a la línea

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

entonces dice

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

Tenga en cuenta que esta es la ruta y el código existente para Debian Wheezy (versión estable actual). Una distribución o versión diferente puede tener un código diferente, pero la idea es la misma. Abra el código y ajústelo para hacer lo que quiere que haga.

Edit: Acabo de notar que la pregunta era casi cada vez que no se encuentra una coincidencia y no sólo el caso específico de la adición ovaa tar. Tal vez aún pueda ser útil para alguien saber dónde pueden buscar la fuente.

carandraug
fuente
44
Modificar archivos en / usr que son propiedad del administrador de paquetes es una buena manera de inducir un shock desagradable en la actualización. Mejor: anule la configuración empaquetada.
Chris Down
1
@ChrisDown y ¿cómo harías eso? Todavía estoy buscando la solución limpia .bashrc.
Clayton Stanley