如何追加/扩展 zshell 补全?

如何追加/扩展 zshell 补全?

我将 zsh 与 oh-my-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

但是,如果我将上述命令添加到我的文件中,则在 file 中定义的~/.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)使用zstyles.优点是您可以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

相关内容