Kabuk işlevlerimi zsh'ta var olan otomatik tamamlamayı kullanmak için nasıl edinebilirim?


10

.zshrcYazarken kaydettiğim ve ekranla entegrasyona izin veren benim tanımlanmış kabuk işlevlerim var . Örneğin:

function s()
{
     screen -t "$1" ssh "$@"
}

Ancak, bu kabuk işlevlerini kullandığımda, zsh'ın yerleşik komut tamamlama özelliklerinden yararlanamıyorum. (SSH söz konusu olduğunda, bilinen_anahtarlar ve ssh_config'ye dayalı olarak ana bilgisayar adlarını otomatik olarak tamamlama). Paketleyicileri oluşturduğum komutlar için mevcut tamamlama mekanizmalarına bağlanmanın tercih edilen yolu nedir?

DÜZENLE:

Gilles'e aşağıdaki cevabı için teşekkürler. Compdef kullanmak bunu yapmanın bir yolu gibi gözüküyor, ancak ilginç bir şekilde düzgün çalışmıyor gibi görünüyor. Bu durumda, aşağıdaki kuruluma sahibim:

function s()
{
    screen -t "$1" ssh "$@"
}

function m()
{
    screen -t "man.$1" man "$1"
}

compdef $_comps[man] m
compdef $_comps[ssh] s

Sarıcı işlevim 'm' için tamamlama beklendiği gibi çalışıyor ancak işlevim 's' için tamamlama çalışmıyor; ana bilgisayar adlarını tamamlamaya çalışmak yerine, 'sekme' tuşuna bastığımda bana bir dosya listesi vererek varsayılan otomatik tamamlamaya geri dönüyor gibi görünüyor. SSH tamamlamasının ele alınmasında bazı tuhaflıklar var mı, bu da başka bir şey yapmam gerektiği anlamına mı geliyor?

Yanıtlar:


9

Bir işlev veya diğer ad veya sarıcı komut dosyası (örn. s) Varolan bir komut gibi (örneğin ssh) tamamlanması gerektiğini söylemek için aşağıdaki işlevi kullanın :

compdefas () {
  local a
  a="$1"
  shift
  compdef "$_comps[$a]" "${(@)*}=$a"
}
compdefas xterm cxterm uxterm xterm-color

Bazı tamamlama komutları bir işlev ailesine uygulanır ve hangi komutun tamamlanacağını belirlemek için komut satırının ilk sözcüğünü okuyun. Örneğin, komutlar ssh, scp, sftpve birkaç tüm işlev tarafından tamamlanır _ssh. Bu durumda, tamamlama işlevine işlevinizin hangi "hizmetine" benzediğini söylemeniz gerekir (varsayılan olarak hizmet yürütülebilir addır, burada işlevinizin adıdır).

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s

Teşekkürler - Ben kullanmak istediğim şey compdef olduğunu varsaydı. İlgilenmemek için, compdef çağrınızda $ 1 ve $ 2 değerine başvurmak yerine yerel bir değişken ve vardiya oluşturmanın herhangi bir nedeni var mı?
Murali Suriar

@Murali: İşte böyle bir şey yazabiliyorum compdefas xterm cxterm uxterm xterm-color.
Gilles 'SO- kötü olmayı bırak'

1
ilginç - bu yüzden biri 'adam' ve diğeri 'ssh' için olmak üzere iki paketleyici tanımladım. Compdef kullanarak, 'adam' sarmalayıcının tamamlanması işe yarar, ancak 'ssh' sarmalayıcının tamamlanması işe yaramaz. Daha önce böyle bir sorunla karşılaştınız mı? _Ssh'ın takma adım / paketleyicimle çalışabilmesi için dürtmem gereken başka bir şey var mı?
Murali Suriar
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.