Linux 中的鍵盤映射
對于英語來說,鍵盤上的字母鍵直接和英語字母表中的字母對應,但是對于非英語的語種來說,情況就不太一樣了。例如,德語中的“ß”字母就沒有直接的鍵和它對應,為此,Linux 提供“鍵盤映射”或“鍵盤翻譯”,利用鍵盤映射可将某些鍵轉換為特殊鍵。
前面提到,X Window 直接處理了鍵盤的輸入輸出端口,是以,在 Linux 虛拟控制台下和 X Window 下使用不同的鍵盤映射方法。在 Linux 虛拟控制台上,可利用 loadkeys 指令将特殊按鍵映射為特殊字元;而在 X Window 中,必須使用 xmodmap 指令完成鍵盤映射。這些指令均按照字元映射表檔案(文本檔案)中的規定完成相應的轉換。在 X Window 啟動時,它會參考 Linux 文本模式下的字元映射表,是以可獲得某些一緻的鍵映射。
字元映射表檔案儲存在 /usr/lib/kbd/keytables 目錄下,defkeymap.map 是預設的字元映射表檔案。利用指令:
$ loadkeys fr.map
可裝入 fr.map 所規定的字元映射表。這時,按下“.”會顯示“:”。指令
$ loadkeys –d
可裝入預設字元映射表。對于非預設的鍵盤映射,可在啟動時在 shell 腳本中裝入特殊的映射表。
對X Window 而言,它對鍵盤的處理過程分如下兩個步驟:
1.X Server 首先将鍵碼轉換為鍵符号名(keysym)。檔案 /usr/include/X11/keysymdef.h 中包含所有的符号名。X Server 能夠區分修飾鍵帶來的不同,因為 keysymdef.h 中區分了兩種不同的鍵,例如對“a”和“A”,分别用“KS_a”和“KS_A”定義。
2.X Server 将鍵符号翻譯為 ASCII 字元串。對于大多數的鍵來說,該字元串隻包含一個字元,而對于功能鍵等特殊按鍵來說,則包含多個字元。例如,F5 鍵對應的預設 ASCII 字元串為 “5~”。
利用 xmodmap 工具可修改鍵盤和鍵符号名之間的對應關系。例如,X Window 中“A”的鍵碼為 30,而“Q”的鍵碼為16。如果建立檔案 maptest:
keycode 38 = A
keycode 24 = Q
在 xterm 中運作
$ xmodmap maptest
之後,将發現“A”鍵和“Q”鍵交換了過來。
上述的 maptest 檔案實際就是一個簡單的 X Window 映射檔案。但需要注意的是,檔案中的 keycode 和 Linux 核心對鍵值的定義是不一樣的,一般而言,X Window 中的鍵碼要比核心的鍵值大 8。利用 showkey 指令可以檢視核心對鍵值的定義。例如,運作 showkey 并前後按下“A”和“Q”後,程式的輸出為:
$ showkey
kb mode was RAW
...
keycode 30 press
keycode 30 press
keycode 16 press
keycode 16 press
該程式給出的是“A”和“Q”的核心鍵值。
在 XF86Config 檔案中,Keyboard 段用來指定鍵盤參數,一般而言,這些參數不需要特殊設定:
Section “Keyboard”
Protocol “Standard”
AutoRepeat 500 5
EndSection