Apakah mungkin untuk menggunakan perilaku pemilihan menu zsh yang berbeda untuk perintah yang berbeda?

13

Saya menggunakan menu selectperilaku dalam zsh, yang memanggil menu di bawah kursor di mana Anda dapat melihat berbagai kemungkinan. Opsi .zshrc yang telah saya atur untuk ini

zstyle ':completion:*' menu select=2

Secara default, menekan Returnuntuk memilih kemungkinan di menu ini hanya melengkapi kata - kata itu sebenarnya tidak mengirim perintah. Sebagai contoh, saya mungkin mendapatkan menu seperti ini

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

Menekan di Returnsini akan menghasilkan

~ % cd Desktop/

Saya kemudian harus menekan Returnsebuah kedua waktu untuk benar-benar mengirim perintah.

Saya dapat memodifikasi perilaku ini untuk membuatnya sehingga menekan Returnkeduanya memilih penyelesaian dan mengirimkan perintah dengan melakukan ini

bindkey -M menuselect '^M' .accept-line

Namun, ada masalah dengan ini: kadang-kadang saya perlu menyelesaikan file atau direktori tanpa mengirim perintah. Sebagai contoh, saya mungkin perlu melakukan ln -s Desktop Desktop2- dengan bindkeyperilaku ini , mencoba menyelesaikan Desktop akan menghasilkan ln -s Desktop/dikirim sebagai perintah, dan jelas saya tidak menginginkan itu.

Saya sadar bahwa hanya dengan menekan ruang akan membiarkan saya melanjutkan perintah, tetapi sekarang kebiasaan.
Mengingat ini, apakah ada cara untuk membuatnya sehingga hanya beberapa perintah yang memungkinkan Anda menekan Returnsatu kali (seperti cd), tetapi semua perintah lain mengharuskan Anda menekannya dua kali?

Kine
sumber
Jika .zshrcfile tidak memungkinkan Anda untuk melakukannya maka jawabannya hanya akan menjadi tidak, kecuali jika Anda menyesuaikan sendiri kode sumber untuk mendukung perilaku berbasis perintah. Tapi kemudian Anda masih harus menentukan untuk perintah mana melakukan ini, yang dengan sendirinya jauh lebih membosankan daripada hanya menekan masuk tambahan ...
Tamara Wijsman

Jawaban:

3

Jika Anda benar-benar membutuhkan ini, secara teoritis Anda dapat mengatur fungsi yang memeriksa perintah yang Anda jalankan, dan menyelesaikan atau mengirim baris.

Coba sesuatu seperti ini (belum diuji):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

Sumber: menggunakan perintah khusus dari .inputrc lama di zsh?

balkian
sumber
0

Secara teknis tidak mungkin seperti yang Anda tanyakan. Tidak tahu apakah ada jalan keluar lain

Aexyn
sumber