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:
parent
4db88620f6
commit
5667aad412
|
@ -1 +1 @@
|
||||||
Subproject commit db990abf2331af0935ad1550bfbcfdee0c76b512
|
Subproject commit 212332442949744450a7d64eb0271af615580021
|
|
@ -185,11 +185,21 @@ static int runApplication(int argc, const char *const *argv)
|
||||||
auto cliHelp = ConfigValueArgument("help", 'h', "shows help for Syncthing's CLI");
|
auto cliHelp = ConfigValueArgument("help", 'h', "shows help for Syncthing's CLI");
|
||||||
cliArg.setRequiredValueCount(Argument::varValueCount);
|
cliArg.setRequiredValueCount(Argument::varValueCount);
|
||||||
cliArg.setFlags(Argument::Flags::Greedy, true);
|
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 });
|
cliArg.setSubArguments({ &cliHelp });
|
||||||
auto syncthingArg = OperationArgument("syncthing", '\0', "runs Syncthing");
|
auto syncthingArg = OperationArgument("syncthing", '\0', "runs Syncthing");
|
||||||
auto syncthingHelp = ConfigValueArgument("help", 'h', "lists Syncthing's top-level commands");
|
auto syncthingHelp = ConfigValueArgument("help", 'h', "lists Syncthing's top-level commands");
|
||||||
syncthingArg.setRequiredValueCount(Argument::varValueCount);
|
syncthingArg.setRequiredValueCount(Argument::varValueCount);
|
||||||
syncthingArg.setFlags(Argument::Flags::Greedy, true);
|
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 });
|
syncthingArg.setSubArguments({ &syncthingHelp });
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -201,16 +211,6 @@ static int runApplication(int argc, const char *const *argv)
|
||||||
|
|
||||||
// parse arguments
|
// parse arguments
|
||||||
parser.parseArgs(argc, argv);
|
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
|
// quit already running application if quit is present
|
||||||
static auto firstRun = true;
|
static auto firstRun = true;
|
||||||
|
|
|
@ -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@
|
Loading…
Reference in New Issue