2 番目のコマンドまたはエイリアスの後に Zsh が補完されますか?

2 番目のコマンドまたはエイリアスの後に Zsh が補完されますか?

OS X Yosemite シェルを Zsh に変更し、「oh my zsh」プラグインを設定しました。最近、プロキシコマンドラインツールに proxychains-ng をインストールしましたが、proxychains4 の後のコマンドでは zsh 補完が機能しないことがわかりました。

proxychains4 wget [hit tab], will not come up with wget's options
proxychains4 gi[tab], will not come up with "git"

また、zshはエイリアスの後のコマンドでも動作しません。

alias proxy="http_proxy=http://127.0.0.1:12345"
proxy brew[hit tab], will not come up with brew's subcommands

コマンドとそのオプションの補完はありません。何かアイデアはありますか? ありがとうございます。

答え1

デフォルトでは、zshは補完を行う前にエイリアスを展開します。設定によりこれが無効になっている可能性があります。明示的に設定を解除することで再度有効にすることができます。complete_aliasesオプション

unsetopt complete_aliases

のような外部コマンドの場合proxychains4、その引数自体がコマンドであり、その引数を補完することで宣言することができます。_precommand。これはドキュメントで簡単に見つけられるものではありませんが、nohupを実行することで、同様のコマンドの設定を確認することができますecho $_comps[nohup]。これは、「新しい」補完システムを使用したものです ( を実行した後compinit)。

compdef _precommand proxychains4

答え2

さて、私は「oh my zsh」の sudo プラグインから 1 つの解決策を見つけました。これは sudo プラグインから変更されたコードです。これを proxychains-ng-plugins.zsh と呼び、$ZSH_CUSTOM/plugins/proxychain-ng/ に配置し、~/.zshrc、plugins=() にロードし、次に source ~/.zshrc を実行します。

# ------------------------------------------------------------------------------
# Description
# -----------
#
# sudo will be inserted before the command
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Dongweiming <[email protected]>
#
# ------------------------------------------------------------------------------

proxychains-ng-command-line() {
[[ -z $BUFFER ]] && zle up-history
[[ $BUFFER != proxychains4\ * ]] && BUFFER="proxychains4 -q $BUFFER"
zle end-of-line
}
zle -N proxychains-ng-command-line
# Defined shortcut keys: [Esc] [Esc]
bindkey "\e^" proxychains-ng-command-line

最初にコマンドを入力し、次に ESC+CTRL を押すと、proxychains4 が先頭に追加されます。

しかし、これは私の質問に対する答えではありません。

関連情報