blog · git · desktop · images · contact & privacy · gopher


Vergessene Funktion des Tages: Scroll-Lock in XTerm

Ich behaupte, dass so gut wie niemand heute noch die Scroll-Lock-Taste benutzt. Eigentlich möchte ich auch noch einen Schritt weiter gehen und behaupten, dass viele Leute ihre Bedeutung gar nicht (mehr?) kennen. Zumindest drängt sich mir dieser Eindruck auf, wenn ich in der Suchmaschine meiner Wahl nach „Scroll Lock“ suche. Und wie wir alle wissen, ist das eine repräsentative Quelle. :-)

Dabei ist die Taste und ihre Funktion äußerst nützlich – insbesondere dann, wenn man viel an Terminals unterwegs ist und nicht ständig zur Maus greifen möchte. Allerdings sagt die Wikipedia, dass es auch in Microsoft Excel noch funktioniert. In LibreOffice tut’s das übrigens nicht.

Okay, wofür ist die Taste gut? Drückt man sie, so soll man mit den Cursortasten scrollen können anstatt den Cursor zu bewegen. Außerdem wird als Folge dessen das automatische Weiterscrollen bei neuer Ausgabe auf dem Bildschirm deaktiviert. Drückt man Scroll-Lock noch einmal, dann wird wieder das normale Verhalten hergestellt.

Man stelle sich nun vor, dass am Terminal viel Text erzeugt wird, zum Beispiel durch einen Lauf von „./configure“. Normalerweise scrollt der Text einfach so über’s Terminal. Vielleicht will man aber kurz anhalten und genauer nachlesen, was da eben vorbeigerauscht ist. Wie kann man das erreichen?

Eine Möglichkeit stellt Strg+S dar, was ein SIGSTOP an die aktuelle Prozessgruppe sendet und sie dadurch anhält. Dann kann ich scrollen und danach mit Strg+Q ein SIGCONT senden und weitermachen.

Vielleicht will ich aber gar nicht, dass die Prozesse stehenbleiben. Oder vielleicht ist es ein zeitkritischer Prozess und er darf nicht stehenbleiben. Hier kommt nun Scroll-Lock ins Spiel. Wenn das Terminal diese Funktion unterstützt, dann kann man damit das automatische Weiterscrollen unterbinden. Neuer Text wird dann außerhalb des aktuellen „Viewports“ erscheinen, man muss also aktiv nach unten scrollen, um ihn zu sehen.

In XTerm ist diese Funktion standardmäßig abgeschaltet. Die Begründung dafür ist in der Manpage, dass der User nicht verwirrt werden soll. :-) Man kann es über X-Ressourcen wieder anschalten:

XTerm*allowScrollLock: true

Leider ist die Semantik von Scroll-Lock wohl nicht eindeutig genug spezifiziert (oder es verwendet einfach so gut wie niemand), weshalb XTerm nur das automatische Weiterscrollen deaktiviert. Ein manuelles Scrollen mit den Cursortasten ist nicht möglich. Deswegen habe ich mir, weil es auch allgemein nützlich ist, folgende Keybinds angelegt:

XTerm*VT100.Translations: #override \
        Shift<Key>Prior: scroll-back(1,halfpage) \n\
        Shift<Key>Next: scroll-forw(1,halfpage) \n\
        Shift<Key>Up: scroll-back(1,line) \n\
        Shift<Key>Down: scroll-forw(1,line) \n\
        Ctrl<Key>plus: larger-vt-font() \n\
        Ctrl<Key>minus: smaller-vt-font() \n

(Die letzten beiden haben nichts mit dem Thema zu tun, sind aber IMHO trotzdem interessant: Damit kann man mal eben die Schriftgröße ändern.)

Shift+CursorUp scrollt nun eine Zeile nach oben, Shift+PageUp eine halbe Seite nach oben – andere Richtung analog. Das funktioniert sowohl bei aktiviertem Scroll-Lock als auch im normalen Betrieb.