Support Syncthing's shell completion

Syncthing added shell completion in v1.27.3-rc.1 (commit
78db3af8c5e8bd08a9773b0c4da233a52ed4cfe6). This change integrates
that shell completion with Syncthing Tray's long existing completion (which
only supports Bash so far).
This commit is contained in:
Martchus 2024-01-26 01:48:47 +01:00
parent 4db88620f6
commit 5667aad412
3 changed files with 23 additions and 11 deletions

@ -1 +1 @@
Subproject commit db990abf2331af0935ad1550bfbcfdee0c76b512
Subproject commit 212332442949744450a7d64eb0271af615580021

View File

@ -185,11 +185,21 @@ static int runApplication(int argc, const char *const *argv)
auto cliHelp = ConfigValueArgument("help", 'h', "shows help for Syncthing's CLI");
cliArg.setRequiredValueCount(Argument::varValueCount);
cliArg.setFlags(Argument::Flags::Greedy, true);
cliArg.setValueCompletionBehavior(ValueCompletionBehavior::PreDefinedValues | ValueCompletionBehavior::InvokeCallback);
cliArg.setCallback([] (const ArgumentOccurrence &occurrence) {
CMD_UTILS_START_CONSOLE;
std::exit(static_cast<int>(LibSyncthing::runCli(occurrence.values)));
});
cliArg.setSubArguments({ &cliHelp });
auto syncthingArg = OperationArgument("syncthing", '\0', "runs Syncthing");
auto syncthingHelp = ConfigValueArgument("help", 'h', "lists Syncthing's top-level commands");
syncthingArg.setRequiredValueCount(Argument::varValueCount);
syncthingArg.setFlags(Argument::Flags::Greedy, true);
syncthingArg.setValueCompletionBehavior(ValueCompletionBehavior::PreDefinedValues | ValueCompletionBehavior::InvokeCallback);
syncthingArg.setCallback([] (const ArgumentOccurrence &occurrence) {
CMD_UTILS_START_CONSOLE;
std::exit(static_cast<int>(LibSyncthing::runCommand(occurrence.values)));
});
syncthingArg.setSubArguments({ &syncthingHelp });
#endif
@ -201,16 +211,6 @@ static int runApplication(int argc, const char *const *argv)
// parse arguments
parser.parseArgs(argc, argv);
#ifdef SYNCTHINGTRAY_USE_LIBSYNCTHING
if (cliArg.isPresent()) {
CMD_UTILS_START_CONSOLE;
return static_cast<int>(LibSyncthing::runCli(cliArg.values()));
}
if (syncthingArg.isPresent()) {
CMD_UTILS_START_CONSOLE;
return static_cast<int>(LibSyncthing::runCommand(syncthingArg.values()));
}
#endif
// quit already running application if quit is present
static auto firstRun = true;

View File

@ -0,0 +1,12 @@
_@META_TARGET_NAME@()
{
export COMP_LINE=${COMP_WORDS[@]} # for Syncthing's own completion which is invoked via `complete -C ...`
reply=$(@TARGET_EXECUTABLE@ --bash-completion-for "$((COMP_CWORD - 1))" "${COMP_WORDS[@]:1}")
if [[ $reply =~ COMPREPLY=.* ]]; then
eval "$reply" # for own completions which output `COMPREPLY=(...)`
else
COMPREPLY=($reply) # for Syncthing's own completion which outputs just the values
fi
return 0;
}
complete -F _@META_TARGET_NAME@ @META_TARGET_NAME@