Open Source im professionellen Einsatz

Tipp: Akzente und andere Sonderzeichen mit Tk

Weckt Tote auf

Deadkeys helfen jedem User Sonderzeichen mit Akzenten einzutippen. Allerdings sind diese Tottasten auf vielen Linux-Systemen abgeschaltet. Mit Tk und dem hier vorgestellten Paket fällt diese Barriere.

Die so genannten Tottasten stammen noch aus der Zeit der mechanischen Schreibmaschine. Sie werden vor einem Vokal gedrückt und erzeugen einen Akzent, bewegen den Wagen aber nicht vorwärts. Damit lassen sich praktisch alle westeuropäischen Akzente erzeugen, nur die Tilde für - fehlt oft. Für den Accent circonflex sind zwei Tottasten nötig (Accent aigu und Accent grave), per Grad-Zeichen entsteht ein Œ.

Unter Windows funktioniert das ebenfalls recht gut, nach dem Drücken von [«] gefolgt von der [E]-Taste erscheint Ž am Bildschirm. Aber bei vielen Linux-Installationen nehmen die X11-Tastaturlayouts »de-latin1-no-deadkeys« sowie »Option "Xkb-Variant" "no-deadkeys"« den Tottasten ihre Sonderfunktion. Sie setzen sofort den Akzent auf ein Leerzeichen, statt Ž erscheint «e. Als Ausweg bleibt oft nur, das Zeichen umständlich per Menüfunktion zu holen oder aus der Manpage »iso-8859-1« zu kopieren.

Ohne Hilfe des X-Servers

Die Konfigurationsdatei des X-Servers dürfen weder User noch Programmierer ändern. Findige Entwickler umgehen das und simulieren die Tottasten in ihren eigenen Tcl-Programmen. Listing 1 zeigt, wie das funktioniert. Die ausführliche Version auf [ftp://ftp.linux-magazin.de/pub/magazin/2005/03/Deadkeys/] belegt weitere Kombinationen sinnvoll mit diakritischen Zeichen.

Das Paket ergänzt die Bindings der Widget-Klassen »Entry« und »Text« (Zeile 2). Die Tottasten ändern die globale Variable »switch« (Zeilen 4 bis 6). Der Umschaltmodus kann leer sein (normale Eingabe) oder »acute« (Accent aigu), »grave« (Accent grave), »circum« (Accent circonflex), »degree« (Ring-Akzent) oder »tilde« (Tilde-Akzent) enthalten. Drückt der Anwender ein Zeichen, das einen Akzent erhalten könnte, wertet das Skript die Variable »$switch« aus (Zeile 13). Je nach Umschaltmodus fügt es das veränderte Zeichen mit Akzent ein.

Türkische Sonderzeichen

Damit gelingt es auch, türkische Sonderzeichen einzugeben (Abbildung 1): Für das kleine i ohne Punkt, das große I mit Punkt, und ‚ sowie kleine und große s und g mit Häkchen nutzt das Paket die Tottaste [¡], also den Ring-Akzent. Fürs Spanische bringen [¡]+[!] und [¡]+[?] die umgedrehten Satzzeichen Á und À in den Text.

Für die Zeichen ¿ und ¯ der skandinavischen Sprachen ist leider keine Belegung mehr frei, weil es das o mit allen anderen Akzenten gibt. Hier wäre eine zusätzliche Tottaste nötig, etwa [#]. Mit ihr könnte das Programm auch griechische Buchstaben oder weitere diakritische Zeichen verstehen, beispielsweise den Punkt auf einem Buchstaben, Hacek-Akzente, doppelte Akzente, den Strich-Akzent und weitere.

Abbildung 1: Mit etwas Tk-Code ist es leicht, diese Sonderzeichen einzutippen.

Abbildung 1: Mit etwas Tk-Code ist es leicht, diese Sonderzeichen einzutippen.

Die Unicode-Zeichencodes der Alphabete sind auf [http://www.unicode.org/charts/] zu finden. Für das lateinische Alphabet plus Sonderzeichen sind die ersten vier Tabellen zuständig: Basic Latin, Latin-1 Supplement, Latin Extended-A und Latin Extended-B.

Für eigene Tastaturzuordnungen muss der Programmierer die passenden Codes für das »bind«-Kommando kennen:

pack [text .t] -expand y -fill both
bind .t <KeyPress> {
  .t insert end "t%%K=%K %%A=%An"
  .t see end
}


Dieses Skript fügt am Ende eines Textwidget den Code für jede gedrückte Taste ein. Auch ausgefallene Kombinationen sind damit zu meistern. (fjl)

Listing 1: Ausschnitte aus
Deadkeys

01 set switch ""
02 foreach class [list Text Entry] {
03   bind $class <KeyPress-acute> {
04     if {$switch == ""} { 
05       set switch "acute"
06     } else { set switch "" }
07     break
08   }
09   [...]
10   bind $class <Key> {
11     set i_ch "%A"
12     if {$switch ne "" && "%A" ne "{}"} {
13       if {$switch eq "acute"} {
14         switch -- %A {
15          " " {set i_ch "u00b4"}
16           a  {set i_ch "u00e1"}
17           A  {set i_ch "u00c1"}
18           e  {set i_ch "u00e9"}
19           E  {set i_ch "u00c9"}
20           [...]
21         }
22       } [...]
23     }
24
25     if {$i_ch ne "{}"} {
26       %W insert insert "$i_ch"
27       set switch ""
28     }
29   }
30 }

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook