O autocompletar de Zsh é interrompido quando eu adiciono um wrapper a um comando

1

Por exemplo, eu tenho um teste app executável

#!/bin/bash
case $1 in
  (foo)
    echo "selected foo"
    ;;
  (bar)
    echo "selected bar"
    ;;
esac

E uma conclusão simples para isso incluída no fpath

#compdef app
local -a subcmds
subcmds=('foo:show foo' 'bar:show bar')
_describe 'app' subcmds

Funciona bem. Agora eu quero fazer um wrapper que adicione um subcomando ao aplicativo

__app_wrapper () {
    if [[ "$1" == baz ]]; then
        echo "selected baz"
    else
        command app "$@"
    fi
}

alias app=__app_wrapper

Depois de eu source , o subcomando funciona bem, mas o preenchimento automático alterna para a conclusão com arquivos no diretório atual, em vez do que meu script de conclusão fornece. Por que isso e como consertar isso? É porque o aplicativo agora é função em vez de executável?

Na verdade, estou tentando usar um script de conclusão mais complicado para docker-machine , mas consegui reduzir meu problema a esse exemplo.

    
por Poma 27.12.2017 / 09:56

1 resposta

1

A solução foi usar compdef , aqui o que acabei fazendo (no meu caso real):

#
# Function wrapper to docker-machine that adds a use subcommand.
#
# The use subcommand runs 'eval "$(docker-machine env [args])"', which is a lot
# less typing.
#
# To enable:
#  1a. Copy this file somewhere and source it in your .bashrc
#      source /some/where/docker-machine-wrapper.bash
#  1b. Alternatively, just copy this file into into /etc/bash_completion.d
#
# Configuration:
#
# DOCKER_MACHINE_WRAPPED
#   When set to a value other than true, this will disable the alias wrapper
#   alias for docker-machine. This is useful if you don't want the wrapper,
#   but it is installed by default by your installation.
#

: ${DOCKER_MACHINE_WRAPPED:=true}

__docker_machine_wrapper () {
    if [[ "$1" == use ]]; then
        # Special use wrapper
        shift 1
        case "$1" in
            -h|--help|"")
                cat <<EOF
Usage: docker-machine use [OPTIONS] [arg...]
Evaluate the commands to set up the environment for the Docker client
Description:
   Argument is a machine name.
Options:
   --swarm  Display the Swarm config instead of the Docker daemon
   --unset, -u  Unset variables instead of setting them
EOF
                ;;
            *)
                eval "$(docker-machine env "$@")"
                echo "Active machine: ${DOCKER_MACHINE_NAME}"
                ;;
        esac
    elif [[ "$1" == "--help" || "$1" == "-h" ]]; then
    command docker-machine "$@"
        echo "  use         Get the URL of a machine"
    else
        # Just call the actual docker-machine app
        command docker-machine "$@"
    fi
}

if [[ ${DOCKER_MACHINE_WRAPPED} = true ]]; then
    alias docker-machine=__docker_machine_wrapper
    compdef __docker_machine_wrapper=docker-machine
fi

Além disso, editei o arquivo de conclusão real para mostrar os nomes das máquinas

    
por 31.07.2018 / 14:10