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위의 방법을 포기했습니다 . 현재 해결 방법은 다음 두 줄을 내 항목에 추가하는 것입니다 .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 someHosttabtab하고 호스트를 선택한 다음 ssh으로 교체하여 mdb완료해야 합니다.mongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo

이것은 작동하지만 완벽하지는 않습니다. 내 질문의 첫 번째 줄에 표시된 두 줄을 통해 bash를 사용하는 것과 동일한 자동 완성 경험을 갖고 싶습니다. zsh와 4000개 이상의 호스트 이름을 사용하여 이를 어떻게 달성할 수 있습니까? 감사합니다!

답변1

내가 원하는 방식으로 정확하게 작동하는 솔루션을 찾았습니다. 다음 세 줄만 필요합니다 .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

관련 정보