Added a -u/--move-unknown option to argparse.

--move-unknown is like --ignore-unknown, but unknown options are instead moved
from $argv to $argv_opts, just like known ones. This allows unambiguously
parsing non-option arguments to other commands. For example if $argv contains
`--opt -- --file`, and we execute `argparse --move-unknown -- $argv`, we can
then call `cmd $argv_opts -- --another-file $argv`, which will correctly
interpret `--opt` as an option, but `--file` and `--some-file` as an argument.
This makes `--move-unknown` a better alternative to `--ignore-unknown`, so the
latter has been marked as deprecated, but kept for backwards compatibility.
This commit is contained in:
Isaac Oscar Gariano
2025-08-03 10:07:08 +10:00
parent 5a7e5dc743
commit 51d16f017d
5 changed files with 115 additions and 18 deletions

View File

@@ -368,6 +368,62 @@ begin
# CHECK: argv_opts -b
end
begin
# Ignore unknown and move unknown are mutually exclusive
argparse -i --move-unknown --
#CHECKERR: argparse: --ignore-unknown --move-unknown: options cannot be used together
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
#CHECKERR: argparse -i --move-unknown --
#CHECKERR: ^
#CHECKERR: (Type 'help argparse' for related documentation)
end
begin
# Moving unknown options
argparse --move-unknown h i -- -hoa -oia
echo -- $argv
#CHECK:
echo -- $argv_opts
#CHECK: -hoa -oia
echo $_flag_h
#CHECK: -h
set -q _flag_i
or echo No flag I
#CHECK: No flag I
end
begin
# Moving unknown options
argparse -u a=+ b=+ -- -a alpha -b bravo -t tango -a aaaa --wurst
or echo unexpected argparse return status $status >&2
# The unknown options are removed _entirely_.
echo $argv
echo $argv_opts
echo $_flag_a
# CHECK: tango
# CHECK: -a alpha -b bravo -t -a aaaa --wurst
# CHECK: alpha aaaa
end
begin
# Move unknown long options that share a character with a known short options
argparse -u o -- --long=value --long
or echo unexpected argparse return status $status >&2
set -l
# CHECK: argv
# CHECK: argv_opts '--long=value' '--long'
end
begin
argparse -u b/break -- "-b kubectl get pods -l name=foo"
set -l
# CHECK: _flag_b -b
# CHECK: _flag_break -b
# CHECK: argv
# CHECK: argv_opts '-b kubectl get pods -l name=foo'
end
begin
# Checking arguments after "--"
argparse a/alpha -- a --alpha -- b -a