¿Hay un shell que admita la finalización difusa como en Sublime Text?

14

Estoy usando bash y me preguntaba si hay algún complemento en bash u otro shell que me permita hacer esto cat tfnislong.txt+ [tab]completar al cat ThisFileNameIsSoLong.txtigual que la finalización de pestañas en Sublime Text.

carpinterías
fuente
¿Por qué no simplemente hacer cat Th+ tab?
daviewales
1
@daviewales Mostrar las 269 razones?
Fax

Respuestas:

11

Sé de https://github.com/mgalgs/fuzzy_bash_completion, que es un montón de funciones de shell que se utilizan complete.

Sin embargo, creo que podríamos hacerlo un poco mejor, ser más concisos. Es hora de abrir su .bashrc o .profile ...

El gancho básico que usamos es este:

complete -o nospace -o filenames -F fuzzypath cd ls cat

-F opción significa usar una función de shell para completar la pestaña, donde las opciones se establecen en la COMPREPLYvariable. Así por ejemplo:

función fuzzypath () {
    si [-z $ 2] 
    luego
        COMPREPLY = (`ls`)
    más
        DIRPATH = `echo" $ 2 "| gsed 's | [^ /] * $ ||' '
        BASENAME = `echo" $ 2 "| gsed 's |. * / ||' '
        FILTRO = `echo" $ BASENAME "| gsed 's |. | \ 0. * | g' '
        COMPREPLY = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`)
    fi
}

donde DIRPATHestá todo antes del último / en su camino que está escribiendo y BASENAMEes donde está actualmente su cursor.

FILTERes donde entra en juego el fuzzy-ness. Básicamente, toma BASENAMEe inserta un .*entre cada carácter para producir nuestro fuzz regex.

El resto es simplemente combinar la expresión regular con ls para producir COMPREPLY. Puede encontrar cosas más inteligentes para hacer aquí, tal vez con find.

También encontré que http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html es útil.

mwm
fuente
6

Puede encontrar fzf útil. Es un buscador difuso de propósito general escrito en Ruby que se puede usar con cualquier lista de cosas: archivos, procesos, historial de comandos, ramas git, etc.

Su script de instalación configurará la CTRL-Tcombinación de teclas para su shell. El siguiente GIF muestra cómo funciona.

Junegunn Choi
fuente
¡FZF es genial! Muchas gracias por contribuir. Esto me ahorró semanas de trabajo ... Estaba empezando a escribir una finalización difusa para Bash cuando por suerte encontré FZF. Funciona perfecto, solo tuve que recordar guardar la posición del cursor antes de llamar fzf... (tput sc) y luego restaurarlo con tput rc...
Håkon Hægland
3

Para ir junto con su otra respuesta, es posible que desee buscar en zsh. Es compatible con versiones anteriores de bash, por lo que puede usarlo como un reemplazo directo, pero admite funciones significativamente ampliadas y una de ellas es la finalización de la pestaña contextual mejorada.

Las preguntas frecuentes de finalización de zsh amplían los casos de uso, pero creo que según su ejemplo, estaría más interesado en la COMPLETE_IN_WORDfunción. No es exactamente el comportamiento deseado, pero está cerca. El punto principal es que hay muchas maneras de ampliar la funcionalidad base de una manera quizás más accesible que usar bash.

Aquí hay una extensión de coincidencia difusa que se aproximaría más específicamente a lo que desea; partido zsh-fuzzy

Para algunas ideas, puede echar un vistazo al popular marco oh-my-zsh que tiene una serie de funciones para administrar zsh y extenderlo. Es más de lo que desea, lo más probable, pero debajo de los complementos notará scripts de autocompletado para una variedad de roles. Para tener una idea de las capacidades.

krondor
fuente