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
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".
注意:自 2013 年起,Ubuntu 及其衍生版本不再使用.
xmodmap
,而是使用xkb
. 有关更多信息,请参阅此答案。下面的答案不再与当前版本相关。要重新映射某些键,您需要两个工具。第一个xev(命令行工具)和第二个xmodmap(也是命令行工具)。两者都应该在 Ubuntu 中可用,无需额外安装。
启动终端窗口并运行
xev
。现在它处于活动状态并等待您按下一个键。然后按下要更改其行为的键。即PgUp。xev
将输出有关按下的键的一些信息。第三行很重要。它应该类似于:在这个例子
Prior
中是键被分配到的行为的名称,数字键码是识别键的内部 id。现在用另一个键执行此操作,即PgDown给出此输出对我们来说,有趣的部分是
keycode 115
和Next
- 行为的名称。现在,当您要交换两个键时,请使用
xmodmap
.这会将键盘上键码为 110 的键更改为 action
Next
。这很简单。请注意,如果您正在映射的键在与该键一起使用时应该具有不同的含义Shift(例如对于英式键盘布局,Shift+2给出引号),那么您可以简单地在第一个命令之后列出辅助命令。例如,如果您希望代码为 53 的键正常映射到反斜杠,但在与 shift 一起使用时映射到条形符号,您可以这样做:
附加信息:这些映射的顺序取决于键盘布局。它通常是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
(它会在您的主目录中创建一个名为(~
) 的文件).xinitrc
然后,您必须在放置命令的主目录中创建一个名为的文件xmodmap .Xmodmap
。您现在可以修改
.Xmodmap
并xmodmap .Xmodmap
从控制台运行以立即查看更改。变化.Xmodmap
将持续存在。来源:Ubuntu论坛
奖励的东西:
如果您要重新映射的键具有不同的行为,具体取决于状态(例如数字键盘中的键如何依赖于 NumLock),您只需
xmodmap -pm
获取修饰符列表,然后执行以下操作:xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"
例如,假设您想在数字键盘上获得一个句点而不是逗号(对大多数程序员很有用),但您想在 NumLock 关闭时保持“删除”行为。
mod2
,因为xmodmap -pm
告诉我们,其他的名字mod2
都是Num_Lock
通过按键获得的xev
。如果您尝试移动 Shift 键,则需要执行一些额外步骤:
我只是事后才想到..我认为“重新映射”可能意味着完全不同的东西..但我会按原样保留我的答案......(我不知道如何重新分配一个键表现得像另一个人)
更新:我的“事后想法”已得到确认;(我回答错了问题:)...请参阅 NES 的社区 Wiki 答案(以上已接受)。
重新映射重新绑定密钥有两种通用方法。(一个键可用于不同应用程序/窗口中的不同事物)
(一个键在所有窗口中具有相同的功能)
对于“程序本地”方法,有时有一种方法可以更改应用程序本身提供的键绑定......例如。
Firefox
有一个名为keyconfig的插件...有关一些信息,请参阅此MozillZine 帖子大多数 Ubuntu 程序都是基于 Gnome 的,并且有一个特定的实用程序可以修改这些 Gnome 应用程序的任何菜单项的键绑定......它被称为
Editable Menu Accelerator
......它是一个非常“敏感”的工具,但非常强大......你可以启用通过运行gconf-editor
(通过终端或 Alt+F2)...导航到--desktop
并选择...。然后您可以将菜单项更改为您喜欢的任何虚拟内容(每个程序/窗口)...我建议您禁用只要你完成了你需要的..gnome
interface
can_change_accels
否则,您可以设置全局热键。我使用了一个名为xbindkeys 的程序,并且通过主菜单还有一个可用的选项——首选项,称为
Keyboard Shortcuts
如果您使用 xbindkeys,则需要将其添加到您的“启动应用程序”(主菜单 - 首选项)中......另外(如 Stefano Palazzo 所建议的)我之前在这个答案中写了一个更详细的 xbindkeys 描述askubuntu 页面
这是我尝试将键映射切换ENTER到SHIFT键的方式(反之亦然):
报告:
报告:
报告:
(忽略接下来的五十行左右)
重要的是每个按键的第三行:
反转映射:
保存结果:
添加
主要问题是逆转没有奏效。键被ENTER映射到SHIFT_R键;但SHIFT_R密钥未映射到ENTER密钥。去搞清楚。
为了独立于 X 进行全局重映射,您可以使用console-setup(5)代替。
就我而言,我想将Caps Lock键重新映射到D,因为我的D-key 坏了:)
首先,我使用dumpkeys(1)来获取映射模板,在D-key 的情况下,有趣的是 keycode 32 的映射(在我的键盘上);请注意,grep 模式中有两个空格!
为了更改要应用的地图Caps Lock(我键盘上的键码 58)
现在它读取
要将此重映射添加到默认映射,只需将其附加到重映射包含文件以进行控制台设置
并且需要重新配置控制台设置
-phigh
(使用 跳过低优先级问题)现在应该完成重新映射,并在启动时自动加载。
我花了一整天时间尝试为
Ctrl+Pageup
.我第一次尝试
xmodmap
但无法生成修饰符事件。因此,不可能创建生成例如Control
事件的快捷方式。然后我尝试
xbindkeys
使用xmacro
. 这种方法有效,但xbindkeys
无法在我的系统上捕获某些组合键,例如Alt + ___
.所以我最终使用 Unity 自己的键盘快捷键 -> 自定义快捷键来设置我的快捷键。
而不是
xmacro
,我现在使用xvkbd
程序来生成键盘事件,但这只是个人喜好。两者xmacro
的xvkbd
工作方式几乎相同。另一个提示是添加延迟参数xmacro
或xvkbd
确保事件不会丢失。对我来说,软件中心的 AutoKey 效果最好。它有直观的 GUI,添加新的绑定点击 New -> Phrase 和
<left>
(特殊键列表在这里)。你也可以试试https://github.com/sezanzeb/input-remapper
它在后台运行并主动注入映射的键码。
虽然这增加了一些额外的灵活性,但如果您只需要重新映射一个按钮并完成,您可以尝试使用 xmodmap。好像已经详细解释过了。
或者编写一个 xkb“符号”文件并使用 setxkbmap,但我不建议这样做。setxkbmap 也可以在每个设备的基础上使用。
编写 xkb 或 xmodmap 配置给我带来了麻烦,尽管如果两个设备报告相同的键码,即使配置将它们映射到不同的字符,同时按下它们(这是我必须为此编写注入工具的主要原因)
最近我遇到了这个解决方案:https ://www.reddit.com/r/linux_gaming/comments/k3h9qv/remapping_keys_using_hwdb_files/
如果您只需要为特定程序重新映射密钥,我刚刚将此功能添加到 hax11。
~/.config/hax11/profiles
要使用 hax11 执行此操作,请在(eg )下打开程序的配置文件配置文件~/.config/hax11/profiles/usr\lib\firefox\firefox
,然后添加:通过 .desktop 快捷方式进行非持久性重映射
在我的情况下,我想将键盘小数点重新映射为逗号,但只是暂时的,所以
xmodmap
在我的情况下满足这个要求:~$ xev | grep keycode
第一次我按下了我想重新映射的键,第二次我按下了我想映射到的键。
..., keycode 91 (...
...(keysym 0x2c, comma),...
找出要重新映射的键码的当前映射是什么:
:~$ xmodmap -pke | grep "keycode\s*91"
如 xmodmap 的手册页中所指定:最多可以将八个键符附加到一个键..:当没有修饰键时使用第一个键符,第二个键符等等...这与我的情况不完全对应,但是反复试验让我发现第二个位置论点是我所追求的Shift
映射到新配置。
:~$ xmodmap -e "keycode 91 = KP_Delete comma KP_Delete KP_Decimal"
映射回原始配置。
:~$ xmodmap -e "keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal"
我创建了几个
.desktop
快捷方式~\.local\share\applications\
来轻松切换到一个或另一个配置:额外信息: 状态字段输出
xev
,状态字段是当前活动修饰符的“总和”。这些是我破译的。