Wprowadzanie znaków niedostępnych na klawiaturze
Kategoria: Artykuły, etykiety: x.org, nietypowe znaki
Dodany: 2011-04-03 11:55
(zmodyfikowany: 2011-12-19 23:41)
Przez: Minio
Wyświetleń: 61374
Wprowadzenie
W Polsce de facto standardem są klawiatury z amerykańskim układem klawiszy. Klawiatury te wyposażone są w około 105 klawiszy (często więcej) pozwalających wprowadzić wszystkie widzialne znaki z zakresu ASCII. Problem w tym, że standard ASCII powstał w latach 60. XX wieku na użytek amerykańskiej armii. W tamtych czasach nikomu nawet nie mogło przyjść na myśl, że kiedyś komputer będzie standardowym wyposażeniem każdego domu, wykorzystywanym przez ludzi posługujących się bardzo wieloma językami, często nawet nie opartymi o alfabet łaciński.
Pomijając dalszą część tej burzliwej historii, jej konsekwencje są widoczne do dzisiaj. Klawiatury, których używamy, potrafią wprowadzić bardzo ograniczoną liczbę znaków, która tak naprawdę nie jest nawet wystarczająca dla potrzeb języka polskiego — standardowa dostępna w Polsce klawiatura nie ma możliwości wprowadzenia polskich cudzysłowów i wielokropka, a aż cztery poziome kreski (minus, dywiz, półpauzę i pauzę) degraduje do zaledwie jednego minusa.
Na szczęście standardowy interfejs graficzny w Linuksie — X.org — udostępnia szereg mechanizmów pozwalających wyjść poza ograniczenia klawiatury podłączonej do komputera. W niniejszym artykule chciałbym przyjrzeć się najważniejszym z nich.
Tablice znaków
Najprostszym rozwiązaniem jest korzystanie z tablic znaków (ang. character picker), czyli specjalnych aplikacji udostępniających wiele znaków gotowych do skopiowania. Np. program Writer z pakietu LibreOffice posiada wbudowaną tablicę znaków, dostępną w menu pod Wstaw → Znak specjalny. Jednak uruchamianie pakietu Office za każdym razem, gdy chce się wprowadzić niedostępny na klawiaturze znak, jest raczej mało wygodne. Dlatego lepiej jest skorzystać z dedykowanych aplikacji. Dla środowiska GNOME (i innych opartych na GTK) zaleca się używanie gucharmap, zaś w KDE można skorzystać z kcharselect. Oba programy dysponują zbliżonym zestawem funkcji, takich jak wyszukiwanie, segregowanie znaków wg grup funkcjonalnych albo szczegółowe informacje o znaku.
Chociaż korzystanie z tablic znaków jest proste i intuicyjne, na dłuższą metę jest także nieefektywne. Tablice znaków są pomocne gdy potrzeba raz na jakiś czas wprowadzić jakiś nietypowy znak, nie sprawdzą się jednak, jeżeli potrzeba napisać dłuższy tekst w obcym języku zawierającym wiele znaków diakrytycznych (np. po duńsku).
AltGr
AltGr jest klawiszem, z którego Polacy korzystają na co dzień. Dzięki niemu możemy wprowadzać polskie litery diakrytyczne, takie jak ą
czy ś
. Niewiele osób jednak wie, że linuksowa mapa klawiatury dla języka polskiego dostarcza również dowiązania dla innych liter niż te, z których korzystamy. Np. wciskając AltGr i m
uzyskuje się grecką literę My (µ
), powszechnie stosowaną np. w fizyce. Inne kombinacje najlepiej poznać po prostu próbując wciskać różne klawisze z jednocześnie wciśniętym klawiszem AltGr.
W większości systemów AltGr przypisany jest do prawego klawisza alt. Można jednak to zmienić, wydając jako root polecenie
dpkg-reconfigure keyboard-configuration
Wraz z wydaniem Squeeze twórcy Debiana zunifikowali konfigurację klawiatury dla X.org oraz terminala tekstowego, dzięki czemu z dobrodziejstw klawisza AltGr można korzystać w obu tych środowiskach.
Zmiana znaków wprowadzanych przy pomocy AltGr
Znaki wprowadzane przy pomocy AltGr (i nie tylko) można zmienić przy pomocy cokolwiek zapomnianego programu jakim jest xmodmap
(w Debianie w pakiecie x11-xserver-utils). Jego składnia jest bardzo prosta i umożliwia przypisanie do ośmiu różnych znaków do każdego klawisza (przy czym cztery z nich nie są obsługiwane przez X.org). Kolejność znaków jest następująca:
- klawisz wciśnięty bez żadnego modyfikatora
- klawisz wciśnięty wraz z Shiftem
- znak nieosiągalny
- znak nieosiągalny
- klawisz wciśnięty wraz z modyfikatorem (AltGr)
- klawisz wciśnięty wraz z Shiftem i modyfikatorem (AltGr)
- znak nieosiągalny
- znak nieosiągalny
Aby przypisać znaki do danego klawisza, potrzebna jest polecenie xmodmap:
keycode <KOD> = <znak1> <znak2> <znak3> <znak4> <znak5> <znak6> <znak7> <znak8>
Jak wspomniałem, znaków 3, 4, 7 i 8 nie ma potrzeby ustawiać, ponieważ nie ma żadnego sposobu żeby je wprowadzić z klawiatury. Przyjmuje się, że znak3 jest powtórzeniem znaku1, zaś znak4 — znaku2.
Zacznijmy od początku.
Po słowie kluczowym keycode
ma nastąpić kod klawisza. Skąd go wziąć? Pomocny okazuje się program xev
(z pakietu x11-utils). Jest to program przekazujący informacje o zdarzeniach X11 na standardowe wyjście, przeznaczony głównie dla programistów aplikacji działających wewnątrz X.org. Należy go uruchomić w terminalu (potrzebne informacje wypisuje na standardowe wyjście, a będziemy musieli je jakoś odczytać). Pokaże się białe okno, a terminal zostanie zapełniony wieloma informacjami. Po wciśnięciu dowolnego klawisza w terminalu ukaże się coś podobnego do poniższego fragmentu:
KeyRelease event, serial 36, synthetic NO, window 0x2600001,
root 0x106, subw 0x0, time 2397528, (170,-12), root:(286,126),
state 0x10, keycode 20 (keysym 0x2d, minus), same_screen YES,
XLookupString gives 1 bytes: (2d) "-"
XFilterEvent returns: False
Najbardziej interesujące są trzecia i czwarta linijka. Z trzeciej można wyczytać kod klawisza oraz jego nazwę przypisaną w X.org, zaś w czwartej jego graficzną reprezentację. Jak widać, klawisz minusa (ten między zerem a plusem w górnej partii klawiatury) ma kod 20, nazwę minus
i odpowiada mu symbol -
.
Kod klawisza jest informacją niezbędną by modyfikować mapowanie klawiatury X.org, ale nie wystarczającą. Potrzebne są jeszcze nazwy znaków które zostaną przypisane do danego klawisza. Można je odczytać z pliku nagłówka X11/keysymdef.h (należy posługiwać się nazwami bez prefiksu XK_
), ale znacznie prościej jest posługiwać się identyfikatorami Unicode (które można odczytać z wspomnianych już tablic klawiszy), np. U003B
dla średnika.
Mając kod klawisza i identyfikatory znaków, które chcemy danemu klawiszowi przypisać, możemy już przystąpić do uruchomienia xmodmap
. Jednak w większości przypadków nie chcemy całkowicie zmieniać znaków wprowadzanych przez dany klawisz, a tylko zmienić znak osiągalny dzięki wciśnięciu tego klawisza z którymś z modyfikatorów. Aby więc sobie ułatwić pracę, sprawdźmy najpierw jaki znaki są przypisane minusowi:
$ xmodmap -pke |grep 20
keycode 20 = minus underscore minus underscore backslash questiondown
Jak widać, minus z Shiftem da podkreślnik (_
), z AltGr odwrócony ukośnik (\
) zaś z Shiftem i AltGr „odwrócony” pytajnik (¿
). Odwrócony ukośnik można wprowadzić wciskając odpowiedni klawisz, więc nie ma potrzeby wprowadzania go jeszcze przez AltGr + -
. Zamiast niego przypiszemy piękną, poprawną typograficznie pauzę. Polecenie dla xmodmap
będzie występowało następująco:
keycode 20 = minus underscore minus underscore U2013 questiondown
Wystarczy teraz uruchomić
xmodmap -e 'keycode 20 = minus underscore minus underscore U2013 questiondown'
aby cieszyć się pauzą przypisaną do AltGr + -
.
Wprowadzone zmiany są natychmiastowe, ale trwają tylko do końca sesji. Poza tym jeżeli chcemy zmodyfikować znaki wprowadzane przez kilka (lub kilkanaście) klawiszy, uruchamianie wielu podobnych poleceń nie jest tym, co tygryski lubią najbardziej. Zamiast tego można polecenia wpisać do pliku i kazać xmodmap
zinterpretować treść tego pliku właśnie. Zazwyczaj plik nazywa się .Xmodmap
lub .xmodmaprc
i mieści się bezpośrednio w katalogu domowym użytkownika. Wczytuje się go następująco:
xmodmap ~/.Xmodmap
Teraz wystarczy upewnić się, że powyższe polecenie jest uruchamiane wraz z serwerem X lub wybranym środowiskiem graficznym/menedżerem okien.
Martwy klawisz (ang. dead key)
Niewiele osób wie, że AltGr służy też — do pewnego stopnia — jako martwy klawisz. Martwy klawisz jest specjalnym typem modyfikatora, który nie tyle zmienia aktualny układ klawiatury, ile zmienia znak wprowadzony zaraz po nim. Aby skorzystać z martwego klawisza, należy najpierw go wcisnąć, potem puścić i wcisnąć wybrany znak.
Domyślnie martwy klawisz w Linuksie pozwala wprowadzić sześć rodzajów znaków diakrytycznych, uzyskując szereg liter diakrytycznych dla języków europejskich. Są to (purystów proszę o wybaczenie ordynarności określeń):
- AltGr +
[
→ dwie kropki (jak wö
) - AltGr +
]
→ fala (jak wõ
) - AltGr +
\
→ kreska od lewej góry do prawego dołu (jak wò
) - AltGr +
;
→ kreska od lewego dołu do prawej góry (jak wó
) - AltGr +
'
→ daszek (jak wô
) - AltGr +
/
→ kropka na dole (jak wọ
)
Tak więc aby uzyskać literę ö
należy jednocześnie wcisnąć AltGr oraz [
(otwarcie nawiasu kwadratowego), puścić je i wcisnąć o
. Znaki diakrytyczne można dodać tylko do niektórych liter (głównie samogłosek). Niektóre litery posiadają wersje zmodyfikowane tylko wybranymi znakami diakrytycznymi (np. c
posiada wersję z kreską od lewego dołu do prawej góry — ć
— oraz daszkiem — ĉ; nie posiada jednak wersji z dwiema kropkami, falą, kreską od lewej góry do prawego dołu oraz kropką na dole).
Stosowanie martwego klawisza pozwala w wygodny sposób uzyskać znaki z wielu alfabetów europejskich, jednak nie ze wszystkich i nie wszystkie. Tą metodą nie sposób uzyskać niemieckiego ß
albo skandynawskiego ø
(„przekreślone” o).
Z dobrodziejstw martwego klawisza można również w ograniczonym stopniu korzystać w terminalu tekstowym.
Klawisz Compose (ang. compose key)
Klawisz Compose, którego nazwa nie ma odpowiednika w języku polskim, to prawdziwa potęga jeśli chodzi o wprowadzanie niestandardowych znaków. Klawisz ten był fizycznie obecny na niektórych klawiaturach wiele lat temu (takie klawiatury wciąż można znaleźć w Polsce, zwłaszcza w niektórych instytucjach publicznych, jak uniwersytety czy biblioteki), jednak większość dziś dostępnych na rynku klawiatur już go nie posiada. Domyślnie klawisz Compose nie jest aktywny i trzeba go ręcznie przypisać do jakiegoś innego klawisza (tracąc jego funkcję). Aktywacja zależy od używanego systemu i środowiska graficznego.
Ze swojej strony polecam przypisać klawisz Compose do prawego klawisza Control albo prawego klawisza Windows (jeżeli Twoja klawiatura ma dwa, co jest już coraz rzadziej spotykane). Są to rozwiązania najmniej inwazyjne, które nie powinny negatywnie wpłynąć na funkcjonalność klawiatury.
Debian 6.0 i późniejsze
W Debianie Squeeze oraz późniejszych wystarczy wydać polecenie
dpkg-reconfigure keyboard-configuration
Na czwartym z kolei ekranie można wybrać umiejscowienie klawisza Compose. Zmiany będą widoczne po zrestartowaniu komputera zarówno w X.org jak i terminalu tekstowym.
GNOME 2
Umiejscowienie klawisza Compose można wybrać w preferencjach klawiatury, wybierając w menu System: Preferencje → Klawiatura → karta Układy → przycisk Opcje → Compose Key Position (należy rozwinąć nagłówek i wybrać odpowiednią pozycję).
Warto wiedzieć, że GNOME2 posiada własne sekwencje klawisza Compose, wpisane na sztywno w kod źródłowy. Nie można ich modyfikować. Można jednak poprosić GNOME, żeby korzystał z sekwencji serwera X. Aby to zrobić wystarczy do pliku $HOME/.profile
(jeżeli go nie masz, utwórz go) dopisać:
export GTK_IM_MODULE="xim"
KDE 4.4 i wcześniejsze
Umiejscowienie klawisza Compose można wybrać w preferencjach klawiatury, wybierając w menu System Settings → Regional & Language → Keyboard Layout → w karcie Layout zaznaczyć Enable keyboard layouts → w karcie Advanced wybrać umiejscowienie klawisza Compose
KDE 4.5 i nowsze
Umiejscowienie klawisza Compose można wybrać w preferencjach klawiatury, wybierając w menu Ustawienia systemowe → Urządzenia wejściowe → karta Klawiatura → karta Zaawansowane → zaznaczyć Konfiguruj opcje klawiatury → rozwinąć Compose key position.
Inne środowiska
Klawisz Compose można aktywować poleceniem setxkbmap
. Wystarczy wydać polecenie:
setxkbmap -option compose:rctrl
Zamiast rctrl
można wpisać rwin
(dla prawego klawisza Windows).
Zmiany są widoczne od razu i trwają do końca sesji lub kolejnej zmiany. Najlepiej polecenie dopisać do skryptu startowego używanego środowiska lub menedżera okien (skonsultuj się z jego dokumentacją aby dowiedzieć się, jak to zrobić).
Używanie klawisza Compose
Działanie klawisza Compose jest zbliżone do działania martwego klawisza. Aby go wykorzystać, należy najpierw wcisnąć klawisz Compose a potem odpowiednią sekwencję klawiszy. Sekwencje w większości są bardzo intuicyjne i opierają się o „części” znaku który chcemy uzyskać. Np. Compose, /
, o
da w rezultacie ø
.
Skąd jednak brać sekwencje Compose? Po pierwsze, można sobie pomóc tą stroną internetową. Po drugie zaś, można je po prostu podejrzeć. Sekwencje zdefiniowane są w pliku /usr/share/X11/locale/<locale>/Compose
. Dla systemu obsługującego UTF-8 i z polskim mapowaniem klawiatury, plik z sekwencjami to /usr/share/X11/locale/en_US.UTF-8/Compose
. Poniżej znajduje się kilka sekwencji obrazujących, że używanie klawisza Compose jest bardzo intuicyjne:
- Compose,
-
,L
→£
- Compose,
=
,c
→€
- Compose,
|
,c
→¢
- Compose,
=
,Y
→¥
- Compose,
o
,o
→°
- Compose,
<
,-
→←
- Compose,
%
,o
→‰
Klawisz Compose jest najpotężniejszym mechanizmem z dotychczas opisanych, dającym dostęp do praktycznie nieograniczonej liczby znaków.
Dodawanie własnych sekwencji
Domyślne sekwencje Compose dają dostęp do ogromnej liczby znaków. Jednak niektórzy użytkownicy mogą nie być tym usatysfakcjonowani. W domyślnych sekwencjach nie można wprowadzić np. znaku ≈
, dostęp do niektórych znaków mógłby też być łatwiejszy (zwłaszcza jeśli ktoś musi ich często używać).
Można zmodyfikować istniejącą mapę sekwencji, jednak nie jest to najlepsze rozwiązanie (np. może ona zostać nadpisana w trakcie aktualizacji). Lepiej jest stworzyć mapę sekwencji dla użytkownika. Wystarczy wydać polecenie:
cp /usr/share/X11/locale/en_US.UTF-8/Compose ~/.XCompose
Dzięki temu w katalogu domowym użytkownika zostanie utworzony plik .XCompose
zawierający sekwencje dla klawisza Compose. Należy zmodyfikować jego treść zgodnie z własnymi preferencjami.
Składnia pliku XCompose jest bardzo prosta i wygląda następująco:
sekwencja : "efekt"
Sekwencja to oddzielone spacją nazwy znaków które mają być kolejno wciśnięte. Nazwy muszą być zawarte pomiędzy <
a >
. Każda sekwencja zawierająca klawisz Compose powinna zaczynać się od <Multi_key>
. Nazwy mogą być zarówno wewnętrznymi dla X.org identyfikatorami symboli (które można odczytać przy pomocy wspomnianego już programu xev
; np. asciitilde) jak i identyfikatorami Unicode (np. U007E
).
efekt
to znak lub ciąg znaków, które mają być wyprodukowane w wyniku wprowadzenia sekwencji.
Po "efekt"
może jeszcze następować zrozumiała dla XCompose nazwa. Jeżeli podana będzie tylko nazwa, parser sprawdzi w ustawieniach locale, jaki znak jest jej przyporządkowany. Pole to można bez obaw ominąć, co polecam.
Aby lepiej zobrazować powyższe instrukcje, poniżej znajduje się kilka przykładów. Wszystkie są poprawnie interpretowane.
<Multi_key> <U007E> <equal>: "≈" U2248
<Multi_key> <equal> <asciitilde>: "≈"
<Multi_key> <slash> <equal> : "≠" U2260 # NOT EQUAL TO
<Multi_key> <c> <k> <r> : "Potrafię obsługiwać klawisz Compose :)"
Zmiany wprowadzone do pliku ~/.XCompose
są aktywne od następnego zalogowania użytkownika.
Podsumowanie
Jak widać, Linux (a raczej X.org) oferuje całe spektrum możliwości wprowadzania znaków niedostępnych na klawiaturze podłączonej do komputera. Sposoby te są w dużej mierze komplementarne i podczas zwyczajnego korzystania z komputera mogą i powinny być stosowane wszystkie naraz. Chociaż, oczywiście, zależy to od indywidualnych preferencji.