GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cancelar la finalización, pero solo la finalización, en Zsh?

Cuando una función de finalización lleva mucho tiempo, puedo interrumpirla presionando Ctrl +C (tecla de interrupción de terminal, envía SIGINT) o Ctrl +G (vinculado a send-break ). Entonces me quedo con la palabra incompleta.

Sin embargo, si presiono Ctrl +C o Ctrl +G Justo cuando finaliza la función de finalización, la pulsación de tecla puede cancelar la línea de comando y mostrarme un mensaje nuevo en lugar de cancelar la finalización.

¿Cómo puedo configurar zsh para que una tecla determinada cancele una finalización en curso pero no haga nada si no hay ninguna función de finalización activa?

Respuesta aceptada:

Aquí hay una solución que configura un controlador SIGINT que hace que Ctrl +C solo interrumpir cuando la finalización está activa.

# A completer widget that sets a flag for the duration of
# the completion so the SIGINT handler knows whether completion
# is active. It would be better if we could check some internal
# zsh parameter to determine if completion is running, but as 
# far as I'm aware that isn't possible.
function interruptible-expand-or-complete {
    COMPLETION_ACTIVE=1

    # Bonus feature: automatically interrupt completion
    # after a three second timeout.
    # ( sleep 3; kill -INT $$ ) &!

    zle expand-or-complete

    COMPLETION_ACTIVE=0
}

# Bind our completer widget to tab.
zle -N interruptible-expand-or-complete
bindkey '^I' interruptible-expand-or-complete

# Interrupt only if completion is active.
function TRAPINT {
    if [[ $COMPLETION_ACTIVE == 1 ]]; then
        COMPLETION_ACTIVE=0
        zle -M "Completion canceled."            

        # Returning non-zero tells zsh to handle SIGINT,
        # which will interrupt the completion function. 
        return 1
    else
        # Returning zero tells zsh that we handled SIGINT;
        # don't interrupt whatever is currently running.
        return 0
    fi
}

Linux
  1. Comenzando con Zsh

  2. Facl ignorando el permiso "x" pero solo en archivos?

  3. ¿Un tutorial de finalización de Easy Bash?

  4. ¿Autocompletar Zsh dinámico para comandos personalizados?

  5. ¿Se bloquea la finalización de pestañas?

¿Por qué “ls -all” muestra la hora para algunos archivos pero solo el año para otros?

¿Cómo obtener un tipo de datos de variables en Zsh?

¿Retroceso en Zsh atascado?

Zsh:Establecer Term=screen-256color en Tmux, pero ¿Xterm-256color sin Tmux?

Mover archivo pero solo si está cerrado

Permitir que todos los usuarios creen archivos en un directorio, pero solo el propietario puede eliminarlos