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将被附加在开头。

但这不是我问题的答案。

相关内容