Tengo una función de finalización automática de zsh para un comando llamado gd
que realiza una búsqueda difusa basada en el $words[CURRENT]
valor y las sugerencias de devolución. La búsqueda funciona bien pero zsh no muestra ningún candidato porque el texto ingresado no es un prefijo de la sugerencia.
p.ej
% gd hw
Podría generar la finalizaciónoh hello there, world
Pero zsh no lo mostrará porque hw
no se encuentra al comienzo de la sugerencia.
¿Puedo hacer que zsh ofrezca la sugerencia como algo que reemplazaría la palabra actual cuando se elija?
Aquí hay una versión simplificada de mi secuencia de comandos de finalización en un archivo llamado _gd
que está en mi fpath
:
#compdef gd
_gd() {
local -a list
clue="$words[CURRENT]"
pattern=""
for i in $(seq $#clue)
do
pattern="$pattern.*${clue[i]}"
done
while read dir
do
list=( $list $dir )
done <<<$(grep "$pattern" ~/.recent-dirs)
_describe gd list
}
Respuesta1
Deshágase de esa _gd
función y simplemente agregue lo siguiente a su .zshrc
archivo:
autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'
Esto le indica al código de finalización que permita cualquier número adicional entre y alrededor de lo que ha escrito. Con esto, Zsh ahora puede completar de forma difusacualquier cosa.
r:X|Y=Z
busca todas las subcadenas no superpuestas que coincidan con el patrónXY
y las convierte en la parte que coincide conX
tambiéncoincide con cualquier cosa que coincida por patrónZ
al verificar si hay terminaciones coincidentes.?
coincide con cualquier carácter.- Si
X
oY
es igual a*
, coincide con cualquier número de caracteres consecutivos. - Si
Z
es igual*
, coincide con cualquier número de caracteres consecutivos.exceptocualquier cosa que coincida conY
. - Si
Z
es igual**
, coincide con cualquier número de caracteres consecutivos. - En
r:|?=**
,X
es igual a la cadena vacía. - De forma predeterminada, Zsh ya agrega un comodín al final de su entrada, completando así el círculo para una coincidencia aproximada completa.
Puedes encontrar la documentación aquí:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control
Respuesta2
Esto es un truco mientras espero respuestas más sabias...
Lo que hice fue hacer que mi generador de sugerencias produjera sugerencias como:
hw»oh hello there, world
Debido a que el comando (en realidad una función) está bajo mi control, simplemente elimino la basura al principio:
input="${input#*»}"
Pero sería bueno saber cómo hacerlo correctamente.