Osx

如何在 oh-my-zsh 中使用具有自動完成功能的別名?

  • September 18, 2018

我在 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

引用自:https://unix.stackexchange.com/questions/468719