私はMacOS El Capitanでzshを使用しています。エイリアスを解決するためにオートコンプリートをパラメータ化する方法を知りたいです。 Bashを使用するときは、.bash_profile
次のものが含まれます。
alias mdb "mongo -uadmin -pXXX --authenticationDatabase admin --host "
complete -W "$HOSTNAMES" mdb
HOSTNAMES
4000以上のFQDNのリスト。これにより、mdb someHost
tabtabで始まるすべてのホストのリストを入力して表示できますsomeHost
。正しいホストが選択されると、コマンドは完了します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
読むcompctl
使用されなくなったため、人々はコマンドの完成機能をよりよく書く必要があります。私はこれを考えましたが、これは含まれているホスト名がほとんどない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
上記の方法を放棄しました。現在の回避策は、次の2行を自分のアイテムに追加することです.zshrc
。
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
これはうまくいきますが、完璧ではありません。私の質問の最初の行に示されている2行を通してbashを使用するのと同じオートコンプリート体験をしたいと思います。 zshと4000以上のホスト名を使用してこれを達成するにはどうすればよいですか?ありがとうございます!
ベストアンサー1
私が望む方法で正確に動作するソリューションを見つけました。次の3行だけが必要です.zshrc
。
mdb() {mongo -uadmin -pXXX --authenticationDatabase admin --host "$@"}
compctl -k "($(echo $HOSTNAMES))" mdb
zstyle ':completion:*:(ssh|scp|sftp|host):*' hosts $(echo $HOSTNAMES)
この関数はmdb()
前のエイリアスを置き換えますmdb
。このコマンドcompctl
で完成する機能は、、などのコマンドを完成する配列mdb
と似ています。$HOSTNAMES
zstyle
ssh
scp
sftp
host
$HOSTNAMES