linux系統下鍵盤按鍵的從新映射——xmodmap工具和xev工具

    你們會不會有時候,感受鍵盤上的某幾個鍵用起來不是很方便,打字打久了很容易手指頭疼呢?php

   例如你們使用vim編輯器時, 常常須要使用到esc鍵,而該鍵在左上角,很不方便的。再好比寫程序的時候,常常會使用到shift鍵與其它鍵的組合等。把鍵盤按鍵進行必要的從新映射,能夠提升生產率的。對鍵盤按鍵從新映射的大體過程以下: 
第一步,經過 xev 工具得到須要修改的按鍵的 keycode 值;html

第二步,經過xmodmap工具修改由keycode到keysym的映射。(keycode與keysym的含義正文會說明)linux

 

1. xev工具:

功能:經過它能夠知道鍵盤上每個按鍵的編碼,即keycode, 這個鍵碼與鍵盤硬件有關係,固定不變的。你想一想啊,鍵盤上這麼多按鍵,怎麼讓計算機去區分啊?就是經過這個keycode值,每當咱們按下一個鍵時,內核中中斷系統就會接收到一個keycode, 從而判斷你按下了哪一個鍵。具體操做系統怎麼處理這個按鍵,那就須要keycode值到keysym的映射來決定了。shell

 如何安裝:在個人debian系統上,已經默認存在了,這個工具在安裝系統的時候應該就會安裝上的,直接運行命令如何命令便可(若是沒有自帶的話, 我還真不知道怎麼安裝呢):express

yin@debian:~$ xev

運行命令後,出來一個空白的小窗口,這時咱們按下鍵盤上一個鍵以後 ,在shell終端就會出來該鍵的相關說明:vim

上圖中顯示了我keycode 50 對應 keysym: Control_L和keycode 66 對應 keysym: Shift_L的相關信息。(我已經從新映射以後的信息)bash

 

 

 

2. xmodmap工具

功能:用於修改按鍵keycode值到按鍵功能keysym的映射。dom

如何安裝:它在個人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 時,會顯示以下:

yin@debian:~$ 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按鍵
yin@debian:~$ 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

https://linux.die.net/man/1/xmodmap

http://xahlee.info/linux/linux_xmodmap_tutorial.html

相關文章
相關標籤/搜索