你們會不會有時候,感受鍵盤上的某幾個鍵用起來不是很方便,打字打久了很容易手指頭疼呢?php
例如你們使用vim編輯器時, 常常須要使用到esc鍵,而該鍵在左上角,很不方便的。再好比寫程序的時候,常常會使用到shift鍵與其它鍵的組合等。把鍵盤按鍵進行必要的從新映射,能夠提升生產率的。對鍵盤按鍵從新映射的大體過程以下:
第一步,經過 xev 工具得到須要修改的按鍵的 keycode 值;html
第二步,經過xmodmap工具修改由keycode到keysym的映射。(keycode與keysym的含義正文會說明)linux
功能:經過它能夠知道鍵盤上每個按鍵的編碼,即keycode, 這個鍵碼與鍵盤硬件有關係,固定不變的。你想一想啊,鍵盤上這麼多按鍵,怎麼讓計算機去區分啊?就是經過這個keycode值,每當咱們按下一個鍵時,內核中中斷系統就會接收到一個keycode, 從而判斷你按下了哪一個鍵。具體操做系統怎麼處理這個按鍵,那就須要keycode值到keysym的映射來決定了。shell
如何安裝:在個人debian系統上,已經默認存在了,這個工具在安裝系統的時候應該就會安裝上的,直接運行命令如何命令便可(若是沒有自帶的話, 我還真不知道怎麼安裝呢):express
yin@debian:~$ xev
運行命令後,出來一個空白的小窗口,這時咱們按下鍵盤上一個鍵以後 ,在shell終端就會出來該鍵的相關說明:vim
上圖中顯示了我keycode 50 對應 keysym: Control_L和keycode 66 對應 keysym: Shift_L的相關信息。(我已經從新映射以後的信息)bash
功能:用於修改按鍵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值綁定的,當咱們修改了與修飾符相關的按鍵以後,記得更新一下相關的修飾符,不然的話,修飾符仍是綁定在的物理按鍵上,而仍是綁定到你新映射的物理按鍵上。
如何使用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