Buat ulang indeks lengkapi-otomatis (atau apa pun namanya) dan binari dalam $ PATH cache di zsh

75

Setelah menginstal perangkat lunak baru, terminal yang sudah dibuka dengan zsh tidak akan tahu tentang perintah baru dan tidak dapat menghasilkan pelengkapan otomatis untuk itu. Tampaknya membuka terminal baru memperbaiki masalah, tetapi bisakah indeks (atau apa pun namanya) dibangun kembali sehingga pelengkapan otomatis akan berfungsi pada terminal lama?

Saya mencoba compinittetapi itu tidak membantu. Juga, adakah cara yang tidak bergantung pada shell? Sangat menyenangkan memiliki cara untuk memverifikasi jawabannya juga (kecuali untuk menghapus sesuatu dan menginstalnya kembali).

Yang saya maksud adalah setelah mengetik beberapa karakter nama perintah, saya bisa menekan Tab, dan zshharus melakukan sisanya untuk menarik nama lengkap.

phhehehe
sumber
1
Ada dua jenis pelengkapan otomatis yang dapat Anda maksudkan ketika Anda mengatakan bahwa shell yang ada “tidak dapat menghasilkan pelengkapan otomatis untuk [perintah baru]”: “penyelesaian perintah” —mencoba untuk mendapatkan shell yang menyarankan nama perintah baru saat menyelesaikan di posisi perintah, dan “penyelesaian argumen” —mencoba untuk mendapatkan shell untuk menyarankan opsi / argumen untuk perintah baru setelah Anda mengetik namanya. Yang mana yang memberimu masalah?
Chris Johnsen
1
Pertanyaan bagus! Aku selalu menganggap itu tidak mungkin dilakukan, aku tidak berpikir untuk memeriksanya
Michael Mrozek
1
offtopic - orang-orang sangat berubah-ubah 4 orang disukai tetapi hanya 2 positif ... Saya merasa aneh betapa sedikit orang yang mendukung hal-hal.
xenoterracide
@ Chris Maksudku setelah mengetik beberapa karakter dari nama perintah dan tekan tab, zsh harus melakukan sisanya dan menarik nama lengkap.
phunehehe
@ xeno Saya perhatikan itu juga; cukup aneh untuk menyukai sesuatu tetapi tidak memperbaikinya
Michael Mrozek

Jawaban:

76

Untuk membangun kembali cache dari perintah yang dapat dieksekusi, gunakan rehashatau hash -rf.

Pastikan Anda belum menghapus hash_list_allopsi (ini menyebabkan akses disk semakin sedikit tetapi membuat pembaruan cache lebih jarang).

Jika Anda tidak ingin harus mengetikkan perintah, Anda dapat memberi tahu zsh untuk tidak mempercayai cache-nya saat menyelesaikan dengan memasukkan baris berikut di ~/.zshrc¹ Anda :

zstyle ":completion:*:commands" rehash 1

Ada biaya kinerja, tetapi dapat diabaikan pada pengaturan desktop biasa hari ini. (Bukan jika Anda $PATHmenggunakan NFS, atau sistem yang kekurangan RAM.)

The zstyleperintah itu sendiri didokumentasikan dalam zshmodulehalaman manual. Nilai-nilai gaya yang didokumentasikan dalam zshcompsysdan zshcompwidmanusia halaman, atau Anda dapat membaca sumber (di sini, dari _command_namesfungsi). Jika Anda menginginkan beberapa dokumentasi yang dapat dibaca ... jika Anda menemukannya, beri tahu saya!

¹ membutuhkan zsh≥4.3.3, terima kasih Chris Johnsen

Gilles
sumber
3
Salah satu mantera pengulangan harus mengaktifkan perintah-nama penyelesaian "perintah baru" di shell yang sebelumnya sepenuhnya hash. Pengaturan PATH (atau jalur) juga akan menyebabkan pengulangan; dengan demikian PATH="$PATH"juga akan melakukan pekerjaan. HASH_LIST_ALLditampilkan sebagai default dalam dokumentasi saya.
Chris Johnsen
Itulah jawabannya untuk saya.
BaiJiFeiLong
13

Jika Anda mengalami masalah dalam mendapatkan "penyelesaian argumen" yang berfungsi untuk perintah baru maka compinit mungkin adalah perintah yang Anda butuhkan, namun memiliki mekanisme caching yang mungkin menyebabkan masalah Anda.

Dokumentasi untuk versi saya (4.3.10) mengatakan bahwa compinit menggunakan "dump file" yang di-cache .zcompdump,, untuk menyimpan fungsi penyelesaian yang dikompilasi untuk mempercepat pemanggilan berikutnya. Itu hanya membatalkan file dump ketika melihat perubahan dalam jumlah file penyelesaian ( fpathelemen file yang dimulai dengan #compdef …atau #autoload …). Agaknya menginstal perangkat lunak baru akan mengubah jumlah file penyelesaian seperti itu (dengan asumsi bahwa itu juga menginstal file lengkapi-otomatis zsh di tempat yang tepat), jadi saya berharap dataran compinitberfungsi. Jika Anda berada dalam situasi di mana tidak berfungsi, Anda mungkin perlu mem-bypass atau membatalkan file dump secara manual.

Untuk melewati menggunakan file dump, gunakan compinit -D; ini hanya akan mempengaruhi shell saat ini.

Untuk membangun kembali file dump, hapus dan jalankan kembali compinit:

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

Ini akan memengaruhi shell saat ini, shell yang ada saat ini compinit, dan shell yang akan datang.

Chris Johnsen
sumber
Beberapa kerangka kerja zsh seperti zimmengizinkan penggunaan file dump per-host. Jika demikian, hapus juga $zcompdump_filebersama .zcompdump.
sebastian