我将 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
)使用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