例如,
我想将PgUp键改为Home,或者将PgDown键改为End。
在Ubuntu/GNOME中是否存在内置命令或工具来重新分配按键?
打开终端窗口并运行 xev
。现在它是活动的,并等待你按下一个键。然后按下你想要改变行为的键,比如 PgUp。
xev
将输出一些关于按下键的信息。第三行很重要。它应该类似于:
state 0x10, keycode 110 (keysym 0xff55, Prior), same_screen YES,
在这个例子中,Prior
是当前分配给该键的行为的名称,键码是用来识别该键的内部 ID。
现在用另一个键,比如 PgDown,得到以下输出:
state 0x10, keycode 115 (keysym 0xff56, Next), same_screen YES,
这里我们感兴趣的部分是 keycode 115
和 Next
- 行为的名称。
现在当你想要交换这两个键时,使用 xmodmap
。
xmodmap -e "keycode 110 = Next"
这将把键码为 110 的键映射为动作 Next
。非常简单。
请注意,如果你映射的键在与 Shift 键一起使用时应该有不同的含义(例如对于英国键盘布局,Shift+2 会得到引号),那么你可以在第一个命令后面列出次要命令。例如,如果你希望代码为 53 的键在正常情况下映射为反斜杠,但在与 Shift 键一起使用时映射为竖线符号,你可以这样做:
xmodmap -e "keycode 53 = backslash bar"
附加信息:这些映射的顺序取决于键盘布局。通常是 Key,Shift+Key,mode_switch+Key,mode_switch+Shift+Key,AltGr+Key,AltGr+Shift+Key,但对于更特殊的布局(如德国的Neo 2),可能会有很大的不同。要跳过一列,请使用NoSymbol
。这里有一个所有键符号的综合列表。
您可以通过在/usr/share/X11/xkb/symbols/
中的文件中找到您的布局来查看具体的顺序。
注意:这些更改仅适用于活动的X会话,并且在重新启动后将丢失。 如果您想永久保存更改,您必须在上述命令之后运行以下命令:
xmodmap -pke >~/.Xmodmap
(它在你的主目录(~
)中创建一个名为.Xmodmap
的文件)
然后你需要在你的主目录中创建一个名为.xinitrc
的文件,在其中放置命令xmodmap .Xmodmap
。
您现在可以修改.Xmodmap
并从控制台运行xmodmap .Xmodmap
立即查看更改。在.Xmodmap
中的更改将持久保存。
来源: Ubuntu论坛
如果你要重新映射的按键在不同状态下有不同的行为(例如数字键盘上的键取决于NumLock),你只需执行xmodmap -pm
以获取修饰符列表,然后执行以下操作:
xmodmap -e "KEYCODE MODIFIER = 行为 带有修饰符的行为"
xmodmap -e "keycode 91 mod2 = KP_Delete period"
xev
无法捕捉到 Fn
键的按下事件 - om-nom-nom-event
标志。它会抛出一个错误,并且在man xev
中没有提到"event"。 - isomorphismesxev
的结果记录到名为event.out
的文件后,我使用perl -e '$/ = "\n\n"; while(<>) { print $_ if $_ =~ "KeyPress"; }' event.out > keypress.event.out
来过滤非按键事件。 - isomorphismesxmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"
... 你从哪里找到这个命令的?它似乎不起作用,我也找不到其他关于这个语法的参考文档。 - Martin Tournoij.xinitrc
中键入startx
和xmodmap -e
:xmodmap
即可正常工作。 - frozen-flameFn
是一个特殊的硬件按键,它的处理应该由低级软件(如固件)来完成,即使没有操作系统运行或者官方不支持也能正常工作。重新映射它是可行的,但需要修改相应的固件。希望这个固件是开源的,如果机主明智的话。 :) - anon xmodmap -e "keycode 62 = Up" # Shift => Up
xmodmap -e "keycode 111 = Shift_R" # Up => Shift
xmodmap -e "add shift = Shift_R" # Make the new Shift key actually do shifting
xmodmap -e "remove shift = Up" # Prevent the old Shift key from shifting
xset r 62 # Make the new Up key autorepeat
xset -r 111 # Prevent the new Shift key from autorepeating
$ uname -a
Linux box 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:35:14 UTC 2011 i686 GNU/Linux
$ which xmodmap
/usr/bin/xmodmap
$ which xev
/usr/bin/xev
$ xev
PRESS THE ENTER KEY (notice the third line):
KeyPress event, serial 33, synthetic NO, window 0x5600001,
root 0x110, subw 0x0, time 263441120, (738,242), root:(771,314),
state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
XLookupString gives 1 bytes: (0d)
XmbLookupString gives 1 bytes: (0d)
XFilterEvent returns: False
KeyRelease event, serial 33, synthetic NO, window 0x5600001,
root 0x110, subw 0x0, time 263441271, (738,242), root:(771,314),
state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
XLookupString gives 1 bytes: (0d)
XFilterEvent returns: False
PRESS THE SHIFT KEY (notice the third line):
KeyPress event, serial 30, synthetic NO, window 0x5600001,
root 0x110, subw 0x0, time 263592202, (464,368), root:(497,440),
state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 33, synthetic NO, window 0x5600001,
root 0x110, subw 0x0, time 263592298, (464,368), root:(497,440),
state 0x1, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
FOR:
state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
The name "Return" is the name of the behavior of the key pressed.
The number of the key pressed is "36".
state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
The name "Shift_R" is the name of the behavior of the key pressed.
The number of the key pressed is "62".
反转映射:
$ xmodmap -e "keycode 62 = Return"
$ xmodmap -e "keycode 36 = Shift_R"
保存结果:
$ xmodmap -pke > ~/.Xmodmap
$ vi ~/.xinitrc
添加
xmodmap ~/.Xmodmap
$ sudo reboot
$ sudo dumpkeys | grep "keycode 32" > tempfile
$ cat tempfile
keycode 32 = +d
shift keycode 32 = +D
altgr keycode 32 = +eth
shift altgr keycode 32 = +ETH
control keycode 32 = Control_d
shift control keycode 32 = Control_d
altgr control keycode 32 = Control_d
shift altgr control keycode 32 = Control_d
(121 lines total...)
sed 's/32/58/' -i tempfile
keycode 58 = +d
shift keycode 58 = +D
altgr keycode 58 = +eth
(etc...)
sudo sh -c 'cat tempfile >> /etc/console-setup/remap.inc'
-phigh
跳过低优先级问题)sudo dpkg-reconfigure console-setup -phigh
Ctrl+Pageup
的快捷方式。xmodmap
,但它无法生成修饰符事件。因此,无法创建一个例如Control
事件的快捷方式。xbindkeys
和xmacro
。这种方法基本上可以工作,但是xbindkeys
无法捕获我的系统上的某些键盘组合,比如Alt + ___
。xvkbd
程序来生成键盘事件,但这只是个人偏好。无论是xmacro
还是xvkbd
都几乎一样。另一个额外的提示是在xmacro
或xvkbd
中添加延迟参数,以确保事件不会丢失。Super+C
和Super+V
为Ctrl+C
和Ctrl+V
。当在Mac上通过VirtualBox使用Ubuntu时,这是一个完美的解决方案。 - user1Super+V
的“显示通知列表”功能,请转到设置->设备->键盘,并在那里禁用它。 - user1要使用hax11进行此操作,请打开程序的配置文件,位于我想将 PgUp 改为 Home 或者将 PgDown 改为 End。
~/.config/hax11/profiles
目录下(例如:~/.config/hax11/profiles/usr\lib\firefox\firefox
),然后添加以下内容:Enable=1
MapK112=K110
MapK117=K115
在我的情况下,我想将小键盘的小数点重新映射为逗号,但只是暂时的,所以 xmodmap
在我的情况下满足了这个要求
:~$ xev | grep keycode
state 0x10, keycode 91 (keysym 0xffae, KP_Decimal), same_screen YES,
XKeysymToKeycode returns keycode: 129
state 0x10, keycode 59 (keysym 0x2c, comma), same_screen YES,
首先,我按下我想重新映射的按键,然后按下我想映射到的按键。
...,键码 91(...
...(键符号 0x2c,逗号),...
查找要重新映射的键码的当前映射:
:~$ xmodmap -pke | grep "keycode\s*91"
keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal
映射到新配置。
:~$ xmodmap -e "keycode 91 = KP_Delete comma KP_Delete KP_Decimal"
映射回原始配置。
:~$ xmodmap -e "keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal"
我在~\.local\share\applications\
中创建了一对.desktop
快捷方式,以便轻松切换到其中一个配置或另一个配置:
[Desktop Entry]
Name=KeyPad comma
Exec=xmodmap -e "keycode 91 = KP_Delete comma KP_Delete KP_Decimal"
Terminal=false
Type=Application
Icon=/home/paui/.icons/KP_comma.png
0x01 Shift
0x02 Caps
0x04 Control
0x08 Alt
0x10 NumLock
0x80 Alt Gr
xmodmap
已经被弃用了!要获得系统范围的设置,您必须使用xkb
。因此,请编辑位于/usr/share/X11/xkb/symbols/
中的语言文件以添加您的更改。请参阅http://askubuntu.com/a/898462/34298 - rubo77