zshで完了をキャンセルするが、完了のみ


13

完了関数に時間がかかる場合は、+ (端末割り込みキー、SIGINTを送信)または+ (にバインド)を押して中断できます。その後、未完成の単語が残ります。CtrlCCtrlGsend-break

ただし、完了機能が終了するときにCtrl+ CまたはCtrl+をG押すと、キーを押すとコマンドラインがキャンセルされ、完了をキャンセルする代わりに新しいプロンプトが表示される場合があります。

特定のキーが進行中の完了をキャンセルするようにzshを設定できますが、完了機能がアクティブでない場合は何もしませんか?

回答:


5

ここではSIGINTハンドラアップセットが行うことソリューションですCtrl+はC完成がアクティブなときだけ割り込みが。

# 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
}

0

これが受け入れ可能な解決であるかどうかが、SIGSTOP(送信かどうかは知りませんCtrl+するS)あなたはSIGSTART(送信した場合、あなたが再びオートコンプリートを起動できるという付加的な利点と、所望の効果を持っているようだCtrl+をQ入力する前に)他に何か。しかし、私はジョブ制御の専門家ではないため、停止したジョブに関連する追加の混乱が残る可能性があります。


1
Ctrl + SおよびCtrl + Qはフロー制御コマンドです。これらはターミナルへの出力にのみ影響しますが、ここでは関係ありません。予想通り、完了時にCtrl + Sは効果がありません(zshはとにかく端末設定を無効にし、キーの組み合わせを取得します)。Ctrl + Z(SIGTOPを送信)を押しても効果はありません。
ジル「SO-悪であるのをやめる」

ありがとう!バックグラウンドで何が起こっているのか完全にはわかりませんでした。私が見たのは、端末の制御を取り戻したことだけでした。
アーロン岡野
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.