私のシェル機能がzshの既存のオートコンプリート機能を利用できるようにするにはどうすればよいですか?

私のシェル機能がzshの既存のオートコンプリート機能を利用できるようにするにはどうすればよいですか?

私は.zshrc入力時間を節約し、画面との統合を可能にするいくつかのシェル機能を定義しました。たとえば、

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

ただし、これらのシェル機能を使用すると、zshに組み込まれているコマンド補完機能を利用することはできません。 (SSHの場合、Known_hostsとssh_configに基づいてホスト名が自動的に完成します。)ラッパーを作成するコマンドに対して既存の完成メカニズムに接続するための好ましい方法は何ですか?

編集する:

以下の回答についてGilesに感謝します。 compdefを使用することはこれを行う方法のようですが、興味深いことに均一に動作しないようです。この場合、次の設定があります。

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

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

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

私のラッパー関数「m」の完了は期待どおりに機能しますが、私の関数「s」の完了は機能しません。 「タブ」をクリックすると、代わりにファイルのリストを提供してデフォルトのオートコンプリートに戻るようです。ホスト名を完成させようとしています。 SSH完了の処理方法に奇妙なことがありますか?つまり、追加の作業が必要であることを意味しますか?

答え1

コマンドがシステムに知られている他のコマンドであるかのように完了するように要求するには、次のcompdef my_command=known_command形式を使用できます。compdef

compdef s=ssh
compdef {cxterm,uxterm,xterm-color}=xterm

後ろからこれは基本的に_comps[s]=$_comps[ssh]

一部の完了コマンドは一連の機能に対して機能し、コマンドラインの最初の単語を読み取り、完了する特定のコマンドを決定します。たとえば、 commandsshなどscpの一部のコマンドはsftpすべて関数によって完了されます_ssh。この場合、完成関数に関数がどのような「サービス」であるかを知らせる必要があります(デフォルトでは、サービスは実行可能ファイル名であり、ここには関数名があります)。

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

関連情報