GNU/Linux >> Linux Esercitazione >  >> Linux

Annulla completamento, ma solo completamento, in Zsh?

Quando una funzione di completamento richiede molto tempo, posso interromperla premendo Ctrl +C (tasto di interruzione terminale, invia SIGINT) o Ctrl +G (legato a send-break ). Rimango quindi con la parola incompleta.

Tuttavia, se mi capita di premere Ctrl +C o Ctrl +G proprio al termine della funzione di completamento, la pressione del mio tasto potrebbe annullare la riga di comando e darmi un nuovo prompt invece di annullare il completamento.

Come posso impostare zsh in modo che una determinata chiave annulli un completamento in corso ma non faccia nulla se non è attiva alcuna funzione di completamento?

Risposta accettata:

Ecco una soluzione che imposta un gestore SIGINT che rende Ctrl +C interrompere solo quando il completamento è attivo.

# 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. ${!foo} E Zsh?

  2. Completamento automatico Zsh dinamico per comandi personalizzati?

  3. Nessuno spazio rimasto sul dispositivo, ma la partizione è piena solo per metà e gli inode sono disponibili

  4. Sposta il file ma solo se è chiuso

  5. Consenti a tutti gli utenti di creare file in una directory, ma solo il proprietario può eliminarli

Quale terminale è migliore:Bash vs Zsh

Shebang indipendenti dal percorso?

Perché "ls -all" mostra l'ora per alcuni file ma solo l'anno per altri?

Comando non trovato in Zsh, ma trovato in Bash?

Mostra solo Stderr sullo schermo ma scrivi sia Stdout che Stderr su file?

Perché ci sono `/lib` e `/lib64` ma solo `/bin`?