GNU/Linux >> Tutoriels Linux >  >> Linux

Annuler l'achèvement, mais uniquement l'achèvement, dans Zsh ?

Lorsqu'une fonction de complétion prend beaucoup de temps, je peux l'interrompre en appuyant sur Ctrl +C (touche d'interruption de terminal, envoie SIGINT) ou Ctrl +G (lié à send-break ). Il me reste alors le mot incomplet.

Cependant, s'il m'arrive d'appuyer sur Ctrl +C ou Ctrl +G juste au moment où la fonction de complétion se termine, mon appui sur une touche peut annuler la ligne de commande et me donner une nouvelle invite au lieu d'annuler la complétion.

Comment puis-je configurer zsh pour qu'une certaine touche annule une complétion en cours mais ne fasse rien si aucune fonction de complétion n'est active ?

Réponse acceptée :

Voici une solution qui configure un gestionnaire SIGINT qui rend Ctrl +C interrompre uniquement lorsque l'achèvement est actif.

# 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. Shebangs indépendants du chemin?

  2. Facl Ignorant La Permission "x" Mais Uniquement Sur Les Fichiers ?

  3. Comment obtenir un type de données Variables dans Zsh ?

  4. Afficher uniquement Stderr à l'écran, mais écrire à la fois Stdout et Stderr dans un fichier ?

  5. Pourquoi il y a `/lib` et `/lib64` mais seulement `/bin` ?

Pourquoi "ls -all" affiche-t-il l'heure pour certains fichiers mais seulement l'année pour d'autres ?

Trouver uniquement la destination du lien symbolique ?

Commande introuvable dans Zsh, mais trouvée dans Bash ?

Il ne reste plus d'espace sur l'appareil, mais la partition n'est qu'à moitié pleine et les inodes sont disponibles

Déplacer le fichier mais seulement s'il est fermé

Autoriser tous les utilisateurs à créer des fichiers dans un répertoire, mais seul le propriétaire peut supprimer