¿Finalización de Zsh en el segundo comando o después de un alias?

¿Finalización de Zsh en el segundo comando o después de un alias?

Cambié mi shell de OS X Yosemite a Zsh y lo configuré con complementos "oh my zsh". Recientemente instalé proxychains-ng en herramientas de línea de comando proxy, pero descubrí que la finalización de zsh no funciona en el comando después de proxychains4, como

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

Y zsh tampoco funciona con el comando después del alias,

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

no habrá finalizaciones para el comando y su opción. ¿Alguna idea? gracias.

Respuesta1

De forma predeterminada, zsh expande el alias antes de completarlo. Es posible que su configuración deshabilite esto; puedes volver a habilitarlo explícitamente desarmando elcomplete_aliasesopción.

unsetopt complete_aliases

Para un comando externo como proxychains4, puede declarar que sus argumentos son en sí mismos un comando y sus argumentos al completarlo._precommand. Esto no es fácil de encontrar en la documentación, pero puede observar la configuración de comandos similares, como nohupejecutar echo $_comps[nohup]. Esto es con el “nuevo” sistema de finalización (después de ejecutar compinit).

compdef _precommand proxychains4

Respuesta2

bueno, encontré una solución del complemento sudo de "oh my zsh", aquí está el código modificado del complemento sudo, lo llamo proxychains-ng-plugins.zsh, colóquelo en $ZSH_CUSTOM/plugins/proxychain-ng/, y cárguelo en ~/.zshrc, plugins=(), luego fuente ~/.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

así que primero escriba un comando, luego presione ESC+CTRL, proxychains4 se agregará al principio.

pero esta no es la respuesta a mi pregunta.

información relacionada