Bash 空头期权完成失败

Bash completion broken on short options

我已经创建了自己的 bash 完成函数。我做了几次编辑。完成本身适合我,但我在短选项 -a-p-h

之后打破了自动 space

意思是,当我键入 editcfg -filTAB 时,它会自动完成 editcfg -file (space 在 -file 之后)。 但是,如果我键入 editcfg -pTAB,它不会在 -p.

之后自动 space

函数:

_editcfg () 
{ 
    local cur prev opts presets u_opts;
    COMPREPLY=();
    cur="${COMP_WORDS[COMP_CWORD]}";
    prev="${COMP_WORDS[COMP_CWORD-1]}";
    opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h");
    presets=("default" "empty");
    u_opts=();
    for i in "${opts[@]}";
    do
        for j in "${COMP_WORDS[@]}";
        do
            if [[ "$i" == "$j" ]]; then
                continue 2;
            fi;
        done;
        u_opts+=("$i");
    done;
    case ${prev} in 
        -p)
            COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur}));
            return 0
        ;;
        -file)
            COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null));
            return 0
        ;;
        -h | -version)
            u_opts=();
            return 0
        ;;
    esac;
    COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur}));
    return 0
}

我错过了什么?

谢谢

我更新了第二个 for 循环并且它工作正常:

_editcfg () 
{ 
    local cur prev opts presets u_opts;
    COMPREPLY=();
    cur="${COMP_WORDS[COMP_CWORD]}";
    prev="${COMP_WORDS[COMP_CWORD-1]}";
    opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h");
    presets=("default" "empty");
    u_opts=();
    for i in "${opts[@]}"; do
        for ((j = 0; j < COMP_CWORD; ++j)) do
            if [[ "$i" == "${COMP_WORDS[j]}" ]]; then
                continue 2;
            fi;
        done;
        u_opts+=("$i");
    done;
    case ${prev} in 
        -p)
            COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur}));
            return 0
        ;;
        -file)
            COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null));
            return 0
        ;;
        -h | -version)
            u_opts=();
            return 0
        ;;
    esac;
    COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur}));
    return 0
}