如何在 oh-my-zsh 中使用具有自動完成功能的別名?
我在 MacOS El Capitan 上使用 zsh。我想知道如何必須參數化自動完成以解析別名。當我使用 bash 時,我
.bash_profile
包含以下內容:alias mdb "mongo -uadmin -pXXX --authenticationDatabase admin --host " complete -W "$HOSTNAMES" mdb
HOSTNAMES
是超過 4000 個 FQDN 的列表。這樣做我可以鍵入mdb someHost``tab``tab
以查看所有主機以 . 開頭的列表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``tab``tab``$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
:zstyle ':completion:*' completer _expand_alias _complete _ignored zstyle ':completion:*:(ssh|scp|sftp|host):*' hosts $HOSTNAMES
第一行也是擴展別名,這裡是我的別名
mdb
。第二行允許在使用 、 或 或 之類的命令時循環遍歷
ssh
所有主機scp
名。這條線也可以達到同樣的效果:sftp``host
_hosts() {compadd $(echo $HOSTNAMES | tr "\n" " ")}
因此,使用這種方法,我必須先鍵入
ssh someHost``tab``tab
,選擇主機,然後替換ssh
為,mdb
這樣才能完成mongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo
這有效,但並不完美。我希望擁有與使用 bash 相同的自動完成體驗,由我的問題中的第一行顯示的兩行實現。如何使用 zsh 和 4000 多個主機名來實現這一點?謝謝!
我找到了一個完全符合我要求的解決方案。中只需要以下三行
.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