web-dev-qa-db-ja.com

oh-my-zshでオートコンプリートでエイリアスを使用する方法は?

MacOS ElCapitanでzshを使用しています。エイリアスを解決するために、オートコンプリートをどのようにパラメータ化する必要があるのか​​疑問に思っています。 bashを使用したとき、.bash_profileには次のものが含まれていました。

alias mdb "mongo -uadmin -pXXX --authenticationDatabase admin --Host "
complete -W "$HOSTNAMES" mdb

HOSTNAMESは、4000を超えるFQDNのリストです。そうすることで、mdb someHostと入力できますtabtabsomeHostで始まるすべてのホストのリストを表示します。適切なホストを選択すると、コマンドはmongo -uadmin -pXXX --authenticationDatabase admin --Host someHostFooまで完了します。

今はoh-my-zshを使いたいので、上記の行を.zshrcファイルにコピーしました。ただし、ホスト名リストがラウンドアバウトの約1500エントリを超えると、オートコンプリートは非常に遅くなります。そのため、complete -W "$HOSTNAMES" mdbファイルでcompctl -c "$HOSTNAMES" mdb.zshrcに置き換えました。ただし、setopt complete_aliases.zshrcを設定しても、これは機能しません。今日私は readcompctlが非推奨になっているので、コマンドの完了関数をより適切に作成する必要があります。私はこれを思いついたが、これはmdb hostsと入力した後にのみホスト名を提案するだろうtabtab$HOSTNAMESに含まれるホスト名が非常に少ない場合:

#compdef mongo mdb
#autoload


_mongo_hosts(){
  mhosts=$HOSTNAMES
}

local -a _1st_arguments
_1st_arguments=(
  "--Host:host to be connected to"
)

local expl
local -a mhosts

if (( CURRENT == 2 )); then
  _describe -t commands "mongo subcommand" _1st_arguments
  return
fi

case "$words[2]" in
    hosts)
      _mongo_hosts
      _wanted mhosts expl 'known hosts' compadd -a mhosts ;;
esac

さらに、このアプローチでは、mdbはまだmongo -uadmin -pXXX --authenticationDatabase admin --Hostに置き換えられていません。

フォローアップ

上に示したcompdefアプローチを破棄しました。現在の回避策は、.zshrcに次の2行を追加することです。

zstyle ':completion:*' completer _expand_alias _complete _ignored
zstyle ':completion:*:(ssh|scp|sftp|Host):*' hosts $HOSTNAMES

最初の行はエイリアスも展開することです。ここでは私のエイリアスmdbです。

2行目では、sshscpsftpHostなどのコマンドを使用すると、すべてのホスト名を循環できます。この行でも同じことが達成できます。

_hosts() {compadd $(echo $HOSTNAMES | tr "\n" " ")}

したがって、このアプローチでは、最初にssh someHostと入力する必要があります。tabtab、ホストを選択し、sshmdbに置き換えて、mongo -uadmin -pXXX --authenticationDatabase admin --Host someHostFooに完了します。

これは機能しますが、完全ではありません。私は、bashを使用したときと同じオートコンプリートのエクスペリエンスを持ちたいと思っています。これは、私の質問で最初に示した2行で実装されています。 zshと4000を超えるホスト名でこれを実現するにはどうすればよいですか?ありがとうございました!

1
Kay

思い通りに機能するソリューションを見つけました。 _.zshrc_には次の3行のみが必要です。

_mdb() {mongo -uadmin -pXXX --authenticationDatabase admin --Host "$@"}
compctl -k "($(echo $HOSTNAMES))" mdb
zstyle ':completion:*:(ssh|scp|sftp|Host):*' hosts $(echo $HOSTNAMES)
_

関数mdb()は、以前のエイリアスmdbを置き換えます。 compctlコマンドは、_$HOSTNAMES_の配列を使用してmdbのような関数を完了します。 zstyle命令は、sshscpsftpHostなどのコマンドを_$HOSTNAMES_の配列で完了します。

1
Kay