Anuluj zakończenie, ale tylko zakończenie, w zsh

13

Gdy funkcja uzupełniania zajmuje dużo czasu, mogę ją przerwać, naciskając Ctrl+ C(klawisz przerwania terminala, wysyła SIGINT) lub Ctrl+ G(związany z send-break). Pozostają mi jeszcze niepełne słowo.

Jeśli jednak trafię Ctrl+ Club Ctrl+ w Gmomencie, gdy zakończy się funkcja uzupełniania, moje naciśnięcie klawisza może anulować wiersz poleceń i wyświetlić nowy monit zamiast anulować ukończenie.

Jak skonfigurować Zsh, aby określony klucz anulował trwające zakończenie, ale nic nie robił, jeśli żadna funkcja uzupełniania nie jest aktywna?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

5

Oto rozwiązanie, które konfiguruje moduł obsługi SIGINT, który powoduje, że Ctrl+ Cprzerywa tylko, gdy uzupełnianie jest aktywne.

# 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
}
Matt
źródło
0

Nie wiem, czy jest to akceptowalne rozwiązanie, czy nie, ale wydaje się , że wysłanie SIGSTOP ( Ctrl+ S) przynosi pożądany efekt, z dodatkową korzyścią, że możesz ponownie uruchomić autouzupełnianie, jeśli wyślesz SIGSTART ( Ctrl+ Q) przed wpisaniem coś jeszcze. Nie jestem jednak ekspertem w zakresie kontroli zadań, więc może to spowodować dodatkowe zakłócenia związane z zatrzymaną pracą.

Aaron Okano
źródło
1
Ctrl + S i Ctrl + Q to polecenia kontroli przepływu. Wpływają tylko na wyjście do terminala, co tutaj nie ma znaczenia. Jak można się spodziewać, Ctrl + S nie ma żadnego efektu podczas zakończenia (zsh i tak wyłącza ustawienie terminala, chwyta kombinację klawiszy). Naciśnięcie Ctrl + Z (który wysyła SIGTOP) również nie ma wpływu.
Gilles „SO - przestań być zły”,
Dzięki! Nie byłem do końca pewien, co się dzieje w tle. Widziałem tylko to, że odzyskałem kontrolę nad terminalem.
Aaron Okano