es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir auto completado de zsh que reemplace el último argumento?

Quiero proporcionar un autocompletado que busque resultados en línea. La idea es que el usuario ingrese un término de búsqueda, presione la tecla tab y obtenga resultados de una búsqueda en línea basada en ese término. Los resultados no necesariamente comienzan con el término que ingresó el usuario, ni siquiera lo contienen (es más probable que sus descripciones contengan el término).

Aquí se muestra una ilustración del posible flujo:

  1. El usuario ingresa el término de búsqueda y presiona la tecla “tab” para activar el autocompletado.

$ bookmark hello<tab>

  1. El autocompletado borra el término de búsqueda ingresado (porque buscamos por descripción, no por información que queremos ingresar), hace una solicitud de red y presenta opciones de autocompletado.

$ bookmark
www.hellomagazine.com — HELLO! – Daily royal, …
en.wikipedia.org/wiki/Hello_(Adele_song) — Hello (Adele song) – Wikipedia

  1. El usuario selecciona una de las opciones posibles.

$ bookmark www.hellomagazine.com

¿Es este un buen enfoque en absoluto? ¿Quizás cosas como esta se hacen generalmente usando un patrón diferente?

Así que encontré algunos problemas al hacerlo:
1. Cuando uso “_arguments” para presentar posibles respuestas, zsh las filtra por el término que el usuario ya ingresó. ¿Probablemente necesito borrar la última palabra ingresada primero? ¿Cómo lo hago?
2. Zsh ordena los resultados alfabéticamente, pero quiero presentarlos por relevancia (en el orden que los paso a “_arguments”). ¿Cómo hacerlo?
3. Zsh hace múltiples solicitudes de red para el mismo término. La primera vez que el usuario presiona la tecla tab, se realiza una solicitud pero aún no se presenta la lista de sugerencias. En la segunda tecla de tabulación se presenta la lista de opciones, pero necesita repetir la misma solicitud de red lenta para hacerlo. ¿Cómo puedo almacenar en caché o presentar la lista de resultados la primera vez?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Proporcionando autocompletado de búsqueda en línea con Zsh Shell

    Como experto en IT especializado en shell, autocompletado y zsh, puedo sugerir un buen enfoque para proporcionar autocompletado de búsqueda en línea en la shell zsh. Aquí están los pasos:

    1. Crear una función para realizar una búsqueda en línea basada en el término de búsqueda proporcionado por el usuario.
    2. Usar _arguments con la bandera -S'' para deshabilitar la supresión de argumentos, para que la función se pueda ejecutar al presionar la tecla Tab.

    3. Usar compadd para agregar los resultados de búsqueda a las opciones de autocompletado.

    4. Anular la función _main_complete para manejar el borrado del término de búsqueda ya ingresado desde la línea de comando y ordenar los resultados por relevancia, en lugar de alfabéticamente.

    5. Usar una caché para almacenar los resultados de la solicitud de red, para que la función no se ejecute cada vez que el usuario presione Tab en el mismo término de búsqueda.

    Aquí hay una implementación de ejemplo de los pasos anteriores:

    # Definir la función para realizar una búsqueda en línea
    function _online_search() {
        # Comprobar si el término de búsqueda ya está en caché
        if [[ $cache[(i)$words[-1]:*] -le $cache_age ]]; then
            # Usar los resultados en caché
            results=$cache[$words[-1]:*]
        else
            # Realizar solicitud de red
            results=$(curl -s "https://example.com/search?q=$words[-1]")
            # Cachear los resultados
            cache[$words[-1]]=$results
        fi
    
        # Extraer datos relevantes de los resultados (por ejemplo, URLs, títulos, descripciones)
        # ...
    
        # Agregar datos relevantes a las opciones de autocompletado
        compadd -X '' $relevant_data[@]
    }
    
    # Deshabilitar la supresión de argumentos y ejecutar la función al presionar Tab
    _arguments -S'' ':término de búsqueda:->search'
    
    # Anular _main_complete para manejar el borrado del término de búsqueda y ordenar los resultados por relevancia
    function _main_complete {
        zle _reset_last_cline_
        _arguments -qS" " $(_arguments -C -A "-*" "1: :->command" && command="$words[1]" && shift && _call_program command || return 1) && return 0
        compstate[insert]=menu # Habilitar pantalla de menú
        eval ${menucmd:=_menu_complete} # Permitir comandos de menú personalizados
        # Llamar a la función personalizada para manejar la búsqueda en línea
        [[ $words[-1] == *.* ]] || _online_search
    }
    
    # Usar una caché para almacenar los resultados de la solicitud de red
    zstyle ':completion:*' use-cache on
    zstyle ':completion:*' cache-path ~/.zsh/cache/
    
    # Establecer la edad de caché en 24 horas
    cache_age=86400
    

    Siguiendo estos pasos, puedes proporcionar una función eficiente y amigable para el usuario de autocompletado de búsqueda en línea en tu shell zsh.

Comments are closed.