Hủy hoàn thành, nhưng chỉ hoàn thành, trong zsh


13

Khi một chức năng hoàn thành mất nhiều thời gian, tôi có thể ngắt nó bằng cách nhấn Ctrl+ C(phím ngắt đầu cuối, gửi SIGINT) hoặc Ctrl+ G(bị ràng buộc send-break). Tôi sau đó còn lại với từ chưa hoàn thành.

Tuy nhiên, nếu tôi tình cờ nhấn Ctrl+ Choặc Ctrl+G khi chức năng hoàn thành kết thúc, nhấn phím của tôi có thể hủy dòng lệnh và cung cấp cho tôi lời nhắc mới thay vì hủy hoàn thành.

Làm cách nào tôi có thể thiết lập zsh để một khóa nhất định sẽ hủy hoàn thành đang diễn ra nhưng không làm gì nếu không có chức năng hoàn thành nào được kích hoạt?

Câu trả lời:


5

Đây là một giải pháp thiết lập trình xử lý SIGINT làm cho Ctrl+ Cchỉ bị gián đoạn khi hoàn thành được kích hoạt.

# 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

Tôi không biết liệu đây có phải là giải pháp chấp nhận được hay không, nhưng gửi SIGSTOP ( Ctrl+ S) dường như có hiệu quả mong muốn, với lợi ích bổ sung là bạn có thể khởi động lại tự động hoàn thành nếu bạn gửi SIGSTART ( Ctrl+ Q) trước khi nhập còn gì nữa không. Tôi không phải là một chuyên gia về kiểm soát công việc, vì vậy điều này có thể để lại một số lộn xộn bổ sung liên quan đến công việc đã dừng.


1
Ctrl + S và Ctrl + Q là các lệnh điều khiển luồng. Chúng chỉ ảnh hưởng đến đầu ra đến thiết bị đầu cuối, điều này không liên quan ở đây. Có thể dự đoán, Ctrl + S không có hiệu lực trong khi hoàn thành (zsh dù sao cũng vô hiệu hóa cài đặt đầu cuối, nó lấy tổ hợp phím). Nhấn Ctrl + Z (gửi SIGTOP) cũng không có tác dụng.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn! Tôi không hoàn toàn chắc chắn những gì đang diễn ra trong nền. Tất cả những gì tôi thấy là tôi đã kiểm soát thiết bị đầu cuối trở lại.
Aaron Okano
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.