diff --git a/syncthing/go/src/github.com/syncthing/syncthing b/syncthing/go/src/github.com/syncthing/syncthing index db990ab..2123324 160000 --- a/syncthing/go/src/github.com/syncthing/syncthing +++ b/syncthing/go/src/github.com/syncthing/syncthing @@ -1 +1 @@ -Subproject commit db990abf2331af0935ad1550bfbcfdee0c76b512 +Subproject commit 212332442949744450a7d64eb0271af615580021 diff --git a/tray/application/main.cpp b/tray/application/main.cpp index 484e234..b99499f 100644 --- a/tray/application/main.cpp +++ b/tray/application/main.cpp @@ -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(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(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(LibSyncthing::runCli(cliArg.values())); - } - if (syncthingArg.isPresent()) { - CMD_UTILS_START_CONSOLE; - return static_cast(LibSyncthing::runCommand(syncthingArg.values())); - } -#endif // quit already running application if quit is present static auto firstRun = true; diff --git a/tray/cmake/templates/bash-completion.sh.in b/tray/cmake/templates/bash-completion.sh.in new file mode 100755 index 0000000..f22753e --- /dev/null +++ b/tray/cmake/templates/bash-completion.sh.in @@ -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@