问题描述
我正在寻找一种方法来重新映射Ubuntu中的某些键。
即
我想将PgUp
更改为Home
或PgDown
更改为End
。
在Ubuntu /GNOME中,内置命令或工具是否存在重新分配键?
最佳解决方法
注意:截至2013年,Ubuntu和衍生产品不再使用xmodmap
,而是使用xkb
。欲了解更多信息,请参阅this answer。以下答案与当前版本不再相关。
对于重新映射某些键,您需要两个工具。第一个xev(命令行工具)和第二个xmodmap(也是命令行工具)。两者都应该在Ubuntu中可用,无需额外安装它们。
-
启动终端窗口并运行
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的键通常映射到反斜杠,但是在与移位一起使用时可以执行条形符号:xmodmap -e "keycode 53 = backslash bar"
附加信息:这些映射的序列为Key
,Shift+Key
,mode_switch+Key
,mode_switch+Shift+Key
,AltGr+Key
,AltGr+Shift+Key
。要跳过列,请使用NoSymbol
。此外,here是所有键盘的综合列表。
注意:这些更改仅适用于活动X会话,并且在重新引导后会丢失。如果要永久保存更改,则必须在上述命令之后运行以下命令:
xmodmap -pke >~/.Xmodmap
(它会在您的主目录(~
)中创建一个名为.Xmodmap
的文件)
然后,您必须在您的主目录中创建一个名为.xinitrc
的文件,并在其中放入命令xmodmap .Xmodmap
。
您现在可以修改.Xmodmap
并从控制台运行xmodmap .Xmodmap
以立即查看更改。 .Xmodmap
中的更改将持续。
奖金的东西:
如果您重新映射的键具有不同的行为(取决于状态(例如数字键盘中的键取决于NumLock),则只需执行xmodmap -pm
即可获取修饰符列表,然后执行下列操作:
xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"
例如,假设您希望在数字键盘上获得句点而不是逗号(对于大多数程序员很有用),但是您希望在NumLock关闭时保持”delete”行为。
xmodmap -e "keycode 91 mod2 = KP_Delete period"
mod2
,因为xmodmap -pm
告诉我们mod2
是Num_Lock
,其他名称是通过按下xev
中的键获得的。
次佳解决方法
如果您尝试移动Shift键,还有一些额外的步骤:
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
第三种解决方法
我刚刚有一个事后的想法..我想你可能意味着”remap”完全不同的东西..但我会留下我的答案,因为它…(我不知道如何re-assign一个行为作为另一个关键)
更新:我的’afterthought’已被确认; (我回答了错误的问题:)…请参阅NES的社区Wiki答案(上面已接受)。
有两种通用方法可以重新映射重新绑定密钥。
-
本地到特定程序(一个密钥可用于不同应用程序/窗口中的不同事物)
-
全局为特定用户(一个密钥在所有窗口中具有相同的功能)
对于’本地到程序’方法,有时候有一种方法可以改变应用程序本身提供的键盘绑定。
Firefox
有一个叫做keyconfig的插件…有些信息请看这个MozillZine post
大多数Ubuntu程序都是基于Gnome的,并且有一个特定的实用程序来修改这些Gnome应用程序的任何菜单项的键绑定…它被称为Editable Menu Accelerator
…这是一个非常’touchy’工具,但功能非常强大。您可以启用它通过运行gconf-editor
(通过终端或Alt + F2)…导航到desktop
– gnome
– interface
并选择can_change_accels
….然后,您可以更改菜单项以虚拟任何您喜欢的东西(每个程序/窗口)…我建议你一旦完成你所需要的就尽快关闭它。
否则,您可以设置全局热键。我使用一个名为xbindkeys的程序,并且还有一个可用的选项,通过主菜单 – 首选项,称为Keyboard Shortcuts
如果您使用xbindkeys,则需要将其添加到您的”Startup Applications”(主菜单 – 首选项)…此外(如Stefano Palazzo所建议的)我之前在此askubuntu page上的答案中编写了更详细的xbindkeys说明
第四种方法
以下是我如何尝试将ENTER
键映射到SHIFT
键(反之亦然):
$ 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
主要问题是逆转无效。 ENTER
密钥已映射到SHIFT_R
密钥;但SHIFT_R
密钥未映射到ENTER
密钥。去搞清楚。
第五种方法
为了独立于X来执行全局重映射,您可以使用console-setup(5)来代替。
在我的情况下,我想将Caps Lock
键重新映射到D
,因为我的D
键已损坏:)
首先,我使用dumpkeys(1)获取映射模板,对于D
键,有趣的是键盘32(在我的键盘上)的映射。请注意,grep模式中有两个空格!
$ 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...)
为了更改Map以应用于Caps Lock
(键盘上的键码58),请改为
sed 's/32/58/' -i tempfile
现在它读取
keycode 58 = +d
shift keycode 58 = +D
altgr keycode 58 = +eth
(etc...)
要将此重新映射添加到默认映射,只需将其附加到console-setup的重映射包含文件
sudo sh -c 'cat tempfile >> /etc/console-setup/remap.inc'
和console-setup需要重新配置(使用-phigh
跳过低优先级问题)
sudo dpkg-reconfigure console-setup -phigh
现在重新映射应该完成,并在启动时自动加载。
第六种方法
我花了一整天的时间尝试为Ctrl+Pageup
创建快捷方式。
我第一次尝试xmodmap
但不能生成修饰符事件。所以不可能创建一个生成例如Control
事件的快捷方式。
然后我用xmacro
尝试了xbindkeys
。这类作品,但xbindkeys
无法捕获我系统上的某些组合键,例如Alt + ___
。
所以我最终使用了Unity自己的键盘快捷键 – >自定义快捷方式设置我的快捷方式。
而不是xmacro
,我现在使用xvkbd
程序来生成键盘事件,但这只是个人偏好。 xmacro
和xvkbd
的工作几乎相同。另一个提示是在xmacro
或xvkbd
中添加延迟参数,以确保事件不会丢失。