function getopts -d "cli parser"
    if not set -q argv[1]
        return
    end

    printf "%s\n" $argv | awk '
        function out(k,v) {
            print(k "" (v == "" ? "" : " "v))
        }

        function pop() {
            return len <= 0 ? "_" : opt[len--]
        }

        {
            if (done) {
                out("_" , $0)
                next
            }

            if (match($0, "^-[A-Za-z]+")) {
                $0 = "- " substr($0, 2, RLENGTH - 1) " " substr($0, RLENGTH + 1)

            } else if (match($0, "^--[A-Za-z0-9_-]+")) {
                $0 = "-- " substr($0, 3, RLENGTH - 2) " " substr($0, RLENGTH + 2)
            }

            if ($1 == "--" && $2 == "") {
                done = 1

            } else if ($2 == "" || $1 !~ /^-|^--/ ) {
                out(pop(), $0)

            } else {
                while (len) {
                    out(pop())
                }

                if ($3 != "") {
                    if (match($0, $2)) {
                        $3 = substr($0, RSTART + RLENGTH + 1)
                    }
                }

                if ($1 == "--") {
                    if ($3 == "") {
                        opt[++len] = $2
                    } else {
                        out($2, $3)
                    }
                }

                if ($1 == "-") {
                    if ($2 == "") {
                        print($1)
                        next

                    } else {
                        n = split($2, keys, "")
                    }

                    if ($3 == "") {
                        opt[++len] = keys[n]

                    } else {
                        out(keys[n], $3)
                    }

                    for (i = 1; i < n; i++) {
                        out(keys[i])
                    }
                }
            }
        }

        END {
            while (len) {
                out(pop())
            }
        }
'
end
