From dfc070dacc99c32e099dc8c2bd8826becfa4586a Mon Sep 17 00:00:00 2001 From: mattirn Date: Sun, 15 Dec 2019 11:04:49 +0100 Subject: [PATCH] OptionCompleter: improved short option value completion, #485 --- .../java/org/jline/builtins/Completers.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/builtins/src/main/java/org/jline/builtins/Completers.java b/builtins/src/main/java/org/jline/builtins/Completers.java index 80d463f45..f75299cb3 100644 --- a/builtins/src/main/java/org/jline/builtins/Completers.java +++ b/builtins/src/main/java/org/jline/builtins/Completers.java @@ -833,7 +833,7 @@ public OptionCompleter(org.jline.reader.Completer completer, Map> optionValues, Collection options, int startPos) { this(OptDesc.compile(optionValues, options), startPos); } - + public OptionCompleter(org.jline.reader.Completer completer, Collection options, int startPos) { this(options, startPos); this.argsCompleters.add(completer); @@ -901,13 +901,13 @@ public void complete(LineReader reader, final ParsedLine commandLine, List 1 && words.get(words.size() - 2).matches("-[a-zA-Z]{1}") && findOptDesc(command, words.get(words.size() - 2)).hasValue()) { - findOptDesc(command, words.get(words.size() - 2)).valueCompleter().complete(reader, commandLine, candidates); + } else if (words.size() > 1 && shortOptionValueCompleter(command, words.get(words.size() - 2)) != null) { + shortOptionValueCompleter(command, words.get(words.size() - 2)).complete(reader, commandLine, candidates); } else if (!argsCompleters.isEmpty()) { int args = -1; for (int i = startPos; i < words.size(); i++) { if (!words.get(i).startsWith("-")) { - if (i > 0 && (!words.get(i - 1).matches("-[a-zA-Z]{1}") || !findOptDesc(command, words.get(i - 1)).hasValue())) { + if (i > 0 && shortOptionValueCompleter(command, words.get(i - 1)) == null) { args++; } } @@ -922,8 +922,33 @@ public void complete(LineReader reader, final ParsedLine commandLine, List optDescs = commandOptions == null ? options : commandOptions.apply(command); + if (opt.length() == 2) { + out = findOptDesc(optDescs, opt).valueCompleter(); + } else if (opt.length() > 2) { + for (int i = 1; i < opt.length(); i++) { + OptDesc o = findOptDesc(optDescs, "-" + opt.charAt(i)); + if (o.shortOption() == null) { + return null; + } else if (out == null) { + out = o.valueCompleter(); + } + } + } + return out; + } + private OptDesc findOptDesc(String command, String opt) { - for (OptDesc o : commandOptions == null ? options : commandOptions.apply(command)) { + return findOptDesc(commandOptions == null ? options : commandOptions.apply(command), opt); + } + + private OptDesc findOptDesc(Collection optDescs, String opt) { + for (OptDesc o : optDescs) { if (o.match(opt)) { return o; }