Xmodmap - Arch Linux 中文维基

跳至內容

# Xmodmap

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Xmodmap，最近一次同步於 2021-4-15，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Xorg
- Keyboard input
- Extra keyboard keys in console
- Xbindkeys

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

xmodmap與 X 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`來顯示。

## 安裝

xmodmap 由 xorg-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實用程序的細節，它將在你按下一個鍵時輸出相關的鍵碼與鍵符信息。

提示：多媒體鍵有預定義的描述性鍵符，例如 `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`與左alt `Alt_L`具有相同的功能，因此將布局設置為美式鍵盤（國際）會更靈活。參見#鍵映射表）
Mode_switch
  默認情況下，Mode_switch修飾鍵可能會被映射到一個虛擬的鍵。

注意：修飾鍵`ISO_Level3_Shift`和`Mode_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

`!`用於注釋一行，所以在下面的例子中，只有 `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識別的鍵符列表

分類：​

- 輸入設備
- X 伺服器

Xmodmap
新增話題