Skip to content

Commit

Permalink
Improve Builtins commands tab completion, fixes #488
Browse files Browse the repository at this point in the history
  • Loading branch information
mattirn committed Dec 14, 2019
1 parent daba558 commit b1ec62c
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 41 deletions.
75 changes: 42 additions & 33 deletions builtins/src/main/java/org/jline/builtins/Builtins.java
Expand Up @@ -11,14 +11,7 @@
import java.io.InputStream;
import java.io.PrintStream;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
Expand All @@ -31,11 +24,8 @@
import org.jline.builtins.Options.HelpException;
import org.jline.builtins.Widgets.ArgDesc;
import org.jline.builtins.Widgets.CmdDesc;
import org.jline.reader.Completer;
import org.jline.reader.ConfigurationPath;
import org.jline.reader.LineReader;
import org.jline.reader.*;
import org.jline.reader.LineReader.Option;
import org.jline.reader.Widget;
import org.jline.reader.impl.completer.ArgumentCompleter;
import org.jline.reader.impl.completer.NullCompleter;
import org.jline.reader.impl.completer.StringsCompleter;
Expand Down Expand Up @@ -280,13 +270,16 @@ private List<OptDesc> commandOptions(String command) {
String lo = null;
if (op.length == 1) {
if (op[0].startsWith("--")) {
out.add(new OptDesc(null, op[0], d));
lo = op[0];
} else {
out.add(new OptDesc(op[0], null, d));
so = op[0];
}
} else {
out.add(new OptDesc(op[0], op[1], d));
so = op[0];
lo = op[1];
}
lo = lo == null ? lo : lo.split("=")[0];
out.add(new OptDesc(so, lo, d));
}
}
}
Expand Down Expand Up @@ -398,7 +391,7 @@ private Set<String> allWidgets() {

private List<Completer> nanoCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(new FilesCompleter(workDir)
, this::commandOptions
, 1)
Expand All @@ -408,7 +401,7 @@ private List<Completer> nanoCompleter(String name) {

private List<Completer> lessCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(new FilesCompleter(workDir)
, this::commandOptions
, 1)
Expand All @@ -418,35 +411,51 @@ private List<Completer> lessCompleter(String name) {

private List<Completer> historyCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
List<OptDesc> optDescs = commandOptions(commandName.get(Command.HISTORY));
for (OptDesc o : optDescs) {
if (o.shortOption() != null && (o.shortOption().equals("-A") || o.shortOption().equals("-W")
|| o.shortOption().equals("-R"))) {
o.setValueCompleter(new FilesCompleter(workDir));
}
}
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(NullCompleter.INSTANCE
, this::commandOptions
, optDescs
, 1)
));
completers.add(new ArgumentCompleter(new StringsCompleter(name)
, new StringsCompleter(Arrays.asList("-A", "-W", "-R", "-AI", "-RI", "-WI"))
, new FilesCompleter(workDir), NullCompleter.INSTANCE));
return completers;
}

private List<Completer> widgetCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
List<OptDesc> optDescs = commandOptions(commandName.get(Command.WIDGET));
Candidate aliasOption = new Candidate("-A", "-A", null, null, null, null, true);
Iterator<OptDesc> i = optDescs.iterator();
while (i.hasNext()) {
OptDesc o = i.next();
if (o.shortOption() != null) {
if (o.shortOption().equals("-D")) {
o.setValueCompleter(new StringsCompleter(() -> reader.getWidgets().keySet()));
} else if (o.shortOption().equals("-A")) {
aliasOption = new Candidate(o.shortOption(), o.shortOption(), null, o.description(), null, null, true);
i.remove();
}
}
}
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(NullCompleter.INSTANCE
, this::commandOptions
, optDescs
, 1)
));
completers.add(new ArgumentCompleter(new StringsCompleter(name)
, new StringsCompleter("-A"), new StringsCompleter(() -> allWidgets())
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new StringsCompleter(aliasOption), new StringsCompleter(() -> allWidgets())
, new StringsCompleter(() -> reader.getWidgets().keySet()), NullCompleter.INSTANCE));
completers.add(new ArgumentCompleter(new StringsCompleter(name)
, new StringsCompleter("-D"), new StringsCompleter(() -> reader.getWidgets().keySet())));
return completers;
}

private List<Completer> keymapCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(NullCompleter.INSTANCE
, this::commandOptions
, 1)
Expand All @@ -456,28 +465,28 @@ private List<Completer> keymapCompleter(String name) {

private List<Completer> setvarCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new StringsCompleter(() -> reader.getVariables().keySet()), NullCompleter.INSTANCE));
return completers;
}

private List<Completer> setoptCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new StringsCompleter(() -> unsetOptions(true))));
return completers;
}

private List<Completer> unsetoptCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new StringsCompleter(() -> unsetOptions(false))));
return completers;
}

private List<Completer> ttopCompleter(String name) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(new StringsCompleter(name)
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(NullCompleter.INSTANCE
, this::commandOptions
, 1)
Expand Down
27 changes: 19 additions & 8 deletions builtins/src/main/java/org/jline/builtins/Completers.java
Expand Up @@ -697,7 +697,6 @@ public static class OptDesc {
private String shortOption;
private String longOption;
private String description;
private boolean value;
private org.jline.reader.Completer valueCompleter;

protected static List<OptDesc> compile(Map<String,List<String>> optionValues, Collection<String> options) {
Expand All @@ -723,7 +722,6 @@ public OptDesc(String shortOption, String longOption, String description, org.jl
this.shortOption = shortOption;
this.longOption = longOption;
this.description = description;
this.value = valueCompleter != null ? true : false;
this.valueCompleter = valueCompleter;
}

Expand All @@ -742,11 +740,15 @@ public OptDesc(String shortOption, String longOption) {
protected OptDesc() {
}

protected String longOption() {
public void setValueCompleter(org.jline.reader.Completer valueCompleter) {
this.valueCompleter = valueCompleter;
}

public String longOption() {
return longOption;
}

protected String shortOption() {
public String shortOption() {
return shortOption;
}

Expand All @@ -755,7 +757,7 @@ protected String description() {
}

protected boolean hasValue() {
return value;
return valueCompleter != null;
}

protected org.jline.reader.Completer valueCompleter() {
Expand All @@ -768,7 +770,7 @@ protected void completeOption(LineReader reader, final ParsedLine commandLine, L
candidates.add(new Candidate(shortOption, shortOption, null, description, null, null, false));
}
} else if (longOption != null) {
if (value) {
if (hasValue()) {
candidates.add(new Candidate(longOption + "=", longOption, null, description, null, null, false));
} else {
candidates.add(new Candidate(longOption, longOption, null, description, null, null, true));
Expand Down Expand Up @@ -829,8 +831,17 @@ public OptionCompleter(org.jline.reader.Completer completer, Map<String,List<Str
}

public OptionCompleter(Map<String,List<String>> optionValues, Collection<String> options, int startPos) {
this.options = OptDesc.compile(optionValues, options);
this.startPos = startPos;
this(OptDesc.compile(optionValues, options), startPos);
}

public OptionCompleter(org.jline.reader.Completer completer, Collection<OptDesc> options, int startPos) {
this(options, startPos);
this.argsCompleters.add(completer);
}

public OptionCompleter(List<org.jline.reader.Completer> completers, Collection<OptDesc> options, int startPos) {
this(options, startPos);
this.argsCompleters = new ArrayList<>(completers);
}

public OptionCompleter(Collection<OptDesc> options, int startPos) {
Expand Down

0 comments on commit b1ec62c

Please sign in to comment.