Übersicht Beispiele Material English

Eine Ebene für Sonderzeichen

Einleitung

Als Programmierer muss man oft Sonderzeichen tippen. Es liegt daher nahe, beim Entwurf einer alternativen Belegung Sonderzeichen zu berücksichtigen. Im Folgenden wird beschrieben, wie man das mit dem Optimierer machen kann. Die Sonderzeichen liegen dabei in einer «dritten Ebene», wie man sie etwa von Neo 2 kennt.

Voraussetzungen

Ich nehme an, dass Sie den Optimierer heruntergeladen und grob verstanden haben. Der Optimierer und seine Dokumentation finden Sie auf der Übersichtsseite. Für diesen Artikel habe ich Version 1.246 benutzt. Hier ist eine Sammlung von Files, um diesen Artikel leichter nachvollziehen zu können:

Begleitmaterial herunterladen

Da die Häufigkeit von Sonderzeichen von der Programmiersprache, und die Häufigkeit, mit der man sie tatsächlich tippen muss, zudem von der Programmierumgebung abhängt, hat jeder und jede andere Anforderungen. Der erste und schwierigste Schritt ist daher die Erstellung einer persönlichen Textsammlung. Das Begleitmaterial enthält Häufigkeitsfiles, allerdings nur zur Demonstration. Deswegen verrate ich nichts über ihre Zusammenstellung.

Optimierung

Vorgehensweise

Eine der grössten Beschränkungen des Optimierers ist, dass man vorgeben muss, welche Zeichen ein Paar bilden, das sich eine Taste teilt, und welches Zeichen im Paar mit Shift eingegeben werden muss. Diese Beschränkung ist keine, solange man sich nur mit Buchstaben befasst. Für Sonderzeichen ist sie hinderlich.

Um die Beschränkung aufzuweichen, erlaubt es der Optimierer, mehrere Tasten für den gleichen Ort festzulegen. Jeder davon entspricht eine Festlegung von Zeichen. Bei der Zeichenfestlegung gibt man statt Zeichenpaaren für die erste Ebene nur ein Zeichen an, für die zweiten Ebene ein Zeichenpaar, dessen erstes Zeichen ein Platzhalter ist. Damit sind erste und zweite Ebene entkoppelt, allerdings ist die Zuweisung von Zeichen zu Ebenen immer noch vorgegeben.

Eine weitere Beschränkung ist, dass der Optimierer nur zwei Ebenen richtig unterstützt, wir aber drei Ebenen haben wollen. Wenn wir strikt wie eben erklärt vorgehen, müssen wir die Ebene mit den Grossbuchstaben weglassen. Wir könnten sie auch beibehalten und so tun, als wären die Shifttasten und die Tasten, mit der man auf die dritte Ebene wechselt, identisch. Wenn diese Tasten auf denselben Fingern liegen, wäre das nicht allzu falsch. Ich habe mich trotzdem für die erste Methode entschieden, mit dem Kunstgriff, die Shifttasten wie tote Tasten zu behandeln.

Wir gehen von einer bestehenden Belegung für die Buchstaben und die wichtigsten Satzzeichen aus, im Beispiel von «Aus der Neo-Welt» ohne «ß». Diese wird nicht verändert, aber bei der Optimierung der Lage der Sonderzeichen berücksichtigt. Man könnte auch versuchen, Buchstaben und Sonderzeichen in einem Schritt zu behandeln. Das zweistufige Verfahren wird verwendet, weil es schneller ist, dem Vorrang von normalen Texten vor Programmtexten Rechnung trägt und es erlaubt, Grossbuchstaben als tote-Taste-Folgen zu behandeln. Denn dazu muss man zumindest wissen, auf welcher Seite der Tastatur jeder Buchstabe liegt, damit man die richtige Shifttaste in der tote-Taste-Folge angeben kann.

Durchführung

Die Buchstaben und Satzzeichen legt man in der Konfiguration fest auf die Tasten, auf die sie gemäss der Ausgangsbelegung gehören. Zum Beispiel liegt «k» bei «Aus der Neo-Welt» auf QWERTZ-Q:

FixesZeichen AD01 'k'

Die Shifttasten der Ausgangsbelegung definiert man zu normalen Tasten um

Taste  LSGT   1  3    1.00  3   -5   -   5
Taste  RTSH  13  3   12.00  3    5   -   7

und belegt sie fest mit Zeichen, die für in den tote-Tasten-Folgen verwendet werden. Wir nehmen für die linke und für die rechte Shifttaste

FixesZeichen LSGT '←'
FixesZeichen RTSH '→'

und benutzen sie in den Folgen, mit der die Eingabe von Grossbuchstaben angenähert wird. Zum Beispiel ist «k» bei «Aus der Neo-Welt» links, daher braucht man für ein «K» die rechte Shifttaste, was die tote-Taste-Folge

Ersatz 'K→k'

ergibt.

Für jedes Sonderzeichen führt man eine neue Taste ein, zum Beispiel die Taste BD01, die an derselben Stelle (QWERTZ-Q) wie AD01 liegt:

Taste  AD01   2  1    1.25  1   -5   -   5.
Taste  BD01   2  1    1.25  1   -5   -   5.

Des weiteren führt man die Sonderzeichen selbst ein, zum Beispiel das Kleiner-Zeichen als

Zeichen '¦<'

Das ¦ ist dabei der Platzhalter und wird mit

Platzhalter '¦'

festgelegt. Wie weiter oben erklärt, brauchen wir den Platzhalter, weil unsere Sonderzeichen auf die dritte Ebene kommen sollen, also nur in Verbindung mit einer Umschalttaste erreichbar sind. Daher darf das Sonderzeichen nicht als erstes in einer Zeichen-Festlegung kommen.

Dann müssen wir die Ebene-drei-Umschalttasten anlegen. Im Beispiel verwende ich die linke Shifttaste und die QWERTZ-Ä-Taste:

ShiftL LFSH   0  3    0.00  3   -5   -   7
ShiftR BC11  13  2   11.50  2    5   -   5

Wenn man eine Textsammlung verwendet, die ausschliesslich aus Programmquellen besteht, ist die Zeichenhäufigkeit darin nicht repräsentativ für die Tipparbeit insgesamt, und daher die Fingerbelastung nicht richtig zu berechnen. Dann kann man die entsprechenden Aufwände einfach auf Null setzen:

Fingerbelastung  0 0 0 0 0  0 0 0 0 0

Alternativ kann man eine Textsammlung zusammenstellen, in der normale Texte und Programmtext in realistischem Verhältnis umfasst und die Aufwände unverändert lassen. So wird es im Beispiel gemacht.

Schliesslich muss noch der Optimierer für die richtige Anzahl Tasten übersetzt werden, wobei man die Option -DOHNE2SHIFT nicht verwenden darf:

g++ -std=c++11 -Wall -Ofast -DNDEBUG -DTASTENZAHL=66 -DMIT_THREADS -pthread opt.cc -o opt66

Dann endlich ist der Computer dran

./opt66 -K ebene3.cfg -2 demo.txt -t 4

Ergebnis

Das Ergebnis hängt natürlich von der Textsammlung ab. Mit den Häufigkeitsfiles aus dem Begleitmaterial bekommt man

                 385.537 Gesamtaufwand  283.415 Lageaufwand        links rechts
                   2.465 Kollisionen      8.725 Shift-Kollisionen  ob  5.2 11.5
  ?*-+# |}:{…%    67.945 Handwechsel     39.673 Shift-Handwechsel  mi 29.5 34.6
  =_(/> ])\;<      0.828 Ein-/Auswärts   26.908 Ein- oder auswärts un 11.1  8.1
 ←`&^"! $@['~→     8.773 benachbart       6.677 Shift-benachbart  sum 45.8 54.2
                 11.7 11.7  9.6 12.8 --.- --.- 17.7  9.5 11.1 16.0 Sh  6.2  7.2
Version 23. Mär 2017Impressum