_argc_completer() {
    declare -a _argc_completer_words
    _argc_completer_parse_line

    export COMP_WORDBREAKS
    while IFS=$'\n' read -r line; do
        COMPREPLY+=( "$line" )
    done < <(argc --argc-compgen bash "" "${_argc_completer_words[@]}" 2>/dev/null)
}

_argc_completer_parse_line() {
    local line len i char prev_char word unbalance
    line="${COMP_LINE:0:$COMP_POINT}"
    len="${#line}"

    for ((i=0; i<len; i++)); do
        char="${line:i:1}"
        if [[ -n "$unbalance" ]]; then
            word="$word$char"
            if [[  "$unbalance" == "$char" ]]; then
                unbalance=""
            fi
        elif [[ "$char" == " " ]]; then
            if [[ "$prev_char" == "\\" ]]; then
                word="$word$char"
            elif [[ -n "$word" ]]; then
                _argc_completer_words+=( "$word" )
                word=""
            fi
        elif [[ "$char" == "'" || "$char" == '"' ]]; then
            word="$word$char"
            unbalance="$char"
        elif [[ "$char" == "\\" ]]; then
            if [[ "$prev_char" == "\\" ]]; then
                word="$word$char"
            fi
        else
            word="$word$char"
        fi
        prev_char="$char"
    done

    _argc_completer_words+=( "$word" )
}

complete -F _argc_completer -o nospace -o nosort \
    argc
