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行目では、ssh
、scp
、sftp
、Host
などのコマンドを使用すると、すべてのホスト名を循環できます。この行でも同じことが達成できます。
_hosts() {compadd $(echo $HOSTNAMES | tr "\n" " ")}
したがって、このアプローチでは、最初にssh someHost
と入力する必要があります。tabtab、ホストを選択し、ssh
をmdb
に置き換えて、mongo -uadmin -pXXX --authenticationDatabase admin --Host someHostFoo
に完了します。
これは機能しますが、完全ではありません。私は、bashを使用したときと同じオートコンプリートのエクスペリエンスを持ちたいと思っています。これは、私の質問で最初に示した2行で実装されています。 zshと4000を超えるホスト名でこれを実現するにはどうすればよいですか?ありがとうございました!
思い通りに機能するソリューションを見つけました。 _.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
命令は、ssh
、scp
、sftp
、Host
などのコマンドを_$HOSTNAMES
_の配列で完了します。