zsh tamamlama: belirli bir dizinden dosya adları alma


10

Tamam, biraz arka plan: Bir Mac kullanıyorum ve CLI'de mümkün olduğunca çok yapıyorum.

Özellikle, bir USB çubuğuna cpveya mvbir dosyaya sık sık giriyorum ve hemen çıkarmak (bağlantısını kesmek ve bağlantısını kesmek) istiyorum. Bu, genellikle (10.7'de) boş bir masaüstü alanına (genellikle en az iki boşluk uzaklıkta) gitmeyi, diski seçmeyi ve "command-e" tuşuna basmayı gerektiren bir kaç tuş vuruşu ile gerçekleştirilebilir. Açıkçası, bu sökülme prosedürü, birkaç büyüklük sırası ile, sürecin en zaman alıcı ve sıkıcı kısmıdır.

Sadece yazabilmek çok daha doğal ve verimli olurdu, örneğin:

ej<tab> J<tab>

USB çubuğumun / Volumes / Jefferson'a takıldığını söyle Benim 6 tuş vuruşlarından almak için beklediğim şudur:

eject /Volumes/Jefferson

Bu komut çalıştırılmalıdır:

diskutil unmount /Volumes/Jefferson

Bu yüzden hoş bir küçük fonksiyon yazdım:

eject() {
    diskutil unmount /Volumes/$1
}

Ve onunla gitmek için bir tamamlama işlevi:

compdef '_files -g "/Volumes/*"' eject  

Ancak bununla ilgili bir sorun var. _filesİşlevi tam yolları oluşturur. Şimdi, "çıkarma" işlevimdeki satırı değiştirebilirim diskutil unmount $1ve işler işe yarayacaktır, ancak yol / Volumes / ile başladığından, bağlama noktası adının ilk harfini yazma yeteneğim yok. Örneğin J<tab, yazarsam, PWD'deki dosyalar için otomatik tamamlama alırım. /Volumes/J<tab>İstenilen tamamlamayı elde etmek için yazmak zorundayım .

Peki, dosya yollarını tam yollar oluşturmak yerine önceden tanımlanmış, belirli bir konumdan alan bir tamamlama işlevi var mı?

Bunu gerçekten 6 tuşa kadar düşürmek istiyorum.

Yanıtlar:


12
_files -W /Volumes

Belgelerine bakın _path_files.


Mükemmel! Bunun inşa edilmesi gerektiğini biliyordum. Çok teşekkürler!
Marshall Eubanks

Peki, bu tamamlama işlevini otomatik olarak yüklemeyi nasıl alabilirim? Çizgiyi fpath'ımda bulunan compdefdosyaya koymayı denedim _eject. Bir otomatik yükleme hattı ile ve olmadan denedim. Tamamlama fonksiyonları ile ilgili birkaç kılavuza baktım ve kimse bunun gibi basit bir basit örneklemenin nasıl yapılacağını bilmiyordu ve örneklerinden herhangi birine dayanarak denediğim hiçbir şey işe yaramadı.
Marshall Eubanks

@marshaul Dosyanın #compdef ejectilk satırı, ardından gerçek kodu olması gerekir. Kılavuzdaki otomatik yüklenen dosyaların altına bakın . İlk önce satırı eklemediyseniz, önbelleği silmeniz ~/.zcompdumpve zsh'yi yeniden başlatmanız gerekebilir.
Gilles 'SO- kötü olmayı kes

AH! Silme ~/.zcompdumphile yaptı. Tekrar teşekkürler!
Marshall Eubanks
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.