linux系統下鍵盤按鍵的重新對映——xmodmap工具和xev工具
大家會不會有時候,感覺鍵盤上的某幾個鍵用起來不是很方便,打字打久了很容易手指頭疼呢?
例如大家使用vim編輯器時, 經常需要使用到esc鍵,而該鍵在左上角,很不方便的。再比如寫程式的時候,經常會使用到shift鍵與其它鍵的組合等。把鍵盤按鍵進行必要的重新對映,可以提高生產率的。對鍵盤按鍵重新對映的大致過程如下:
第一步,通過 xev 工具獲得需要修改的按鍵的 keycode 值;
第二步,通過xmodmap工具修改由keycode到keysym的對映。(keycode與keysym的含義正文會說明)
1. xev工具:
功能:通過它可以知道鍵盤上每一個按鍵的編碼,即keycode, 這個鍵碼與鍵盤硬體有關係,固定不變的。你想想啊,鍵盤上這麼多按鍵,怎麼讓計算機去區分啊?就是通過這個keycode值,每當我們按下一個鍵時,核心中中斷系統就會接收到一個keycode, 從而判斷你按下了哪個鍵。具體作業系統怎麼處理這個按鍵,那就需要keycode值到keysym的對映來決定了。
如何安裝:在我的debian系統上,已經預設存在了,這個工具在安裝系統的時候應該就會安裝上的,直接執行命令如何命令即可(如果沒有自帶的話, 我還真不知道怎麼安裝呢):
[email protected]:~$ xev
執行命令後,出來一個空白的小視窗,這時我們按下鍵盤上一個鍵之後 ,在shell終端就會出來該鍵的相關說明:
上圖中顯示了我keycode 50 對應 keysym: Control_L和keycode 66 對應 keysym: Shift_L的相關資訊。(我已經重新對映之後的資訊)
2. xmodmap工具
功能:用於修改按鍵keycode值到按鍵功能keysym的對映。
如何安裝:它在我的debian系統上,也已經預設存在了,沒有研究怎麼安裝,拿來直接用的。
什麼是keysym呢? 即key symbol,咱們可以把它理解了符號或功能,我按下這個鍵,我就想要得到一個符號對不對?例如我按下A鍵,就是想知道一個 a 或者 A吧,這個就是keysym. 再例如,我按下了control_L對應的鍵, 我就想得到control_L 符號或使用這個功能吧。
從keycode到keysym的對映不是一一對應的,一個keycode值可以對應多個keysym:例如 a鍵(keycode為 )就對應的 a, 與對應的 A 。具體是這麼規定的,舉個例子來說吧,例如A 鍵的對映如下:
1 keycode 38 = a A a A
它表示鍵盤上A鍵對應的keycode為38, 它被對映為的keysym為四個:a / A / a / A, 它們的含義分別為按以下組合時對應的:A鍵 / Shift + A鍵 / Mode_switch + A鍵 / Mode_switch + Shift + A 鍵。除了A鍵之外,其它的組合鍵稱作修飾鍵 (modifier), 每一個 keycode值最多應該可以對映6個或8個的keysym吧,反正夠咱們用了。前6個keysym的意義如下:
1 Key 2 Shift+Key 3 Mode_switch+Key 4 Mode_switch+Shift+Key 5 ISO_Level3_Shift+Key 6 ISO_Level3_Shift+Shift+Key
當我們定義我們自己的對映時,這6個或8個的keysym不需要全部都寫滿,你想用幾個就寫幾個就可以了。假如我想用第一個和第三個keysym時,第二個keysym的值使用 NoSymbol 代替,它表示空。
如何對映呢? 直接 使用 keycode 值 = keysym 即可。例如下面是我自己設定的鍵盤對映: (使用!表示註釋, 下面的內容位於 ~/.Xmodmap檔案內)
1 ! 把esc鍵更換為Caps_Lock 2 keycode 9 = Caps_Lock NoSymbol Caps_Lock 3 4 !把Caps_Lock鍵更換為Shift_L 5 keycode 66 = Shift_L NoSymbol Shift_L 6 7 !把Shift_L鍵更換為Control_L鍵 8 keycode 50 = Control_L NoSymbol Control_L 9 10 ! 把Control_L鍵更換為Alt_L鍵 11 keycode 37 = Alt_L Meta_L Alt_L Meta_L 12 13 ! 把Alt_L鍵更換為ESC鍵 14 keycode 64 = Escape NoSymbol Escape 15 16 ! 把Enter鍵更換為Shift_R鍵 17 keycode 36 = Shift_R NoSymbol Shift_R 18 19 ! 把Shift_R鍵更換為Return 鍵 20 keycode 62 = Return NoSymbol Return
接下來說說按鍵中的修飾符,即modifier. 例如我們常用的shift/ ctrl /alt/等都起著修飾的作用,它們可以和別的按鍵進行組合 ,產生不同的效果。
在我們系統中,一共存在著8個修飾符:分別為: shift/ lock/ control/ mod1/ mod2/ mod3 /mod4/ mod5. 我們可以把每一個keysym 設定為修飾符,例如我把 a 設定為修飾符的control修飾符的話,把以後按 a + c 就可以表示複製了。 每一個修飾符都可以對應多個keysym的, 下面是我的電腦的修飾符:
1 shift Shift_R (0x24), Shift_L (0x42) 2 lock Caps_Lock (0x9) 3 control Control_L (0x32), Control_R (0x69) 4 mod1 Alt_L (0x25), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd) 5 mod2 Num_Lock (0x4d) 6 mod3 7 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 8 mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
如果設定呢?常用的命令包括:clear/ remove/ add 操作,舉例來說:(下面的內容也是位於.Xmodmap檔案中)
1 ! 把繫結到control修飾符的Control_L移除: 2 remove control = Control_L 3 4 ! 把繫結到control修飾符上的所有 keysym 都移除: 5 clear control 6 7 ! 現在新增Control_R 都shift 修飾符: 8 add shift = Control_R
需要說明的是: 修飾符是與 keysym 對應的keycode值繫結的,當我們修改了與修飾符相關的按鍵之後,記得更新一下相關的修飾符,否則的話,修飾符還是繫結在的物理按鍵上,而還是繫結到你新對映的物理按鍵上。
3. 配置
如何使用xmodmap這個工具來配置按鍵對映呢? 有兩種方法 ,一種是命令列的形式,一種是配置檔案的形式。
1. 命令列形式:
當我們輸入xmodmap -h 時,會顯示如下:
[email protected]:~$ xmodmap -h usage: xmodmap [-options ...] [filename] where options include: -display host:dpy X server to use -verbose, -quiet turn logging on or off -n don't execute changes, just show like make -e expression execute string -pm print modifier map -pk print keymap table -pke print keymap table as expressions -pp print pointer map -help print this usage message -grammar print out short help on allowable input -version print program version - read standard input
因此呢,我們可以都過 -e 引數,執行我們剛才介紹的命令,例如:
# a的物理按鍵對應的keycode值為38 # 把a按鍵對映成b按鍵 [email protected]:~$ xmodmap -e "keycode 38 = b B NoSymbol B"
2. 使用配置檔案
我們可以把配置檔案放到~/目錄下,命名為 .Xmodmap檔案,當我們定義好配置檔案之後 ,使用命令 xmodmap ~/.Xmodmap 執行就即了。我們可以把該命令增加到~/.bashrc檔案中:
# 執行按鍵的重新對映 ---- 殷大俠 2018-12-18 if [ -f ~/.Xmodmap ]; then xmodmap ~/.Xmodmap; fi
額外說明: xmdomap軟量級的鍵盤對映方案,電腦重啟之後 就重置了,如果想要有更高階的需求,請使用 X keyborad extension。
附:我的.Xmodmap檔案:
1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 修改相應的鍵盤對映: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2 ! 3 ! 把esc鍵更換為Caps_Lock 4 keycode 9 = Caps_Lock NoSymbol Caps_Lock 5 6 !把Caps_Lock鍵更換為Shift_L 7 keycode 66 = Shift_L NoSymbol Shift_L 8 9 !把Shift_L鍵更換為Control_L鍵 10 keycode 50 = Control_L NoSymbol Control_L 11 12 ! 把Control_L鍵更換為Alt_L鍵 13 keycode 37 = Alt_L Meta_L Alt_L Meta_L 14 15 ! 把Alt_L鍵更換為ESC鍵 16 keycode 64 = Escape NoSymbol Escape 17 18 ! 把Enter鍵更換為Shift_R鍵 19 keycode 36 = Shift_R NoSymbol Shift_R 20 21 ! 把Shift_R鍵更換為Enter鍵 22 keycode 62 = Return NoSymbol Return 23 24 25 ! 如果修改的按鍵涉及到了修飾鍵(modifier), 那麼就需要更新一下相應的修飾鍵,因為它們是和keycode繫結的 26 ! 27 ! 更新modifier鍵之前的結果: 28 ! xmodmap: up to 4 keys per modifier, (keycodes in parentheses): 29 ! 30 ! shift Shift_L (0x32), Shift_R (0x3e) 31 ! lock Caps_Lock (0x42) 32 ! control Control_L (0x25), Control_R (0x69) 33 ! mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) 34 ! mod2 Num_Lock (0x4d) 35 ! mod3 36 ! mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 37 ! mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 38 39 !: 更新相應的修飾鍵的值: 40 clear shift 41 clear lock 42 clear control 43 clear mod1 44 add shift = Shift_L Shift_R 45 add lock = Caps_Lock 46 add control = Control_L Control_R 47 add mod1 = Alt_L Alt_R Meta_L 48 49 !更新後的修飾鍵之後的結果: 50 51 ! xmodmap: up to 4 keys per modifier, (keycodes in parentheses): 52 ! 53 ! shift Shift_R (0x24), Shift_L (0x42) 54 ! lock Caps_Lock (0x9) 55 ! control Control_L (0x32), Control_R (0x3e) 56 ! mod1 Alt_L (0x25), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd) 57 ! mod2 Num_Lock (0x4d) 58 ! mod3 59 ! mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 60 ! mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 61 !
參考文獻:
https://wiki.archlinux.org/index.php/Xmodmap
https://cs.gmu.edu/~sean/stuff/n800/keyboard/old.html