Cancelar conclusão, mas apenas conclusão, em zsh

13

Quando uma função de conclusão demora muito tempo, posso interrompê-la pressionando Ctrl + C (chave de interrupção do terminal, envia SIGINT) ou Ctrl + G (ligado a send-break ) . Sou então deixado com a palavra incompleta.

No entanto, se acontecer de eu pressionar Ctrl + C ou Ctrl + G como a função de conclusão Quando terminar, o pressionamento da minha tecla pode cancelar a linha de comando e me dar um novo aviso, em vez de cancelar a conclusão.

Como posso configurar o zsh para que uma determinada chave cancele uma conclusão em andamento, mas não faça nada se nenhuma função de conclusão estiver ativa?

    
por Gilles 18.09.2013 / 01:43

2 respostas

5

Aqui está uma solução que configura um manipulador SIGINT que faz com que Ctrl + C só interrompa quando a conclusão estiver ativa.

# 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
}
    
por 02.10.2013 / 08:39
0

Não sei se esta é uma solução aceitável ou não, mas enviar um SIGSTOP ( Ctrl + S ) parece ter o efeito desejado, com o Se você enviar um SIGSTART ( Ctrl + Q ) antes de digitar qualquer outra coisa, você pode iniciar o autocomplete novamente. Eu não sou um especialista em controle de trabalho, então isso pode deixar alguma confusão adicional relacionada ao trabalho interrompido.

    
por 25.09.2013 / 19:09