use of org.jline.reader.LineReader in project felix by apache.
the class Shell method gosh.
public Object gosh(CommandSession currentSession, String[] argv) throws Exception {
final String[] usage = { "gosh - execute script with arguments in a new session", " args are available as session variables $1..$9 and $args.", "Usage: gosh [OPTIONS] [script-file [args..]]", " -c --command pass all remaining args to sub-shell", " --nointeractive don't start interactive session", " --nohistory don't save the command history", " --login login shell (same session, reads etc/gosh_profile)", " -s --noshutdown don't shutdown framework when script completes", " -x --xtrace echo commands before execution", " -? --help show help", "If no script-file, an interactive shell is started, type $D to exit." };
Options opt = Options.compile(usage).setOptionsFirst(true).parse(argv);
List<String> args = opt.args();
boolean login = opt.isSet("login");
boolean interactive = !opt.isSet("nointeractive");
if (opt.isSet("help")) {
opt.usage(System.err);
if (login && !opt.isSet("noshutdown")) {
shutdown();
}
return null;
}
if (opt.isSet("command") && args.isEmpty()) {
throw opt.usageError("option --command requires argument(s)");
}
CommandSession session;
if (login) {
session = currentSession;
} else {
session = createChildSession(currentSession);
}
if (opt.isSet("xtrace")) {
session.put("echo", true);
}
Terminal terminal = getTerminal(session);
session.put(Shell.VAR_CONTEXT, context);
session.put(Shell.VAR_PROCESSOR, processor);
session.put(Shell.VAR_SESSION, session);
session.put("#TERM", (Function) (s, arguments) -> terminal.getType());
session.put("#COLUMNS", (Function) (s, arguments) -> terminal.getWidth());
session.put("#LINES", (Function) (s, arguments) -> terminal.getHeight());
session.put("#PWD", (Function) (s, arguments) -> s.currentDir().toString());
if (!opt.isSet("nohistory")) {
session.put(LineReader.HISTORY_FILE, Paths.get(System.getProperty("user.home"), ".gogo.history"));
}
if (tio != null) {
PrintWriter writer = terminal.writer();
PrintStream out = new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
write(new byte[] { (byte) b }, 0, 1);
}
public void write(byte[] b, int off, int len) throws IOException {
writer.write(new String(b, off, len));
}
public void flush() throws IOException {
writer.flush();
}
public void close() throws IOException {
writer.close();
}
});
tio.setStreams(terminal.input(), out, out);
}
try {
LineReader reader;
if (args.isEmpty() && interactive) {
CompletionEnvironment completionEnvironment = new CompletionEnvironment() {
@Override
public Map<String, List<CompletionData>> getCompletions() {
return Shell.getCompletions(session);
}
@Override
public Set<String> getCommands() {
return Shell.getCommands(session);
}
@Override
public String resolveCommand(String command) {
return Shell.resolve(session, command);
}
@Override
public String commandName(String command) {
int idx = command.indexOf(':');
return idx >= 0 ? command.substring(idx + 1) : command;
}
@Override
public Object evaluate(LineReader reader, ParsedLine line, String func) throws Exception {
session.put(Shell.VAR_COMMAND_LINE, line);
return session.execute(func);
}
};
reader = LineReaderBuilder.builder().terminal(terminal).variables(((CommandSessionImpl) session).getVariables()).completer(new org.jline.builtins.Completers.Completer(completionEnvironment)).highlighter(new Highlighter(session)).parser(new Parser()).expander(new Expander(session)).build();
reader.setOpt(LineReader.Option.AUTO_FRESH_LINE);
session.put(Shell.VAR_READER, reader);
session.put(Shell.VAR_COMPLETIONS, new HashMap());
} else {
reader = null;
}
if (login || interactive) {
URI uri = baseURI.resolve("etc/" + profile);
if (!new File(uri).exists()) {
URL url = getClass().getResource("/ext/" + profile);
if (url == null) {
url = getClass().getResource("/" + profile);
}
uri = (url == null) ? null : url.toURI();
}
if (uri != null) {
source(session, uri.toString());
}
}
Object result = null;
if (args.isEmpty()) {
if (interactive) {
result = runShell(session, terminal, reader);
}
} else {
CharSequence program;
if (opt.isSet("command")) {
StringBuilder buf = new StringBuilder();
for (String arg : args) {
if (buf.length() > 0) {
buf.append(' ');
}
buf.append(arg);
}
program = buf;
} else {
URI script = session.currentDir().toUri().resolve(args.remove(0));
// set script arguments
session.put("0", script);
session.put("args", args);
for (int i = 0; i < args.size(); ++i) {
session.put(String.valueOf(i + 1), args.get(i));
}
program = readScript(script);
}
result = session.execute(program);
}
if (login && interactive && !opt.isSet("noshutdown")) {
if (terminal != null) {
terminal.writer().println("gosh: stopping framework");
terminal.flush();
}
shutdown();
}
return result;
} finally {
if (tio != null) {
tio.close();
}
}
}
use of org.jline.reader.LineReader in project SpongeVanilla by SpongePowered.
the class MixinConsoleHandler method onRun.
@Inject(method = "run", at = @At("HEAD"), cancellable = true, remap = false)
private void onRun(CallbackInfo ci) {
final Terminal terminal = TerminalConsoleAppender.getTerminal();
if (terminal != null) {
LineReader reader = LineReaderBuilder.builder().appName("SpongeVanilla").terminal(terminal).completer(new ConsoleCommandCompleter(this.server)).build();
reader.unsetOpt(LineReader.Option.INSERT_TAB);
TerminalConsoleAppender.setReader(reader);
try {
String line;
while (!this.server.isServerStopped() && this.server.isServerRunning()) {
try {
line = reader.readLine("> ");
} catch (EndOfFileException e) {
// Continue reading after EOT
continue;
}
if (line == null) {
break;
}
line = line.trim();
if (!line.isEmpty()) {
this.server.addPendingCommand(line, this.server);
}
}
} catch (UserInterruptException e) {
this.server.initiateShutdown();
} finally {
TerminalConsoleAppender.setReader(null);
}
ci.cancel();
}
}
use of org.jline.reader.LineReader in project LanternServer by LanternPowered.
the class ConsoleManager method start.
public void start() {
final Terminal terminal = TerminalConsoleAppender.getTerminal();
if (terminal != null) {
final LineReader reader = LineReaderBuilder.builder().appName(this.pluginContainer.getName()).terminal(terminal).completer(new ConsoleCommandCompleter()).build();
reader.unsetOpt(Option.INSERT_TAB);
reader.setVariable(LineReader.HISTORY_FILE, this.consoleHistoryFile);
TerminalConsoleAppender.setReader(reader);
}
active = true;
final Thread thread = new Thread(this::readCommandTask, "console");
thread.setDaemon(true);
thread.start();
this.scheduler.createAsyncExecutor(this.pluginContainer).scheduleAtFixedRate(this::saveHistory, 120, 120, TimeUnit.SECONDS);
}
use of org.jline.reader.LineReader in project LanternServer by LanternPowered.
the class ConsoleManager method readCommandTask.
/**
* This task handles the commands that are executed through the console.
*/
private void readCommandTask() {
final LineReader lineReader = TerminalConsoleAppender.getReader();
final Supplier<String> consoleReader;
if (lineReader != null) {
consoleReader = () -> {
try {
return lineReader.readLine("> ");
} catch (EndOfFileException e) {
return null;
}
};
} else {
this.logger.info("Falling back to non jline console.");
final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
consoleReader = () -> {
try {
return reader.readLine();
} catch (IOException e) {
return null;
}
};
}
final SpongeExecutorService executor = this.scheduler.createSyncExecutor(this.pluginContainer);
try {
String command;
while (active) {
command = consoleReader.get();
if (command != null) {
command = command.trim();
if (!command.isEmpty()) {
final String runCommand = command.startsWith("/") ? command.substring(1) : command;
executor.execute(() -> this.commandManager.process(LanternConsoleSource.INSTANCE, runCommand));
}
}
}
} catch (UserInterruptException e) {
// Already set the reader to null, to avoid printing a new line
TerminalConsoleAppender.setReader(null);
// When a user interrupts the console, for example Ctrl-C
// Shutdown the server
executor.execute(() -> Lantern.getServer().shutdown());
}
}
Aggregations