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 hostszstyleは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

関連情報