
我已將我的 OS X Yosemite shell 更改為 Zsh 並配置了“oh my zsh”插件,最近我安裝了 proxychains-ng 來代理命令列工具,但我發現 zsh 補全不適用於 proxychains4 之後的命令,例如
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插件中找到了一種解決方案,這是從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將會被附加在開頭。
但這不是我問題的答案。