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는 터미널 설정을 비활성화하고 키 조합을 가져옵니다). SIGTOP을 보내는 Ctrl + Z를 눌러도 아무 효과가 없습니다.
Gilles 'SO- 악마 그만'

감사! 나는 배경에서 무슨 일이 일어나고 있는지 완전히 확신하지 못했습니다. 내가 본 것은 터미널을 다시 제어 할 수 있다는 것입니다.
Aaron Okano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.