1 Punkte von GN⁺ 2024-07-09 | 1 Kommentare | Auf WhatsApp teilen

Warum Texteingabe im Terminal komplex ist

  • Als auf Mastodon gefragt wurde, was Menschen bei der Arbeit im Terminal verwirrend finden, stach besonders „das Bearbeiten bereits eingegebener Befehle“ hervor
  • Es soll erklärt werden, warum Texteingabe im Terminal schwierig ist, und es werden einige nützliche Tipps geteilt

Fehlende Konsistenz zwischen Programmen

  • Verschiedene Programme gehen nicht konsistent mit Texteingaben um
    • Einige Programme (cat, nc, git commit --interactive usw.) unterstützen die Pfeiltasten überhaupt nicht
    • Viele Programme (irb, python3 usw.) verwenden die readline-Bibliothek und bieten damit Grundfunktionen
    • Einige Programme unterstützen nur sehr grundlegende Funktionen
    • Einige Programme haben ein vollständig angepasstes Eingabesystem

Modus 1: Grundzustand

  • Der Grundzustand, in dem ein Programm Texteingaben einfach entgegennimmt
    • Bietet grundlegende Funktionen wie Texteingabe, Backspace, Ctrl+W, Ctrl+U usw.
    • Mit dem Befehl stty -a lassen sich alle unterstützten Ctrl-Codes anzeigen

Modus 2: Tools mit readline

  • readline ist eine GNU-Bibliothek, die Texteingabe komfortabler macht
    • Sie bietet nützliche Tastenkürzel wie Ctrl+E, Ctrl+A, Ctrl+left/right arrow, Ctrl+R usw.
    • Viele Programme wie bash, psql, irb und python3 verwenden readline

Tipp: readline mit rlwrap nutzen

  • Mit rlwrap können auch Programme ohne eingebaute readline-Unterstützung readline-Funktionen nutzen

Warum Tools readline nicht verwenden

  • Zum Beispiel weil ein Programm sehr einfach ist, wegen Lizenzfragen oder weil es nur wenig Interaktion gibt

Wie man erkennt, ob readline verwendet wird

  • Wenn beim Drücken von Ctrl+R reverse-i-search erscheint, ist es sehr wahrscheinlich, dass readline verwendet wird

Ursprung der readline-Keybindings

  • Die Keybindings von readline stammen aus Emacs

Modus 3: Andere Eingabebibliotheken (libedit usw.)

  • /usr/bin/python3 auf dem Mac verwendet libedit und unterstützt daher nur einen Teil der readline-Funktionen

Modus 4: Angepasste Eingabesysteme

  • Texteditoren wie nano, micro, vim, emacs und Shells wie fish haben angepasste Eingabesysteme
  • Solche angepassten Systeme sind oft von readline inspiriert

Viele Shells unterstützen vi-Keybindings

  • bash, zsh, fish usw. unterstützen einen „vi-Modus“ für die Texteingabe

Es hilft, den Kontext zu verstehen

  • Wer beim Eingeben von Text an der Kommandozeile den jeweiligen Kontext versteht, erlebt das Verhalten als vorhersehbarer und weniger verwirrend

Was in diesem Beitrag nicht behandelt wird

  • Probleme rund um ssh und tmux, die Umgebungsvariable TERM, Copy-and-paste-Unterstützung in verschiedenen Terminals, Unicode usw.

Zusammenfassung von GN⁺

  • Es wird erklärt, warum Texteingabe im Terminal komplex ist und warum es zwischen verschiedenen Programmen an Konsistenz fehlt
  • Es wird gezeigt, wie Bibliotheken wie readline die Texteingabe komfortabler machen können
  • Es gibt den Tipp, mit rlwrap readline-Funktionen nachzurüsten
  • Es wird betont, wie wichtig es ist, beim Arbeiten im Terminal den Kontext zu verstehen

1 Kommentare

 
GN⁺ 2024-07-09
Hacker-News-Kommentare
  • Julias Beiträge sind immer gut

    • In Shell-Skripten kann man mit stty ändern, wie das Terminal Eingaben verarbeitet
    • Es wurde ein Experiment geteilt, das Tastenkombinationen und Mausgesten in VT100-kompatiblen Terminals erfassen und interpretieren kann
    • Die Demo kann mit dem Befehl bash -c "$(curl -L https://git.io/fjToH)" ausgeführt werden
    • Mit vi | cat -v kann man die VT100-Escape-Sequenzen interaktiver Programme ansehen
  • Dinge, die im Artikel fehlen

    • breite Zeichen
    • unterschiedliche ANSI-Escape-Sequenzen je nach Tastaturmodus
    • verschiedene TTY-Zustände
    • je nach OS unterschiedliche Systemaufrufe zum Ändern des TTY-Zustands
    • Unterschiede bei der Unterstützung der Terminalemulation
    • fehlender Konsens darüber, wie Terminalfunktionen geprüft werden sollten
  • Wenn man in bash $EDITOR setzt, kann man mit Ctrl-X Ctrl-E die aktuelle Zeile an $EDITOR senden

  • Vor 20 Jahren wurde mit readline ein Mehrzeilen-Editor gebaut

    • inklusive Neuzeichnen bei Cursorbewegungen und Änderungen der Terminalgröße
    • Ich würde ihn gern in Rust neu schreiben und als kleine Bibliothek veröffentlichen
  • Eine Frage dazu, wie die Funktion fgets() arbeitet

    • fgets() blockiert standardmäßig, bis der Benutzer eine neue Zeile eingibt
    • Der Zeilenpuffer kann mit den Shortcuts Backspace, Ctrl+W und Ctrl+U bearbeitet werden
  • Die Meinung, dass das Terminal einer der Gründe für den geringeren Marktanteil von Linux ist

    • Die Nutzung des Terminals ist komplex
  • Ein Gegenargument zu der Aussage, dass die dash-Shell keine Pfeiltasten unterstützt

    • Wenn sie mit libedit kompiliert wird, unterstützt sie einen Bearbeitungsmodus
    • Der POSIX-Standard verlangt Unterstützung für set -o vi
  • Drei grundlegende readline-Keybindings, die für viele nützlich sind

    • Ctrl+W: letztes Wort löschen
    • Ctrl+O: die nächste Zeile aus der Historie ausführen
    • Ctrl+R: rückwärts in der Historie suchen
  • Beschwerde darüber, wie Ctrl-C und Ctrl-V im Windows Terminal funktionieren

    • Linux-Terminal-Apps verhalten sich nicht wie Windows Terminal
  • Ein Kommentar, der an einen klassischen Artikel von Linus erinnert