GNU/Linux >> Belajar Linux >  >> Linux

Batalkan Penyelesaian, Tapi Hanya Penyelesaian, Di Zsh?

Ketika fungsi penyelesaian membutuhkan waktu lama, saya dapat menginterupsinya dengan menekan Ctrl +C (kunci interupsi terminal, mengirim SIGINT) atau Ctrl +G (terikat ke send-break ). Saya kemudian ditinggalkan dengan kata yang belum selesai.

Namun, jika saya menekan Ctrl +C atau Ctrl +G saat fungsi penyelesaian selesai, penekanan tombol saya dapat membatalkan baris perintah dan memberi saya prompt baru alih-alih membatalkan penyelesaian.

Bagaimana cara mengatur zsh sehingga kunci tertentu akan membatalkan penyelesaian yang sedang berlangsung tetapi tidak melakukan apa-apa jika tidak ada fungsi penyelesaian yang aktif?

Jawaban yang Diterima:

Berikut adalah solusi yang menyiapkan penangan SIGINT yang membuat Ctrl +C hanya interupsi saat penyelesaian aktif.

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

Linux
  1. Facl Mengabaikan Izin "x" Tapi Hanya Pada File?

  2. Pelengkapan Otomatis Zsh Dinamis Untuk Perintah Kustom?

  3. Tidak ada ruang tersisa di perangkat, tetapi partisi hanya setengah penuh dan inode tersedia

  1. Terminal mana yang lebih baik:Bash vs Zsh

  2. Pindahkan file tetapi hanya jika sudah ditutup

  3. Mengapa ada `/lib` dan `/lib64` tetapi hanya `/bin`?

  1. Jalur Shebang Independen?

  2. ${!foo} Dan Zsh?

  3. Tutorial Penyelesaian Bash yang Mudah??