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.txt
igual que la finalización de pestañas en Sublime Text.
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.txt
igual que la finalización de pestañas en Sublime Text.
Respuestas:
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 COMPREPLY
variable. 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 DIRPATH
está todo antes del último / en su camino que está escribiendo y BASENAME
es donde está actualmente su cursor.
FILTER
es donde entra en juego el fuzzy-ness. Básicamente, toma BASENAME
e 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.
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-T
combinación de teclas para su shell. El siguiente GIF muestra cómo funciona.
fzf
... (tput sc) y luego restaurarlo con tput rc
...
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_WORD
funció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.
cat Th
+tab
?