Pencarian penyelesaian argumen seperti ikan di ZSH

8

Saya bermain-main dengan ikan dan memperhatikan perilaku praktis ini

Jika saya mengetik wget -<tab><tab><tab>, saya dimasukkan ke dalam menu interaktif. Namun, ketika saya mengetik, saya mencari deskripsi dari argumen itu sendiri. Saya mencoba ini di zsh, dan mengetik di menu ini sepertinya hanya membawa saya kembali ke prompt interaktif saya. Apakah ada cara untuk mencapai fungsi serupa di zsh?

ollien
sumber
Saya sudah ingin tahu bagaimana melakukan ini untuk waktu yang lama. Ketika datang ke penyelesaian kata kunci standar (bukan opsi) vim melakukannya dengan memungkinkan Anda untuk mengkonfigurasi penyelesaian untuk tetap fokus pada buffer garis, dengan cara itu, jika daftar penyelesaian terlalu panjang, Anda hanya melanjutkan mengetik dan daftar secara alami menyaring ke bawah. Tetapi zsh segera mengalihkan fokus ke widget pemilihan menu
the_velour_fog
Saya tidak mengerti perilaku yang Anda gambarkan. Apakah ini tentang mencari deskripsi opsi daripada nama opsi? Atau ini tentang cara menavigasi pilihan? Menu apa yang Anda maksud (zsh memiliki banyak pengaturan berbeda untuk penyelesaiannya)?
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Ya, Anda bisa menggunakannya untuk mencari deskripsi opsi, atau bahkan nama opsi itu sendiri. Menu yang saya maksudkan muncul ketika Anda mengetik perintah, tanda hubung, lalu tekan tab dua kali. Misalnya, mengetik ls -<tab><tab>memasukkan saya ke menu di mana saya dapat menggulir ke atas dan ke bawah berbagai opsi. Pada ikan, saya bisa mengetik, yang kemudian akan mencari opsi ini dan deskripsinya. Saya berharap untuk mencapai fungsi serupa di zsh.
ollien
Saya masih tidak yakin apa maksud Anda sebenarnya. Apakah ini interaktivitas yang Anda inginkan? yaitu mampu memilih dari daftar dengan panah dan opsi sorotan? Anda mengatakan In fish, I'm able to type, which will then search these options and their descriptions.Anda dapat "mencari opsi-opsi ini dan deskripsinya" di zsh. mis. ls --h<tab>mencari opsi yang dimulai dengan --hdan mencantumkan empat kecocokan.
Sparhawk
Lihatlah screenshot ini . Jika saya mengetik ls -size<tab>saya mendapatkan ls --block-size dan ls --size sebagai opsi di zsh. Namun, ikan merekomendasikan saya --size, --tabsize, -k, -S, --block-size, dan --human-readable. Saya berharap untuk mencapai fungsi serupa di zsh. Tidak hanya mencari nama-nama perintah, tetapi juga mencari deskripsi
ollien

Jawaban:

1

Saya pikir ini melakukan apa yang Anda inginkan:

  zmodload zsh/complist
  setopt menucomplete
  zstyle ':completion:*' menu select=0 search

Ini akan menyebabkan daftar muncul ketika Anda menekan tab, dan kemudian jika Anda terus mengetiknya akan mencari opsi yang tersedia, termasuk deskripsi, dengan pencarian tambahan.

Anda mungkin juga tertarik dengan konfigurasi yang sama, tetapi dengan pencarian interaktif daripada pencarian. Dalam hal ini saat Anda mengetik itu akan memfilter kelengkapan untuk hanya yang cocok dengan apa yang Anda ketik sejauh ini.

Thayne
sumber
Hmm ... jika saya mengetik wget -<tab>noini tidak menyaring daftar penyelesaian. Ini hanya terus mengetik 'tidak' ke terminal setelah --accept-regex=, yang merupakan opsi pertama dalam daftar penyelesaian.
ollien
1
ya, bukan itu yang terjadi pada saya. Tapi itu tidak benar-benar cocok dengan opsi pencarian, itu hanya melakukan pencarian tambahan melalui kemungkinan
Thayne
1

Coba letakkan ini di .zshrcfile Anda :

 # load module for list-style selection
 zmodload zsh/complist

 # use the module above for autocomplete selection
 zstyle ':completion:*' menu yes select

 # now we can define keybindings for complist module
 # you want to trigger search on autocomplete items
 # so we'll bind some key to trigger history-incremental-search-forward function
 bindkey -M menuselect '?' history-incremental-search-forward

Sekarang jika Anda mengetik wget -<tab>menu dengan pelengkapan otomatis muncul. Kami menentukan keybind untuk menu ini, jadi jika Anda menekan ?baris pencarian muncul di bagian atas penyelesaian:

davidsykora~%wget --referer
isearch: refe

Beberapa tips tambahan:

  • Anda juga dapat menentukan bindkey -M menuselect '/' history-incremental-search-backwarduntuk pencarian mundur
  • jika Anda menekan ?selama pencarian lagi, pilihan akan melompat ke hasil pencarian berikutnya. Gunakan /untuk melompat ke hasil sebelumnya
  • diperlukan banyak penyesuaian untuk membuatnya berfungsi seperti yang Anda inginkan, jadi lihatlah complist dokumentasi untuk menemukan fungsi dan opsi tambahan
  • bagi saya biasanya lebih cepat untuk menggunakan vi-insertfungsi daftar - itu memfilter penyelesaian berdasarkan apa yang Anda ketik.
David Sýkora
sumber