Xmodmap

出自 Arch Linux 中文维基

xmodmap是一個用於修改 Xorg 中鍵位圖和指針按鈕映射的工具。

xmodmapX keyboard extension (XKB)沒有直接關係。這兩個程序對於X中的如何處理"鍵碼"的理解是不一樣的(xmodmap 更早)。一般來説,它只被推薦用於最簡單的任務。請參閱 X keyboard extension 了解高級佈局配置。

注意:
  • xmodmap設置會被setxkbmap重置,它不僅將字母數字鍵改變為映射表中的值,還將所有其他鍵重置為啟動時的默認值。[1]
  • 由於Xorg的限制,xmodmap設置不會自動應用到熱插拔設備上。如果在應用了自定義映射表後,系統中添加了一個新的鍵盤,則必須重新應用自定義映射表。[2]

簡介[編輯 | 編輯原始碼]

Xorg 中有兩種類型的鍵盤值:鍵碼和鍵符。

鍵碼 keycode
鍵碼是當按鍵或鼠標按鈕被按下時,內核收到的表示數字。
鍵符 keysym
鍵符是鍵碼所對應的符號表達值。例如,按a產生38號鍵碼,它被映射到0×61號鍵符,對應 ASCII表中的 a
Xorg中,鍵符通過一個定義鍵碼-鍵符對應關係的表管理。這個表叫做鍵映射表。可以通過運行xmodmap來顯示。

安裝[編輯 | 編輯原始碼]

xmodmapxorg-xmodmap 包提供。

也可以安裝 xkeycaps,這是一個xmodmap的圖形前端。

鍵映射表[編輯 | 編輯原始碼]

打印以表達式格式呈現的鍵映射表:

$ xmodmap -pke
[...]
keycode  57 = n N
[...]

每個鍵碼後面都跟着映射到的鍵符。上面的例子意思是:鍵碼57被映射到小寫n鍵符,而大寫N鍵符則對應按下Shift輸入的57號鍵碼。

表中的每一列鍵符都對應着一個特定的修飾鍵組合,Key為鍵碼所對應的按鍵:

  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

並非所有的鍵符都必須設置,但如果要跳過一個鍵符,請將其值設為NoSymbol

要查看一個鍵對應的鍵碼,請參見Keyboard input#Identifying keycodes in Xorg以了解xev實用程序的細節,它將在你按下一個鍵時輸出相關的鍵碼與鍵符信息。

提示:多媒體鍵有預定義的描述性鍵符,例如 XF86AudioMuteXF86Mail 。這些鍵符可以在/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

激活自定義映射表[編輯 | 編輯原始碼]

對於GDMXDMLightDM,不需要特別激活~/.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也可以用來覆蓋修飾鍵,例如交換ControlSuper(即 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與左alt Alt_L具有相同的功能,因此將佈局設置為美式鍵盤(國際)會更靈活。參見#鍵映射表
Mode_switch
默認情況下,Mode_switch修飾鍵可能會被映射到一個虛擬的鍵。
注意: 修飾鍵ISO_Level3_ShiftMode_switch的名稱對於xmodmap和X鍵盤擴展是不同的。參見[3]

重新安排修飾鍵位[編輯 | 編輯原始碼]

注意: xmodmap是區分大小寫的。使用不正確的大小寫,如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

!用於註釋一行,所以在下面的例子中,只有 ControlMod4 這兩個修飾符被清除。然後,鍵符Control_LControl_RSuper_LSuper_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_LControl_R鍵符分配給了Control修飾鍵,Super_LSuper_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作為ControlLeft 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

另見[編輯 | 編輯原始碼]