Tự động hoàn thành Zsh bị hỏng khi tôi thêm trình bao bọc vào lệnh


1

Ví dụ tôi có một bài appthi thực thi

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

Và một sự hoàn thành đơn giản cho nó bao gồm trong fpath

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

Nó hoạt động tốt. Bây giờ tôi muốn tạo một trình bao bọc thêm một tiểu ban cho ứng dụng

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

alias app=__app_wrapper

Khi tôi làm sourceđiều đó, tiểu ban hoạt động tốt, nhưng tự động hoàn thành chuyển sang hoàn thành với các tệp trong thư mục hiện tại thay vì những gì tập lệnh hoàn thành của tôi cung cấp. Tại sao lại như vậy và làm thế nào để khắc phục nó? Có phải vì ứng dụng hiện đang hoạt động thay vì thực thi?

Tôi thực sự đang cố gắng sử dụng một kịch bản hoàn thành phức tạp hơn cho docker-machinenhưng tôi đã có thể giảm vấn đề của mình xuống ví dụ này.


Tôi có một vấn đề rất giống nhau (với một trình bao bọc proxy cho docker). Bạn đã tìm ra cách nào để khắc phục điều này chưa?
Jakub Arnold

@JakubArnold đã thêm câu trả lời cho câu hỏi của tôi
Poma

Câu trả lời:


1

Giải pháp là sử dụng compdef, ở đây những gì tôi đã kết thúc (đối với trường hợp thực tế của tôi):

#
# 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

Ngoài ra, tôi đã chỉnh sửa tập tin hoàn thành thực tế để hiển thị tên máy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.