Zsh-Vervollständigung beim zweiten Befehl oder nach einem Alias?

Zsh-Vervollständigung beim zweiten Befehl oder nach einem Alias?

Ich habe meine OS X Yosemite-Shell auf Zsh geändert und mit "oh my zsh"-Plugins konfiguriert. Vor kurzem habe ich proxychains-ng als Proxy-Befehlszeilentools installiert, aber ich habe festgestellt, dass die Zsh-Vervollständigung für den Befehl nach proxychains4 nicht funktioniert, wie

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

Und zsh funktioniert auch nicht auf Befehl nach Alias,

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

Es wird keine Vervollständigungen für den Befehl und seine Option geben. Irgendeine Idee? Danke.

Antwort1

Standardmäßig erweitert zsh den Alias, bevor es die Vervollständigung durchführt. Es ist möglich, dass Ihre Konfiguration dies deaktiviert. Sie können es explizit wieder aktivieren, indem Sie diecomplete_aliasesMöglichkeit.

unsetopt complete_aliases

Für einen externen Befehl wie proxychains4können Sie deklarieren, dass seine Argumente selbst ein Befehl sind und seine Argumente, indem Sie seine Vervollständigung_precommand. Dies ist in der Dokumentation nicht leicht zu finden, aber Sie können die Konfiguration für ähnliche Befehle beobachten, indem Sie beispielsweise nohupausführen echo $_comps[nohup]. Dies geschieht mit dem „neuen“ Vervollständigungssystem (nach dem Ausführen von compinit).

compdef _precommand proxychains4

Antwort2

nun, ich habe eine Lösung im Sudo-Plugin von „oh my zsh“ gefunden, hier ist der vom Sudo-Plugin geänderte Code, ich nenne ihn proxychains-ng-plugins.zsh, platziere ihn in $ZSH_CUSTOM/plugins/proxychain-ng/ und lade ihn nach ~/.zshrc, plugins=(), dann Quelle ~/.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

Geben Sie also zuerst einen Befehl ein und drücken Sie dann ESC+STRG. Proxychains4 wird am Anfang angehängt.

aber das ist nicht die Antwort auf meine Frage.

verwandte Informationen