zshell 완성을 추가/확장하는 방법은 무엇입니까?

zshell 완성을 추가/확장하는 방법은 무엇입니까?

oh-my-zsh와 함께 zsh를 사용합니다. 불행하게도 oh-my-zsh는 파일을 사용하여 ~/.ssh/config호스트 이름을 자동 완성하지 않습니다(참조:이슈 #1009, 예를 들어).

이는 다음 코드를 사용하여 쉽게 보관할 수 있습니다.

[ -r ~/.ssh/config ] && _ssh_config=($(cat ~/.ssh/config | sed -ne 's/Host[=\t ]//p')) || _ssh_config=()
zstyle ':completion:*:hosts' hosts $_ssh_config

그러나 위 명령을 파일에 추가하면 ~/.zshrc파일(예:)에 정의된 다른 모든 호스트 이름 소스를 덮어쓰게 됩니다.~/.ssh/known_hosts~/.oh-my-zsh/lib/completion.zsh

내가 어떻게 할 수있는추가의내 파일 ':completion:*:hosts'에 새로운 완성 규칙이 있나요 ?~/.zshrc

답변1

기존 프로젝트를 검색하고 프로젝트를 추가해야 한다고 생각합니다.

zstyle -s ':completion:*:hosts' hosts _ssh_config
[[ -r ~/.ssh/config ]] && _ssh_config+=($(cat ~/.ssh/config | sed -ne 's/Host[=\t ]//p'))
zstyle ':completion:*:hosts' hosts $_ssh_config

답변2

또 다른 옵션은 재정의하는 것입니다.주인명령(기본적으로 getent hosts) zstyle은 s를 사용합니다. 장점은 ssh이 작업을 수행하고 이를 동적으로 만들 수 있다는 것입니다(시스템 완료 캐싱 제외).

zstyle ':completion::complete:ssh*:*:hosts' command '
  getent hosts; sed -n "s/^Host[=[:blank:]]*/ignored /p" ~/.ssh/config'

답변3

가장 좋은 옵션은 zsh의 기본값을 사용하는 것 같습니다.

oh-my-zsh에 대한 내 풀 요청을 참조하세요.https://github.com/robbyrussell/oh-my-zsh/pull/1498

답변4

oh-my-zsh를 더 잘 작성되고 유지 관리되는 버전으로 교체할 수 있습니다.https://github.com/sorin-ionescu/prezto기본 zsh 완성과 이 외부 모듈을 사용합니다.https://github.com/zsh-users/zsh-completions

관련 정보