diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java index 8f7f26a8216e3dafd7b3d6cd5e1e2000a94b6914..bde37e6c38fc18cad27d9d6d9f2f40aa67281c50 100644 --- a/src/main/java/de/prob2/jupyter/ProBKernel.java +++ b/src/main/java/de/prob2/jupyter/ProBKernel.java @@ -472,17 +472,32 @@ public final class ProBKernel extends BaseKernel { private static @Nullable ReplacementOptions completeCommandArguments(final @NotNull Command command, final @NotNull PositionedString argString, final int at) { final SplitResult split = CommandUtils.splitArgs(command.getParameters(), argString, at); + + final Parameter<?> parameterToComplete; + final PositionedString argumentToComplete; if (split.getParameterAtPosition().isPresent()) { - final Optional<Completer> completer = command.getParameterCompleters().getCompleterForParameter(split.getParameterAtPosition().get()); - if (completer.isPresent()) { - final List<PositionedString> argsAtPosition = split.getArguments().get(split.getParameterAtPosition().get()); - assert !argsAtPosition.isEmpty(); - final PositionedString lastArgument = argsAtPosition.get(argsAtPosition.size() - 1); - final ReplacementOptions replacements = completer.get().complete(lastArgument.getValue(), at - lastArgument.getStartPosition()); - return replacements == null ? null : offsetReplacementOptions(replacements, lastArgument.getStartPosition()); - } else { - return null; - } + // If any arguments were split, + // use the last parameter for completion. + parameterToComplete = split.getParameterAtPosition().get(); + final List<PositionedString> argsAtPosition = split.getArguments().get(parameterToComplete); + assert !argsAtPosition.isEmpty(); + argumentToComplete = argsAtPosition.get(argsAtPosition.size() - 1); + } else if (!command.getParameters().getPositionalParameters().isEmpty()) { + // Special case: if the command has parameters, + // but argument splitting stopped before any arguments were split, + // perform completion on the first parameter and an empty string at the cursor. + parameterToComplete = command.getParameters().getPositionalParameters().get(0); + argumentToComplete = new PositionedString("", at); + } else { + // Command has no parameters, + // so completion in the arguments is not possible. + return null; + } + + final Optional<Completer> completer = command.getParameterCompleters().getCompleterForParameter(parameterToComplete); + if (completer.isPresent()) { + final ReplacementOptions replacements = completer.get().complete(argumentToComplete.getValue(), at - argumentToComplete.getStartPosition()); + return replacements == null ? null : offsetReplacementOptions(replacements, argumentToComplete.getStartPosition()); } else { return null; }