Tamamlamayı iptal et, ancak yalnızca tamamlama, zsh olarak


13

Bir tamamlama fonksiyonu uzun bir süre alır, onu kesebilir basarak Ctrl+ C(terminal kesme anahtarı sigint gönderir) ya da Ctrl+ G(bağlanmış send-break). Daha sonra tamamlanmamış kelimeyle kaldım.

Ancak, tamamlama işlevi sona erdiğinde Ctrl+ Cveya Ctrl+ Gdüğmesine basarsam, tuşa basmam komut satırını iptal edebilir ve tamamlamayı iptal etmek yerine bana yeni bir istem verebilir.

Belirli bir anahtarın devam eden bir tamamlamayı iptal etmesi, ancak hiçbir tamamlama işlevi etkin değilse hiçbir şey yapmaması için zsh'yi nasıl ayarlayabilirim?

Yanıtlar:


5

SIGINT işleyicisini ayarlayan ve tamamlama etkin olduğunda yalnızca Ctrl+ Ckesme yapan bir çözüm .

# 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

Bunun kabul edilebilir bir çözüm olup olmadığını bilmiyorum, ancak bir SIGSTOP ( Ctrl+ S) göndermenin istenen etkiye sahip olduğu görülüyor, ayrıca bir SIGSTART ( Ctrl+ Q) göndermeden önce otomatik tamamlamayı yeniden başlatabileceğiniz ek fayda ile başka herhangi bir şey. Ben iş kontrolü konusunda uzman değilim, bu yüzden bu durdurulan iş ile ilgili bazı ek karışıklık bırakabilir.


1
Ctrl + S ve Ctrl + Q akış kontrol komutlarıdır. Sadece terminalle ilgili çıkışı etkilemezler, bu da burada önemsizdir. Tahmin edileceği gibi, Ctrl + S'nin tamamlanma sırasında bir etkisi yoktur (zsh, terminal ayarını yine de devre dışı bırakır, tuş kombinasyonunu tutar). Ctrl + Z (SIGTOP gönderen) 'e basmanın da bir etkisi yoktur.
Gilles 'SO- kötü olmayı bırak'

Teşekkürler! Arka planda neler olduğundan emin değildim. Tek gördüğüm terminalin kontrolünü geri almaktı.
Aaron Okano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.