complete: Make -c optional

Currently, completions have to be specified like

```fish
complete -c foo -l opt
```

while

```fish
complete foo -l opt
```

just complains about there being too many arguments.

That's kinda useless, so we just assume if there is one left-over
argument that it's meant to be the command.

Theoretically we could also use *all* the arguments as commands to
complete, but that seems unlikely to be what the user wants.

(I don't think multi-command completions really happen)
This commit is contained in:
Fabian Homborg 2020-09-09 18:37:46 +02:00
parent a8e237f0f9
commit 903b7888d3
3 changed files with 20 additions and 1 deletions

View file

@ -8,7 +8,7 @@ Synopsis
::
complete ( -c | --command | -p | --path ) COMMAND
complete [( -c | --command | -p | --path )] COMMAND
[( -c | --command | -p | --path ) COMMAND]...
[( -e | --erase )]
[( -s | --short-option ) SHORT_OPTION]...

View file

@ -299,6 +299,9 @@ maybe_t<int> builtin_complete(parser_t &parser, io_streams_t &streams, wchar_t *
if (do_complete && !have_do_complete_param && argc == w.woptind + 1) {
do_complete_param = argv[argc - 1];
have_do_complete_param = true;
} else if (!do_complete && cmd_to_complete.empty() && argc == w.woptind + 1) {
// Or use one left-over arg as the command to complete
cmd_to_complete.push_back(argv[argc - 1]);
} else {
streams.err.append_format(BUILTIN_ERR_TOO_MANY_ARGUMENTS, cmd);
builtin_print_error_trailer(parser, streams.err, cmd);

View file

@ -358,3 +358,19 @@ end
complete -c banana -a '1 2 3'
complete -c banana
#CHECK: complete -c banana -a '1 2 3'
# "-c" is optional
complete banana -a bar
complete banana
#CHECK: complete -c banana -a bar
#CHECK: complete -c banana -a '1 2 3'
# "-a" ain't
complete banana bar
#CHECKERR: complete: Too many arguments
#CHECKERR:
#CHECKERR: {{.*}}checks/complete.fish (line {{\d+}}):
#CHECKERR: complete banana bar
#CHECKERR: ^
#CHECKERR:
#CHECKERR: (Type 'help complete' for related documentation)