ZSH tiene un potente menú de selección de autocompletado, por ejemplo, para elegir un directorio, elegir un proceso con matar (kill[tab][tab]). Puede utilizar flechas para navegar por las opciones.
¿Es posible tener también el menú emergente para la búsqueda del historial (CTRL+R)? ¿De tal manera que el menú permita navegar por las coincidencias de la barra de búsqueda CTRL+R actual?
Respuesta1
Sé que esto está lejos de lo que estás pidiendo, pero podría resolver tu problema subyacente.
Hay una extensión de historial de shell que le muestra una página llena de resultados cuando busca en el historial. También le muestra resultados relevantes primero según el directorio actual, el repositorio git, el estado de salida y el host.
Puedes instalar el proyecto aquí:https://github.com/curusarn/resh
Ejecútelo usando CTRL+ R(reemplaza la búsqueda inversa).
Así es como se ve la aplicación de búsqueda:
Descargo de responsabilidad: soy el creador del proyecto y esto es una autopromoción descarada.
Respuesta2
zsh-navigation-tools
hace algo como esto. Si usa oh-my-zsh, solo necesita agregarlo zsh-navigation-tools
en plugins=(...)
su .zshrc
luego Ctrl-R le dará un historial de desplazamiento con arriba/abajo y búsqueda/filtrado. Puedes usarlo sin oh-my-zsh pero la configuración parece más trabajosa.
Respuesta3
No que yo sepa.
Tal vezdeseas probar
predict-on
, que hace algo relacionado con lo que estás preguntando:autoload -U predict-on zle -N predict-on zle -N predict-off bindkey '^X1' predict-on bindkey '^X2' predict-off
Respuesta4
Eso es posible; En principio modifiqué la _kill
finalización para que funcione también para eventos históricos.
He aquí un ejemplo; después de seleccionar una entrada, presione [ENTER] una vez para aceptar el número de evento (la línea de comando dice entonces fe hc 780
) y presione [ENTER] nuevamente para ejecutar el comando. (Úselo fc
en lugar de hc
si desea modificar la línea de comando antes de la ejecución).
$ hc Makefile[TAB]
history event
1906 9.3.2013 18:10 vi Makefile
1867 9.3.2013 17:26 less Makefile
780 3.2.2013 17:54 cat Makefile
776 3.2.2013 17:51 cat ../Makefile
Para usarlo, coloque los archivos adjuntos en un directorio en su $fpath
y agregue estas líneas en su ~/.zshrc
:
zstyle ':completion:*:historyevent' command 'fc -dE -lr 1'
zstyle ':completion:*:historyevent' sort no
Finalmente, inicie una nueva zsh
sesión.
Cuidado, es una solución rápida y sucia, pero funcionó bien desde hace algún tiempo.
_historiaevent
#autoload
local out histevent list expl match desc listargs all nm ret=1
_tags historyevent || return 1
all=(-U)
match="*[[:blank:]]*[[/[:blank:]]$PREFIX*$SUFFIX*"
nm="$compstate[nmatches]"
out=( "${(@f)$(_call_program historyevent fc -l 2>/dev/null)}" )
desc="$out[1]"
out=( "${(@M)out[2,-1]:#${~match}}" )
histevent=( "${(@)${(@M)out##[^0-9]#[0-9]#}##*[[:blank:]]}" )
if zstyle -T ":completion:${curcontext}:historyevent" verbose; then
list=( "${(@Mr:COLUMNS-1:)out}" )
desc=(-ld list)
else
desc=()
fi
_wanted processes expl 'history event' \
compadd "$@" "$desc[@]" "$all[@]" -a - histevent && ret=0
if [[ -n "$all" ]]; then
zstyle -s ":completion:${curcontext}:historyevent" insert-ids out || out=menu
case "$out" in
menu) compstate[insert]=menu ;;
single) [[ $compstate[nmatches] -ne nm+1 ]] && compstate[insert]= ;;
*) [[ ${#:-$PREFIX$SUFFIX} -gt ${#compstate[unambiguous]} ]] &&
compstate[insert]=menu ;;
esac
fi
return ret
_fc
#compdef fc
local curcontext="$curcontext" line state ret=1
_arguments -C \
'-e[editor command]' \
'-l[list last history events]' \
'-n[suppress numbers]' \
'-r[reverse order]' \
'*:history event:->historyevent' && ret=0
if [[ -n "$state" ]]; then
_alternative \
'historyevent:: _historyevent' && ret=0
fi
return ret