Difference between revisions of "Xmodmap"
(→xmodmap within a shell) |
(→Special keys/signals: add possible use case) |
||
(39 intermediate revisions by 16 users not shown) | |||
Line 1: | Line 1: | ||
− | [[Category:Input devices | + | [[Category:Input devices]] |
+ | [[Category:X Server]] | ||
+ | [[de:Xmodmap]] | ||
+ | [[fr:Xmodmap]] | ||
+ | [[zh-CN :Xmodmap]] | ||
+ | {{Article summary start}} | ||
+ | {{Article summary text|A general overview of modifying keymaps and pointer mappings with xmodmap.}} | ||
+ | {{Article summary heading|Related}} | ||
+ | {{Article summary wiki|Xorg}} | ||
+ | {{Article summary wiki|Extra Keyboard Keys}} | ||
+ | {{Article summary wiki|Extra Keyboard Keys in Xorg}} | ||
+ | {{Article summary wiki|Extra Keyboard Keys in Console}} | ||
+ | {{Article summary end}} | ||
− | + | '''Xmodmap''' is a utility for modifying keymaps and pointer button mappings in [[Xorg]]. | |
− | + | == Introduction == | |
+ | The Linux kernel generates a code each time a key is pressed on a keyboard. That code is compared to a {{ic|table of keycodes}} defining a figure that is then displayed. | ||
− | + | This process is complicated by [[Xorg]], which starts its own table of keycodes. Each keycode can belong to a {{ic|keysym}}. A keysym is like a function, started by typing a key. Xmodmap allows you to edit these keycode-keysym relations. | |
− | == | + | == Keymap table == |
+ | Print the current keymap table formatted into expressions: | ||
+ | {{hc|$ xmodmap -pke|2=keycode 57 = n N}} | ||
− | + | Each keymap is followed by the {{Ic|keysyms}} it is mapped to. The above example indicates that the keycode {{ic|57}} is mapped to the lowercase ''n'', while the uppercase ''N'' is mapped to keycode {{Ic|57}} and {{Ic|Shift}}. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Each keysym column in the table corresponds to a particular key combination: | |
+ | # {{Keypress|Key}} | ||
+ | # {{Keypress|Shift+Key}} | ||
+ | # {{Keypress|mode_switch+Key}} | ||
+ | # {{Keypress|mode_switch+Shift+Key}} | ||
+ | # {{Keypress|AltGr+Key}} | ||
+ | # {{Keypress|AltGr+Shift+Key}} | ||
− | + | Not all keysyms have to be set, but if you want to assign a latter keysym without assigning earlier ones set them to {{ic|NoSymbol}}. | |
− | + | You can check which keymap corresponds to a key on your keyboard with [[Extra Keyboard Keys#Using xev|xev]]. | |
− | |||
− | |||
− | |||
− | |||
− | + | {{tip|There are predefined descriptive keycodes that make mapping additional keys easier (e.g. {{ic|XF86AudioMute}}, {{ic|XF86Mail}}). Those keycodes can be found in: {{ic|/usr/include/X11/XF86keysym.h}}}} | |
− | == | + | == Custom table == |
+ | You can create your own map and store it in your home directory (i.e. {{ic|~/.Xmodmap}}). Print the current keymap table into a configuration file: | ||
+ | xmodmap -pke > ~/.Xmodmap | ||
− | + | Make the desired changes to {{ic|~/.Xmodmap}} and then test the new configuration with: | |
− | + | xmodmap ~/.Xmodmap | |
− | |||
− | |||
− | |||
− | + | To activate your custom table when starting Xorg add the following: | |
+ | {{hc|~/.xinitrc| | ||
+ | if [ -f $HOME/.Xmodmap ]; then | ||
+ | /usr/bin/xmodmap $HOME/.Xmodmap | ||
+ | fi}} | ||
− | + | Alternatively, edit the global startup script {{ic|/etc/X11/xinit/xinitrc}}. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | === | + | === Test changes === |
− | + | You can also make temporary changes for the current session. For example: | |
− | |||
xmodmap -e "keycode 46 = l L l L lstroke Lstroke lstroke" | xmodmap -e "keycode 46 = l L l L lstroke Lstroke lstroke" | ||
xmodmap -e "keysym a = e E" | xmodmap -e "keysym a = e E" | ||
Line 57: | Line 62: | ||
== Special keys/signals == | == Special keys/signals == | ||
− | You can also also edit the keys: | + | You can also also edit the keys: {{Keypress|Shift}}, {{Keypress|Ctrl}}, {{Keypress|Alt}} and {{Keypress|Super}} (there always exists a left and a right one (Alt_R=AltGr)). |
− | At first you have to delete/clear the signals that should be edited. | + | For example this can be useful if your right Control key is not working like your left one but you would like it to. |
+ | |||
+ | At first you have to delete/clear the signals that should be edited. In the beginning of your {{ic|~/.Xmodmap}}: | ||
!clear Shift | !clear Shift | ||
!clear Lock | !clear Lock | ||
Line 70: | Line 77: | ||
keycode 8 = | keycode 8 = | ||
... | ... | ||
− | Remember | + | Remember, {{ic|!}} is a comment so only {{Keypress|Control}} and {{Keypress|Mod4}} (Standard: Super_L Super_R) get cleared. |
− | Write the new signals at the end of ~/. | + | Write the new signals at the end of {{ic|~/.Xmodmap}} |
keycode 255 = | keycode 255 = | ||
!add Shift = Shift_L Shift_R | !add Shift = Shift_L Shift_R | ||
Line 82: | Line 89: | ||
add Mod4 = Control_L Control_R | add Mod4 = Control_L Control_R | ||
!add Mod5 = | !add Mod5 = | ||
− | + | The {{Keypress|Super}} keys have now been exchanged with the {{Keypress|Ctrl}} keys. | |
+ | |||
+ | If you get the following error message {{ic|X Error of failed request: BadValue (integer parameter out of range for operation)}} it means the key you are trying to add is already in another modifier, so remove it using "remove MODIFIERNAME = KEYSYMNAME". Running {{ic|xmodmap}} gives you a list of modifiers and keys that are assigned to them. | ||
+ | == Reverse Scrolling == | ||
+ | The natural scrolling feature available in OS X Lion can be mimicked with xmodmap. Since the synaptics driver uses the buttons 4/5/6/7 for up/down/left/right scrolling, you simply need to swap the order of how the buttons are declared in {{ic|~/.Xmodmap}}. | ||
− | = | + | Open {{ic|~/.Xmodmap}} and append the following line to the file: |
+ | pointer = 1 2 3 5 4 7 6 8 9 10 11 12 | ||
+ | Note how the 4 and 5 have been reversed. | ||
− | + | Then update xmodmap: | |
+ | xmodmap ~/.Xmodmap | ||
− | [http:// | + | To return to regular scrolling simply reverse the order of the 4 and 5 or delete the line altogether. For more information check Peter Hutterer's post, [http://who-t.blogspot.com/2011/09/natural-scrolling-in-synaptics-driver.html Natural scrolling in the synaptics driver], or the [https://bbs.archlinux.org/viewtopic.php?id=126258 Reverse scrolling direction ala Mac OS X Lion?] forum thread. |
− | [http:// | + | == Additional resources == |
+ | *[http://www.x.org/archive/current/doc/man/man1/xmodmap.1.xhtml Current man page] at X.Org Foundation | ||
+ | *[http://cweiske.de/howto/xmodmap/allinone.html Multimediakeys with .Xmodmap HOWTO] by Christian Weiske | ||
+ | *[http://dev-loki.blogspot.com/2006/04/mapping-unsupported-keys-with-xmodmap.html Mapping unsupported keys with xmodmap] by Pascal Bleser | ||
+ | *[http://en.gentoo-wiki.com/wiki/Multimedia_Keys Multimedia Keys article] on the [http://en.gentoo-wiki.com/ Gentoo Wiki] | ||
+ | *[http://keytouch.sourceforge.net/howto_keyboard/node4.html How to retrieve scancodes] by Marvin Raaijmakers | ||
+ | *[http://wiki.linuxquestions.org/wiki/List_of_Keysyms_Recognised_by_Xmodmap List of Keysyms Recognised by Xmodmap] on [http://linuxquestions.org LinuxQuestions] |
Revision as of 21:03, 29 January 2013
zh-CN :Xmodmap Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end
Xmodmap is a utility for modifying keymaps and pointer button mappings in Xorg.
Contents
Introduction
The Linux kernel generates a code each time a key is pressed on a keyboard. That code is compared to a table of keycodes
defining a figure that is then displayed.
This process is complicated by Xorg, which starts its own table of keycodes. Each keycode can belong to a keysym
. A keysym is like a function, started by typing a key. Xmodmap allows you to edit these keycode-keysym relations.
Keymap table
Print the current keymap table formatted into expressions:
$ xmodmap -pke
keycode 57 = n N
Each keymap is followed by the keysyms
it is mapped to. The above example indicates that the keycode 57
is mapped to the lowercase n, while the uppercase N is mapped to keycode 57
and Shift
.
Each keysym column in the table corresponds to a particular key combination:
- Template:Keypress
- Template:Keypress
- Template:Keypress
- Template:Keypress
- Template:Keypress
- Template:Keypress
Not all keysyms have to be set, but if you want to assign a latter keysym without assigning earlier ones set them to NoSymbol
.
You can check which keymap corresponds to a key on your keyboard with xev.
XF86AudioMute
, XF86Mail
). Those keycodes can be found in: /usr/include/X11/XF86keysym.h
Custom table
You can create your own map and store it in your home directory (i.e. ~/.Xmodmap
). Print the current keymap table into a configuration file:
xmodmap -pke > ~/.Xmodmap
Make the desired changes to ~/.Xmodmap
and then test the new configuration with:
xmodmap ~/.Xmodmap
To activate your custom table when starting Xorg add the following:
~/.xinitrc
if [ -f $HOME/.Xmodmap ]; then /usr/bin/xmodmap $HOME/.Xmodmap fi
Alternatively, edit the global startup script /etc/X11/xinit/xinitrc
.
Test changes
You can also make temporary changes for the current session. For example:
xmodmap -e "keycode 46 = l L l L lstroke Lstroke lstroke" xmodmap -e "keysym a = e E"
Special keys/signals
You can also also edit the keys: Template:Keypress, Template:Keypress, Template:Keypress and Template:Keypress (there always exists a left and a right one (Alt_R=AltGr)).
For example this can be useful if your right Control key is not working like your left one but you would like it to.
At first you have to delete/clear the signals that should be edited. In the beginning of your ~/.Xmodmap
:
!clear Shift !clear Lock clear Control !clear Mod1 !clear Mod2 !clear Mod3 clear Mod4 !clear Mod5 keycode 8 = ...
Remember, !
is a comment so only Template:Keypress and Template:Keypress (Standard: Super_L Super_R) get cleared.
Write the new signals at the end of ~/.Xmodmap
keycode 255 = !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 =
The Template:Keypress keys have now been exchanged with the Template:Keypress keys.
If you get the following error message X Error of failed request: BadValue (integer parameter out of range for operation)
it means the key you are trying to add is already in another modifier, so remove it using "remove MODIFIERNAME = KEYSYMNAME". Running xmodmap
gives you a list of modifiers and keys that are assigned to them.
Reverse Scrolling
The natural scrolling feature available in OS X Lion can be mimicked with xmodmap. Since the synaptics driver uses the buttons 4/5/6/7 for up/down/left/right scrolling, you simply need to swap the order of how the buttons are declared in ~/.Xmodmap
.
Open ~/.Xmodmap
and append the following line to the file:
pointer = 1 2 3 5 4 7 6 8 9 10 11 12
Note how the 4 and 5 have been reversed.
Then update xmodmap:
xmodmap ~/.Xmodmap
To return to regular scrolling simply reverse the order of the 4 and 5 or delete the line altogether. For more information check Peter Hutterer's post, Natural scrolling in the synaptics driver, or the Reverse scrolling direction ala Mac OS X Lion? forum thread.
Additional resources
- Current man page at X.Org Foundation
- Multimediakeys with .Xmodmap HOWTO by Christian Weiske
- Mapping unsupported keys with xmodmap by Pascal Bleser
- Multimedia Keys article on the Gentoo Wiki
- How to retrieve scancodes by Marvin Raaijmakers
- List of Keysyms Recognised by Xmodmap on LinuxQuestions