diff --git a/client/trino-cli/src/main/java/io/trino/cli/Completion.java b/client/trino-cli/src/main/java/io/trino/cli/Completion.java index a939ecad7d72..9b153e2b856d 100644 --- a/client/trino-cli/src/main/java/io/trino/cli/Completion.java +++ b/client/trino-cli/src/main/java/io/trino/cli/Completion.java @@ -29,15 +29,25 @@ private Completion() {} public static Completer commandCompleter() { + // This is not an exhaustive list of commands, but it covers the most common ones. return new AggregateCompleter(buildArgumentCompleter("ALTER", asList("SCHEMA", "TABLE")), - buildArgumentCompleter("CREATE", asList("SCHEMA", "TABLE")), - buildArgumentCompleter("DESCRIBE"), - buildArgumentCompleter("DROP", asList("SCHEMA", "TABLE")), + buildArgumentCompleter("CREATE", asList("CATALOG", "SCHEMA", "TABLE", "VIEW", "MATERIALIZED VIEW", "FUNCTION", "BRANCH", "ROLE")), + buildArgumentCompleter("DESCRIBE", asList("INPUT", "OUTPUT")), + buildArgumentCompleter("DROP", asList("CATALOG", "SCHEMA", "TABLE", "VIEW", "MATERIALIZED VIEW", "FUNCTION", "BRANCH", "ROLE")), buildArgumentCompleter("EXPLAIN"), buildArgumentCompleter("HELP"), buildArgumentCompleter("QUIT"), buildArgumentCompleter("SELECT"), - buildArgumentCompleter("SHOW", asList("CATALOGS", "COLUMNS", "FUNCTIONS", "SCHEMAS", "SESSION", "TABLES")), + buildArgumentCompleter("MERGE"), + buildArgumentCompleter("TRUNCATE TABLE"), + buildArgumentCompleter("SET SESSION"), + buildArgumentCompleter("RESET SESSION"), + buildArgumentCompleter("RESET SESSION"), + buildArgumentCompleter("GRANT"), + buildArgumentCompleter("REVOKE"), + buildArgumentCompleter("DENY"), + buildArgumentCompleter("COMMENT ON", asList("TABLE", "VIEW", "COLUMN")), + buildArgumentCompleter("SHOW", asList("CATALOGS", "COLUMNS", "FUNCTIONS", "SCHEMAS", "SESSION", "TABLES", "STATS", "GRANT")), buildArgumentCompleter("USE")); } diff --git a/client/trino-cli/src/main/java/io/trino/cli/InputReader.java b/client/trino-cli/src/main/java/io/trino/cli/InputReader.java index 219a6d26bcfa..d6616e369abb 100644 --- a/client/trino-cli/src/main/java/io/trino/cli/InputReader.java +++ b/client/trino-cli/src/main/java/io/trino/cli/InputReader.java @@ -14,10 +14,13 @@ package io.trino.cli; import com.google.common.io.Closer; +import org.jline.keymap.KeyMap; +import org.jline.reader.Binding; import org.jline.reader.Completer; import org.jline.reader.History; import org.jline.reader.LineReader; import org.jline.reader.LineReaderBuilder; +import org.jline.reader.Reference; import org.jline.reader.impl.completer.AggregateCompleter; import org.jline.terminal.Terminal; import org.jline.utils.AttributedString; @@ -58,7 +61,7 @@ public InputReader(ClientOptions.EditingMode editingMode, Optional history historyFile.ifPresent(path -> builder.variable(HISTORY_FILE, path)); reader = builder.build(); - reader.getKeyMaps().put(MAIN, reader.getKeyMaps().get(editingMode.getKeyMap())); + reader.getKeyMaps().put(MAIN, configureKeyMap(reader, editingMode)); reader.unsetOpt(HISTORY_TIMESTAMPED); if (!disableAutoSuggestion) { AutosuggestionWidgets autosuggestionWidgets = new AutosuggestionWidgets(reader); @@ -95,4 +98,12 @@ private static String colored(String value) { return new AttributedString(value, DEFAULT.foreground(BRIGHT)).toAnsi(); } + + private static KeyMap configureKeyMap(LineReader reader, ClientOptions.EditingMode editingMode) + { + KeyMap bindingKeyMap = reader.getKeyMaps().get(editingMode.getKeyMap()); + bindingKeyMap.bind(new Reference(LineReader.UP_HISTORY), "\u001b[1;3A"); // alt + up + bindingKeyMap.bind(new Reference(LineReader.DOWN_HISTORY), "\u001b[1;3B"); // alt + down + return bindingKeyMap; + } }