Terminal
Æsh Readline provides terminal abstraction through the Connection and Terminal interfaces.
TerminalConnection
The standard terminal connection:
import org.aesh.tty.terminal.TerminalConnection;
TerminalConnection connection = new TerminalConnection();
connection.openBlocking(); // Blocking mode
// OR
connection.openNonBlocking(); // Non-blocking modeConnection Interface
Key Methods
Connection connection = new TerminalConnection();
// Terminal information
Device device = connection.device();
Size size = connection.size();
Charset inputEncoding = connection.inputEncoding();
Charset outputEncoding = connection.outputEncoding();
boolean supportsAnsi = connection.supportsAnsi();
// Write output
connection.write("Hello, World!\n");
// Handlers
Consumer<int[]> stdinHandler = connection.getStdinHandler();
connection.setStdinHandler(handler -> { /* process input */ });
Consumer<Size> sizeHandler = connection.getSizeHandler();
connection.setSizeHandler(size -> { /* handle resize */ });
Consumer<Signal> signalHandler = connection.getSignalHandler();
connection.setSignalHandler(signal -> { /* handle signals */ });
// Close
connection.close();
connection.close(exitCode);Raw Mode
Enter raw mode for character-by-character input:
Attributes previousAttributes = connection.enterRawMode();
// ... do work ...
connection.setAttributes(previousAttributes);Terminal Attributes
Control terminal behavior:
Attributes attrs = connection.getAttributes();
// Local flags
attrs.setLocalFlag(Attributes.LocalFlag.ICANON, false); // Disable canonical mode
attrs.setLocalFlag(Attributes.LocalFlag.ECHO, false); // Disable echo
attrs.setLocalFlag(Attributes.LocalFlag.IEXTEN, false); // Disable implementation-defined processing
// Input flags
attrs.setInputFlag(Attributes.InputFlag.IXON, false); // Disable XON/XOFF flow control
// Control characters
attrs.setControlChar(Attributes.ControlChar.VMIN, 1); // Minimum read
attrs.setControlChar(Attributes.ControlChar.VTIME, 0); // Timeout deciseconds
connection.setAttributes(attrs);Terminal Size
Size size = connection.size();
int rows = size.getHeight();
int columns = size.getWidth();Handle resize events:
connection.setSizeHandler(newSize -> {
System.out.println("Terminal resized to: " + newSize.getWidth() + "x" + newSize.getHeight());
});TerminalBuilder
Build custom terminal configurations:
import org.aesh.readline.terminal.TerminalBuilder;
Terminal terminal = TerminalBuilder.builder()
.name("myterminal")
.nativeSignals(true)
.streams(System.in, System.out)
.build();Signal Handling
Handle terminal signals:
connection.setSignalHandler(signal -> {
switch (signal) {
case INT: // Ctrl+C
System.out.println("Interrupt received");
break;
case QUIT: // Ctrl+\
System.out.println("Quit received");
break;
case TSTP: // Ctrl+Z
System.out.println("Suspend received");
break;
case CONT: // Continue after suspend
System.out.println("Continue received");
break;
case WINCH: // Window change
System.out.println("Window changed");
break;
}
});Cursor Position
Get current cursor position:
Point position = connection.getCursorPosition();
int row = position.getRow();
int col = position.getColumn();