Overslaan naar hoofdinhoud

Terminal

Openen in ChatGPT
Schaduw dwc-terminal 24.10
Java API

De Terminal component is een interactieve terminalemulator die zich gedraagt als een traditionele systeemconsole. Het behandelt tekstuitvoer, gebruikersinvoer, controle-sequenties en schermbuffers, waardoor het geschikt is voor het bouwen van externe toegangshulpmiddelen, tekstdashboards, ingebedde opdracht-shells of debug-consoles.

Een terminal maken

Het importeren van Terminal

Om de Terminal component in je app te gebruiken, zorg ervoor dat je de volgende afhankelijkheid in je pom.xml opneemt.

<dependency>
<groupId>com.webforj</groupId>
<artifactId>webforj-terminal</artifactId>
</dependency>

Het volgende voorbeeld bouwt een interactieve opdracht-shell met getypte opdrachten, geschiedenisnavigatie en aangepaste uitvoer.

Toon Code

Hoe het werkt

De terminal beheert een rooster van tekstcellen, verwerkt binnenkomende tekenstromen en reageert op gebruikersacties zoals typen of tekstselectie. Het interpreteert automatisch controle-tekens en escape-sequenties voor cursorbeweging, kleurveranderingen en schermwissing.

De kernfunctionaliteiten omvatten:

  • Gegevensinvoer: Het schrijven van gegevens naar de terminal werkt het scherm bij, waarbij zowel tekst als controle-sequenties worden behandeld.
  • Gegevensuitvoer: Vangt gebruikerstoetsen en geeft ze als gestructureerde gebeurtenissen af.
  • Schermbeheer: Onderhoudt een scrollbare geschiedenisbuffer en de huidige schermstatus.
  • Cursorbeheer: Houdt de cursorpositie bij voor tekstinvoer en reacties op controle-sequenties.

De terminal is stateful, wat betekent dat het correct meervoudige bytesymbolen reconstrueert en continuïteit behoudt over gefragmenteerde invoer.

Gegevens naar de terminal verzenden

Gegevens worden naar de terminal gestuurd met de write en writeln methoden:

  • write(Object data): Stuur gegevens in de terminalstroom.
  • writeln(Object data): Stuur gegevens gevolgd door een nieuwe regel.

De terminal verwerkt alle binnenkomende gegevens als UTF-16 strings. Het behandelt automatisch meervoudige bytesymbolen, zelfs wanneer invoer in gefragmenteerde stukjes arriveert.

Voorbeeld

terminal.write("echo Hello World\n");
terminal.writeln("Klaar.");

Je kunt ook een callback toevoegen die wordt uitgevoerd zodra het gegevenspakket is verwerkt:

terminal.write("Lang opdrachtoutput", e -> {
System.out.println("Gegevens verwerkt.");
});

Ontvangen van gebruikersinvoer

De terminal vangt gebruikersgegenereerde invoer via twee gebeurtenissen:

  • Gegevensgebeurtenis (onData): Wordt geactiveerd wanneer er tekstinvoer plaatsvindt, verstuurt Unicode-tekens.
  • Toetsgebeurtenis (onKey): Wordt geactiveerd voor elke toetsaanslag, inclusief informatie over toetscodes en modifiers zoals Ctrl of Alt.

Deze gebeurtenissen kunnen worden gebruikt om gebruikersinvoer naar een backend door te sturen, UI-elementen bij te werken of aangepaste acties te triggeren.

Voorbeeld

terminal.onData(event -> {
String userInput = event.getValue();
backend.send(userInput);
});

terminal.onKey(event -> {
if (event.isControlKey() && "C".equals(event.getKey())) {
backend.send("SIGINT");
}
});

Alle gebruikersinvoer die door de terminal wordt vastgelegd (zoals vanuit onData gebeurtenissen) wordt afgegeven als UTF-16 strings.
Als je backend een andere codering verwacht (zoals UTF-8 bytes), moet je de gegevens handmatig transcoderen.

Legacy encodings

De terminal ondersteunt geen legacy encodings zoals ISO-8859.
Als je compatibiliteit nodig hebt met systemen die geen UTF-8 gebruiken, gebruik dan een externe transcoder (bijvoorbeeld, luit of iconv) om de gegevens te converteren voordat je ze naar de terminal schrijft of ervan leest.

Omgaan met grote gegevensstromen

Omdat de terminal niet onmiddellijk onbeperkte invoer kan weergeven, onderhoudt het een interne invoerbuffer. Als deze buffer te groot wordt (standaard rond de 50MB), kunnen nieuwe binnenkomende gegevens worden verworpen om de systeemprestaties te beschermen.

Om snel gegevensbronnen goed te beheren, moet je flowcontrole implementeren.

Basisflowcontrolevoorbeeld

Pauzeer je backend totdat de terminal een gegevenspakket heeft verwerkt:

pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});

Watermerk-flowcontrolevoorbeeld

Voor efficiëntere controle, gebruik hoge/lage watermerken:

int HIGH_WATERMARK = 100_000;
int LOW_WATERMARK = 10_000;

int bufferedBytes = 0;

pty.onData(chunk -> {
bufferedBytes += chunk.length;

terminal.write(chunk, e -> {
bufferedBytes -= chunk.length;
if (bufferedBytes < LOW_WATERMARK) {
pty.resume();
}
});

if (bufferedBytes > HIGH_WATERMARK) {
pty.pause();
}
});
Toon Code

Aanpassing

Terminal opties

De TerminalOptions klasse stelt je in staat om het gedrag te configureren:

  • Cursor knipperen.
  • Lettertype-instellingen (familie, grootte, gewicht).
  • Scrollback buffer grootte.
  • Regelhoogte en letterafstand.
  • Toegankelijkheidsinstellingen (schermlezer-modus).

Voorbeeld:

TerminalOptions options = new TerminalOptions()
.setCursorBlink(true)
.setFontFamily("Courier New, monospace")
.setFontSize(13)
.setScrollback(5000);

terminal.setOptions(options);

Terminalthema

Je kunt de terminal stylen met TerminalTheme, die het volgende definieert:

  • Achtergrond- en letterkleur.
  • Standaard ANSI kleurenpalet.
  • Cursor- en selecties achtergrondkleuren.

Voorbeeld:

TerminalTheme theme = new TerminalTheme();
theme.setBackground("#1e1e1e");
theme.setForeground("#cccccc");
terminal.setTheme(theme);
Toon Code

Ondersteunde sequenties

De terminal ondersteunt een breed scala van standaard controle-sequenties die worden gebruikt voor cursorbeweging, schermupdates en tekstopmaak.

Herkenbare groepen:

  • C0 controlecodes (één-byte 7-bit opdrachten, \x00, \x1F, zoals backspace en line feed)
  • C1 controlecodes (één-byte 8-bit opdrachten, \x80, \x9F)
  • ESC sequenties (begint met ESC (\x1B), zoals het opslaan/herstellen van de cursor, schermuitlijning)
  • CSI sequenties (Control Sequence Introducer, ESC [ of CSI (\x9B), voor operaties zoals scrollen, wissen en stijlen)
  • DCS sequenties (Device Control Strings, ESC P of DCS (\x90))
  • OSC sequenties (Operating System Commands, ESC ] of OSC (\x9D), voor het instellen van windowtitel, hyperlinks en kleuren)
Omgaan met exotische en aangepaste sequenties

Sommige exotische sequentietypen zoals APC, PM en SOS worden herkend maar stilzwijgend genegeerd.
Aangepaste sequenties kunnen worden ondersteund via integraties indien nodig.

Styling

Loading...