Otomatik tamamlama dizini (veya ne denirse) yeniden oluşturun ve zsh içindeki $ PATH önbelleğindeki ikili dosyalar


75

Yeni bir yazılım yükledikten sonra, zsh ile önceden açılmış bir terminal yeni komutları bilmeyecek ve bunlar için otomatik tamamlama işlemini oluşturamaz. Görünüşe göre yeni bir terminal açmak sorunu çözdü, ancak otomatik tamamlama eski terminalde çalışacak şekilde indeks (veya ne diyorsanız) yeniden inşa edilebilir mi?

Denedim compinitama bu işe yaramadı. Ayrıca, kabuk bağımlı olmayan bir yolu var mı? Cevabı doğrulamanın bir yolunu bulmak da güzel (bir şeyi kaldırıp yeniden yüklemek dışında).

Demek istediğim, bir komutun isminin birkaç karakterini yazdıktan sonra, tuşuna basabilirim Tabve zshtam adı almak için gerisini yapmalıyım.


1
Var olan bir kabuğun “[yeni komutlar] için otomatik tamamlama üretemediğini” söylediğinizde, “komut tamamlama” derken, kabuğun yeni komutun adını tamamlamasını sağlamaya çalışarak iki otomatik tamamlama türü vardır. komut pozisyonunda ve “argüman tamamlama” - daha önce ismini girdikten sonra yeni komut için seçenekler / argümanlar önerme kabiliyeti almaya çalışıyorum. Hangisi sana problem veriyor?
Chris Johnsen

1
İyi soru! Her zaman yapamayacağımı varsaydım, kontrol etmeyi düşünmedim
Michael Mrozek

1
offtopic - insanlar çok kararsız 4 kişinin favorisi var, ancak sadece 2 oy verdim ... İnsanların kaç kişiyi ne kadar ıskaladığını garip buluyorum.
xenoterracide

@Chris Bir komutun isminin birkaç karakterini yazdıktan sonra ve tab tuşuna basın, zsh gerisini bırakmalı ve tam adı yukarı çekmelidir.
phunehehe

@ xeno Bunu da farkettim; bir şeyleri sevmek oldukça sıradışı ama onu abartmadan
Michael

Yanıtlar:


76

Yürütülebilir komutların önbelleğini yeniden oluşturmak için rehashveya tuşunu kullanın hash -rf.

hash_list_allSeçeneği ayarlamadığınızdan emin olun (bu, daha az disk erişimine neden olur, ancak önbellek güncellemesini daha az yapar).

Bir komut yazmak istemiyorsanız, aşağıdaki satırı following içine koyarak zsh'ye önbelleğine güvenmemesini söyleyebilirsiniz ~/.zshrc:

zstyle ":completion:*:commands" rehash 1

Performans maliyeti var, ancak bugün tipik bir masaüstü ortamında ihmal edilebilir. ( $PATHNFS'de veya RAM tabanlı bir sistemde yoksa değil .)

zstyleKomut kendisi belgelenmiştir zshmoduleadam sayfası. Stil değerleri zshcompsysve zshcompwidman sayfalarında belgelenmiştir veya kaynağı (burada, _command_namesişlevin) okuyabilirsiniz . Bazı okunaklı belgeler istiyorsanız… bazılarını bulursanız, bana bildirin!

¹ zsh≥4.3.3, teşekkürler gerektirir Chris Johnsen


3
Her iki rehash teşvik, daha önce tam olarak toplanmış olan kabuklarda “yeni komutların” komut adının tamamlanmasını sağlamalıdır. PATH (veya yol) ayarı da yeniden teneffüs edilmesine neden olacaktır; böylece PATH="$PATH"işi de yapardı. HASH_LIST_ALLbelgelerimde varsayılan olarak gösterilir.
Chris Johnsen

Benim için cevap bu.
BaiJiFeiLong

13

Yeni komutlar için çalışarak “argüman tamamlama” konusunda sorun yaşıyorsanız compinit muhtemelen ihtiyacınız olan komuttur, ancak soruna neden olabilecek bir önbellekleme mekanizması vardır.

Versiyonumun (4.3.10) belgelerine göre compinit , .zcompdumpsonraki çağrıları hızlandırmak için derlenmiş tamamlama fonksiyonlarını saklamak için önbelleğe alınmış bir “döküm dosyası” kullandığını söylüyor . Döküm dosyasını yalnızca tamamlama dosyalarının sayısında bir değişiklik fark ettiğinde ( veya fpathile başlayan öğe dosyaları ) geçersiz kılar . Büyük olasılıkla yeni bir yazılım yüklemek, bu tür tamamlama dosyalarının sayısını değiştirir ( zsh otomatik tamamlama dosyalarını doğru yere de yüklediğini varsayarsak ), bu nedenle düz bir çalışma beklerdim . İşe yaramadığı bir durumdaysanız, döküm dosyasını atlamanız veya el ile geçersiz kılmanız gerekebilir.#compdef …#autoload …compinit

Döküm dosyasını kullanmayı atlamak için compinit -D; bu sadece geçerli kabuğu etkileyecektir.

Dökümü dosyasını yeniden oluşturmak için kaldırın ve yeniden çalıştırın compinit:

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

Bu, mevcut kabuğu, düz çalışan mevcut kabukları compinitve gelecekteki kabukları etkileyecektir .


Gibi bazı zsh çerçeveleri zimsunucu başına döküm dosyalarının kullanılmasına izin verir. Bu durumda, $zcompdump_filebirlikte de kaldırın .zcompdump.
sebastian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.