Xmodmap
xmodmap是一個用於修改 Xorg 中鍵位圖和指針按鈕映射的工具。
xmodmap與 X keyboard extension (XKB)沒有直接關係。這兩個程序對於X中的如何處理"鍵碼"的理解是不一樣的(xmodmap 更早)。一般來説,它只被推薦用於最簡單的任務。請參閱 X keyboard extension 了解高級佈局配置。
簡介[編輯 | 編輯原始碼]
在 Xorg 中有兩種類型的鍵盤值:鍵碼和鍵符。
- 鍵碼 keycode
- 鍵碼是當按鍵或鼠標按鈕被按下時,內核收到的表示數字。
- 鍵符 keysym
- 鍵符是鍵碼所對應的符號表達值。例如,按
a
產生38
號鍵碼,它被映射到0×61
號鍵符,對應 ASCII表中的a
。 - 在Xorg中,鍵符通過一個定義鍵碼-鍵符對應關係的表管理。這個表叫做鍵映射表。可以通過運行
xmodmap
來顯示。
安裝[編輯 | 編輯原始碼]
xmodmap 由 xorg-xmodmap包 包提供。
也可以安裝 xkeycaps包,這是一個xmodmap的圖形前端。
鍵映射表[編輯 | 編輯原始碼]
打印以表達式格式呈現的鍵映射表:
$ xmodmap -pke
[...] keycode 57 = n N [...]
每個鍵碼後面都跟着映射到的鍵符。上面的例子意思是:鍵碼57
被映射到小寫n
鍵符,而大寫N
鍵符則對應按下Shift
輸入的57
號鍵碼。
表中的每一列鍵符都對應着一個特定的修飾鍵組合,Key為鍵碼所對應的按鍵:
Key
Shift+Key
Mode_switch+Key
Mode_switch+Shift+Key
ISO_Level3_Shift+Key
ISO_Level3_Shift+Shift+Key
並非所有的鍵符都必須設置,但如果要跳過一個鍵符,請將其值設為NoSymbol
。
要查看一個鍵對應的鍵碼,請參見Keyboard input#Identifying keycodes in Xorg以了解xev實用程序的細節,它將在你按下一個鍵時輸出相關的鍵碼與鍵符信息。
XF86AudioMute
或 XF86Mail
。這些鍵符可以在/usr/include/X11/XF86keysym.h
中找到。許多多媒體程序都被設計成可以直接通過這些鍵符控制,而不需要配置任何第三方應用程式。
請注意,xmodmap會受到 xkbd 設置的影響,所以所有8個鍵符都可以用於美式鍵盤(國際)的 xkbd 佈局,但不能用於默認的美式鍵盤(它缺少ISO Level3中定義的ralt_switch符號)。為了讓所有8個鍵位都可用,你應該配置把鍵盤設置為美式鍵盤(國際)。 以美式鍵盤佈局為例,在調用 xmodmap 之前調用 $ setxkbmap -layout 'us(intl)'
以在當前X會話中測試您的更改。要永久地做這個改變,請編輯 xorg 配置或您的 .xprofile 或 .xinitrc 文件。完整解釋參見Xorg/Keyboard configuration#Setting keyboard layout。
自定義映射表[編輯 | 編輯原始碼]
創建一個鍵映射表(即文件 ~/.Xmodmap
):
$ xmodmap -pke > ~/.Xmodmap
測試您的更改:
$ xmodmap ~/.Xmodmap
激活自定義映射表[編輯 | 編輯原始碼]
對於GDM、XDM或LightDM,不需要特別激活~/.Xmodmap
。對於startx,請使用:
~/.xinitrc
[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap
也可以編輯全局啟動腳本 /etc/X11/xinit/xinitrc
。
測試更改[編輯 | 編輯原始碼]
進行臨時修改:
$ xmodmap -e "keycode 46 = l L l L lstroke lstroke lstroke" $ xmodmap -e "keysym a = e E"
修飾鍵[編輯 | 編輯原始碼]
xmodmap也可以用來覆蓋修飾鍵,例如交換Control
和Super
(即 Windows 鍵)。
打印當前完整的修飾符表:
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Meta_L (0xcd) mod2 Num_Lock (0x94) mod3 mod4 Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), ISO_Level3_Shift (0x6c), Mode_switch (0x85), Mode_switch (0xcb)
找到鍵符的修飾鍵[編輯 | 編輯原始碼]
- ISO_Level3_Shift
- 非美式鍵盤上的AltGr鍵調用修飾鍵ISO_Level3_Shift。(在美式鍵盤上,右alt
Alt_R
與左altAlt_L
具有相同的功能,因此將佈局設置為美式鍵盤(國際)會更靈活。參見#鍵映射表) - Mode_switch
- 默認情況下,Mode_switch修飾鍵可能會被映射到一個虛擬的鍵。
重新安排修飾鍵位[編輯 | 編輯原始碼]
Mode_Switch
,(正確的是 Mode_switch
)會導致錯誤。在重排之前,需要清除修飾鍵。原來的鍵和新的鍵都得清除。例如,如果您打算將Caps_Lock
換到A鍵,將B
換成NumLock鍵,那麼Caps_Lock
,Num_Lock
,A,B四個鍵都得清除,然後分配鍵位,最後再把他們加回來。
~/.Xmodmap
[...] clear lock clear mod2 keycode 38 = Caps_Lock keycode 77 = Num_Lock add lock = Caps_Lock add mod2 = Num_Lock
!
用於注釋一行,所以在下面的例子中,只有 Control
和 Mod4
這兩個修飾符被清除。然後,鍵符Control_L
、Control_R
、Super_L
和Super_R
被分配給對應相反的修飾鍵。將左鍵和右鍵都分配給同一個修飾鍵意味着兩個鍵會被當成同一個鍵。
~/.Xmodmap
[...] !clear Shift !clear Lock clear Control !clear Mod1 !clear Mod2 !clear Mod3 clear Mod4 !clear Mod5 !add Shift = Shift_L Shift_R !add Lock = Caps_Lock add Control = Super_L Super_R !add Mod1 = Alt_L Alt_R !add Mod2 = Mode_switch !add Mod3 = add Mod4 = Control_L Control_R !add Mod5 =
Control_L
和Control_R
鍵符分配給了Control
修飾鍵,Super_L
和Super_R
鍵符分配給了Mod4
修飾鍵。如果你得到以下錯誤信息X Error of failed request: BadValue (integer parameter out of range for operation)
,您需要進行相應的調整。運行xmodmap
會產生一個修飾鍵和分配給它們的鍵符列表。下面的例子將CapsLock
修改為Control
,將Shift+CapsLock
修改為CapsLock
:
~/.Xmodmap
clear lock clear control add control = Caps_Lock Control_L Control_R keycode 66 = Control_L Caps_Lock NoSymbol NoSymbol
反向滾動[編輯 | 編輯原始碼]
OS X Lion中可用的自然滾動功能(模仿智能手機或平板電腦滾動)可以通過xmodmap來實現。由於 synaptics 驅動程序使用 4/5/6/7 按鈕進行上/下/左/右滾動,你只需要調換一下 ~/.Xmodmap
中按鈕的聲明順序:
~/.Xmodmap
pointer = 1 2 3 5 4 7 6 8 9 10 11 12
然後更新xmodmap:
$ xmodmap ~/.Xmodmap
交換鼠標按鈕[編輯 | 編輯原始碼]
鼠標左、中、右按鈕分別對應於 synaptics 驅動程序中的按鈕 1、2和3。如果要交換鼠標左鍵和右鍵,也只需將它們在~/.Xmodmap
中的順序顛倒過來即可。
~/.Xmodmap
pointer = 3 2 1
這對於一個簡單的鼠標設置來説應該足夠了。再次更新xmodmap。
$ xmodmap ~/.Xmodmap
模板[編輯 | 編輯原始碼]
西班牙語[編輯 | 編輯原始碼]
~/.Xmodmap
keycode 24 = a A aacute Aacute ae AE ae keycode 26 = e E eacute Eacute EuroSign cent EuroSign keycode 30 = u U uacute Uacute downarrow uparrow downarrow keycode 31 = i I iacute Iacute rightarrow idotless rightarrow keycode 32 = o O oacute Oacute oslash Oslash oslash keycode 57 = n N ntilde Ntilde n N n keycode 58 = comma question comma questiondown dead_acute dead_doubleacute dead_acute keycode 61 = exclam section exclamdown section dead_belowdot dead_abovedot dead_belowdot !Maps the Mode key to the Alt key keycode 64 = Mode_switch
將 CapsLock 換成 Control[編輯 | 編輯原始碼]
將 CapsLock
改為 Control
的最簡單的例子。
~/.Xmodmap
clear lock clear control keycode 66 = Control_L add control = Control_L Control_R
將CapsLock轉為Control,將左Control轉為Hyper[編輯 | 編輯原始碼]
筆記本用户可能更喜歡將CapsLock
作為Control
。Left Control
鍵可以作為Hyper
修飾鍵(emacs、openbox或i3的附加修飾鍵)。
~/.Xmodmap
clear lock clear control clear mod1 clear mod2 clear mod3 clear mod4 clear mod5 keycode 37 = Hyper_L keycode 66 = Control_L add control = Control_L Control_R add mod1 = Alt_L Alt_R Meta_L add mod2 = Num_Lock add mod3 = Hyper_L add mod4 = Super_L Super_R add mod5 = Mode_switch ISO_Level3_Shift
把右 Super 變成右 Hyper[編輯 | 編輯原始碼]
如果用户希望在全鍵盤佈局中使用 Hyper 鍵,不妨將右 Super 鍵作為 Hyper 鍵。
~/.Xmodmap
remove mod4 = Super_R keycode 134 = Hyper_R add mod3 = Hyper_R
將Shift-數字鍵與數字鍵對換(克羅地亞語佈局)[編輯 | 編輯原始碼]
對於類似克羅地亞語的佈局應該也能正常工作。
~/.Xmodmap
keycode 10 = exclam 1 1 exclam asciitilde dead_tilde asciitilde keycode 11 = quotedbl 2 2 quotedbl dead_caron caron dead_caron keycode 12 = numbersign 3 3 numbersign asciicircum dead_circumflex asciicircum keycode 13 = dollar 4 4 dollar dead_breve breve dead_breve keycode 14 = percent 5 5 percent degree dead_abovering degree keycode 15 = ampersand 6 6 ampersand dead_ogonek ogonek dead_ogonek keycode 16 = slash 7 7 slash grave dead_grave grave keycode 17 = parenleft 8 8 parenleft dead_abovedot abovedot dead_abovedot keycode 18 = parenright 9 9 parenright dead_acute apostrophe dead_acute keycode 19 = equal 0 0 equal dead_doubleacute doubleacute dead_doubleacute
另見[編輯 | 編輯原始碼]
- xmodmap(1)。
- Christian Weiske 寫的 .Xmodmap 與多媒體鍵
- Pascal Bleser 寫的 使用 xmodmap 映射鍵盤上缺少的鍵
- LinuxQuestions上的Xmodmap識別的鍵符列表