GNU/Linux >> Znalost Linux >  >> Linux

Zrušit dokončení, ale pouze dokončení, v Zsh?

Když funkce dokončení trvá dlouho, mohu ji přerušit stisknutím Ctrl +C (klávesa přerušení terminálu, odesílá SIGINT) nebo Ctrl +G (vázáno na send-break ). Pak mi zůstane nedokončené slovo.

Pokud však náhodou stisknu Ctrl +C nebo Ctrl +G právě po dokončení funkce dokončení může moje stisknutí klávesy zrušit příkazový řádek a místo zrušení dokončení mi zobrazí novou výzvu.

Jak mohu nastavit zsh tak, aby určitá klávesa zrušila probíhající dokončení, ale nedělala nic, pokud není aktivní žádná funkce dokončení?

Přijatá odpověď:

Zde je řešení, které nastaví obsluhu SIGINT, která vytvoří Ctrl +C přerušit pouze tehdy, když je aktivní dokončení.

# 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} A Zsh?

  2. Jak získat datový typ proměnných v Zsh?

  3. Zsh:Nastavit Term=screen-256color v Tmux, ale Xterm-256color bez Tmux?

  1. Najít pouze cíl Symlinku?

  2. Příkaz nebyl nalezen v Zsh, ale nalezen v Bash?

  3. Zobrazit na obrazovce pouze Stderr, ale zapsat do souboru Stdout i Stderr?

  1. Na zařízení nezbývá místo, ale oddíl je zaplněn pouze z poloviny a jsou k dispozici inody

  2. Přesunout soubor, ale pouze pokud je zavřený

  3. Proč existují `/lib` a `/lib64`, ale pouze `/bin`?