Zsh 在第二個指令上或在別名之後完成?

Zsh 在第二個指令上或在別名之後完成?

我已將我的 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將會被附加在開頭。

但這不是我問題的答案。

相關內容