Bagaimana cara mendapatkan fungsi shell saya untuk menggunakan pelengkapan otomatis yang ada di zsh?

10

Saya memiliki beberapa fungsi shell yang didefinisikan pada saya .zshrcyang menghemat mengetik dan memungkinkan integrasi dengan layar. Sebagai contoh:

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

Namun, ketika saya menggunakan fungsi-fungsi shell ini, saya tidak bisa memanfaatkan fitur penyelesaian perintah bawaan zsh. (Dalam hal SSH, secara otomatis melengkapi nama host berdasarkan known_hosts dan ssh_config). Apa cara yang disukai untuk menghubungkan ke mekanisme penyelesaian yang ada untuk perintah yang saya buat untuk pembungkus?

EDIT:

Terima kasih kepada Gilles untuk jawabannya di bawah ini. Menggunakan compdef tampaknya menjadi cara untuk melakukan ini, tetapi menariknya tampaknya tidak berfungsi secara seragam. Dalam hal ini, saya memiliki pengaturan berikut:

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

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

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

Penyelesaian untuk fungsi pembungkus saya 'm' berfungsi seperti yang diharapkan, namun penyelesaian untuk fungsi saya 'tidak berfungsi; daripada mencoba untuk menyelesaikan nama host, tampaknya kembali ke pelengkapan otomatis default dengan memberikan saya daftar file ketika saya menekan 'tab'. Apakah ada keanehan dalam cara penyelesaian SSH ditangani yang berarti saya perlu melakukan sesuatu lebih lanjut?

Murali Suriar
sumber

Jawaban:

9

Saya menggunakan fungsi berikut untuk mengatakan bahwa suatu fungsi atau alias atau skrip pembungkus (mis. s) Harus diselesaikan seperti perintah yang ada (misalnya ssh):

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

Beberapa perintah penyelesaian berlaku untuk sekelompok fungsi dan membaca kata pertama dari baris perintah untuk menentukan perintah tertentu yang harus diselesaikan. Sebagai contoh, perintah ssh, scp, sftpdan beberapa lagi semua selesai oleh fungsi _ssh. Dalam hal ini, Anda perlu memberi tahu fungsi penyelesaian yang "layanan" fungsi Anda seperti (secara default, layanan adalah nama yang dapat dieksekusi, di sini nama fungsi Anda).

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih - saya berasumsi compdef adalah apa yang ingin saya gunakan. Karena ketertarikan, apakah ada alasan Anda membuat variabel dan perubahan lokal, daripada merujuk $ 1 dan $ 2 dalam panggilan Anda ke compdef?
Murali Suriar
@Murali: Itu supaya saya bisa menulis sesuatu compdefas xterm cxterm uxterm xterm-color.
Gilles 'SO- stop being evil'
1
menarik - jadi saya telah mendefinisikan dua pembungkus, satu untuk 'pria' dan satu untuk 'ssh'. Menggunakan compdef, penyelesaian untuk pembungkus 'man' saya berfungsi, tetapi penyelesaian untuk pembungkus 'ssh' saya tidak. Apakah Anda pernah mengalami masalah seperti ini sebelumnya? Apakah ada hal lain yang harus saya aduk agar _ssh dapat bekerja dengan alias / pembungkus saya?
Murali Suriar