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

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

私はMacOS El Capitanでzshを使用しています。エイリアスを解決するためにオートコンプリートをパラメータ化する方法を知りたいです。 Bashを使用するときは、.bash_profile次のものが含まれます。

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

HOSTNAMES4000以上のFQDNのリスト。これにより、mdb someHosttabtabで始まるすべてのホストのリストを入力して表示できますsomeHost。正しいホストが選択されると、コマンドは完了しますmongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo

これで oh-my-zsh を使いたいので、上記の行を.zshrcファイルにコピーします。ただし、ホスト名のリストが約1500項目を超えると、オートコンプリート機能非常に遅い。だからファイルをcomplete -W "$HOSTNAMES" mdb。しかし今日はそうだろう。compctl -c "$HOSTNAMES" mdb.zshrcsetopt complete_aliases.zshrc読むcompctl使用されなくなったため、人々はコマンドの完成機能をよりよく書く必要があります。私はこれを考えましたが、これは含まれているホスト名がほとんどないmdb hoststabtabときに入力した後にのみホスト名を提案します。$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 someHosttabtabホストを選択してから置き換えsshmdb完了する必要があります。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と似ています。$HOSTNAMESzstylesshscpsftphost$HOSTNAMES

おすすめ記事