ยกเลิกการเสร็จสิ้น แต่เสร็จสมบูรณ์เท่านั้นใน zsh


13

เมื่อฟังก์ชั่นเสร็จสิ้นใช้เวลานานฉันสามารถขัดจังหวะโดยกดCtrl+ C(คีย์อินเตอร์รัปต์เทอร์มินัลส่ง SIGINT) หรือCtrl+ G(ผูกไว้กับsend-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) จะไม่มีผลใด ๆ
Gilles 'หยุดชั่วร้าย'

ขอบคุณ! ฉันไม่แน่ใจทั้งหมดว่าเกิดอะไรขึ้นในพื้นหลัง ทั้งหมดที่ฉันเห็นคือฉันได้รับการควบคุมอาคารด้านหลัง
Aaron Okano
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.