如何重新映射某些密钥或设备?

NES*_*NES 268 xorg keyboard shortcut-keys

我正在寻找一种在 ubuntu 中重新映射某些键的方法。

IE

我想换PgUpHomePgDownEnd

在 Ubuntu/GNOME 中是否存在重新分配密钥的内置命令或工具?

NES*_*NES 278

注意:从 2013 年开始,Ubuntu 及其衍生产品不再使用xmodmap,而是使用xkb. 有关更多信息,请参阅此答案。下面的答案不再与当前版本相关。


要重新映射某些键,您需要两个工具。第一个xev(命令行工具)和第二个xmodmap(也是命令行工具)。两者都应该在 Ubuntu 中可用,而无需额外安装它们。

  1. 启动终端窗口并运行xev. 现在它处于活动状态并等待您按下一个键。然后按下要更改其行为的键。即PgUp

  2. xev将输出有关按下的键的一些信息。第三行很重要。它应该类似于:

    state 0x10, keycode 110 (keysym 0xff55, Prior), same_screen YES,
    
    Run Code Online (Sandbox Code Playgroud)

    在这个例子中Prior是键此时被分配的行为的名称,数字键码是识别键的内部 id。现在用另一个键来做这个,即PgDown给出这个输出

    state 0x10, keycode 115 (keysym 0xff56, Next), same_screen YES,
    
    Run Code Online (Sandbox Code Playgroud)

    对我们来说keycode 115,这里再次有趣的部分是和Next- 行为的名称。

  3. 现在当你想交换两个键时使用xmodmap.

     xmodmap -e "keycode 110 = Next"
    
    Run Code Online (Sandbox Code Playgroud)

    这会将键盘上键码为 110 的键更改为 action Next。这很简单。

    请注意,如果您映射的键在与Shift键一起使用时应该具有不同的含义(例如对于英式键盘布局,Shift+2给出引号),那么您可以简单地在第一个命令之后列出第二个命令。例如,如果您希望代码为 53 的键正常映射到反斜杠,但在与 shift 一起使用时映射到条形符号,您可以这样做:

     xmodmap -e "keycode 53 = backslash bar"
    
    Run Code Online (Sandbox Code Playgroud)

附加信息:这些映射的顺序是KeyShift+Keymode_switch+Keymode_switch+Shift+KeyAltGr+KeyAltGr+Shift+Key。要跳过一列,请使用NoSymbol. 此外,这里是所有键符的完整列表。

注意:这些更改仅适用于活动的 X 会话,并且会在重新启动后丢失。当您想永久保存更改时,您必须在上述命令之后运行以下命令:

xmodmap -pke >~/.Xmodmap
Run Code Online (Sandbox Code Playgroud)

(它会.Xmodmap在您的主目录 ( ~) 中创建一个名为的文件)

然后,您必须.xinitrc在放置命令的主目录中创建一个名为的文件xmodmap .Xmodmap

您现在可以修改.Xmodmapxmodmap .Xmodmap从控制台运行以立即查看更改。中的变化.Xmodmap将持续存在。

来源:Ubuntu 论坛

奖金东西:

如果您要重新映射的键根据状态具有不同的行为(例如数字键盘中的键如何依赖 NumLock),您只需xmodmap -pm获取修饰符列表,然后执行以下操作:

xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"

例如,假设您想在数字键盘上获得句点而不是逗号(对大多数程序员有用),但您想在 NumLock 关闭时保持“删除”行为。

xmodmap -e "keycode 91 mod2 = KP_Delete period"
Run Code Online (Sandbox Code Playgroud)

mod2,因为xmodmap -pm告诉我们,mod2就是Num_Lock,其他的名称会被按下的键获得xev

  • `xev` 无法捕捉到 `Fn` 按键 (5认同)
  • 所选答案不适用于在 Ubuntu 12.10 上为我重新映射 Caps-lock 键。我可以通过转到系统设置 -> 键盘 -> 布局设置 -> 选项来做到这一点,其中有一个键和替代行为的列表。在 Unity 和终端中完美运行。 (3认同)

cmc*_*nty 23

如果您尝试移动 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
Run Code Online (Sandbox Code Playgroud)

  • 用户在联想笔记本电脑上使用键盘的重要答案 (3认同)

Pet*_*r.O 16

我刚刚有一个事后的想法..我认为“重新映射”可能意味着完全不同的东西..但我会保留我的答案......(我不知道如何将一个键重新分配给表现得像另一个人)

更新:我的“事后想法”已得到确认;(我回答了错误的问题 :)...请参阅 NES 的社区 Wiki 答案(上面已接受)。

有两种重新映射重新绑定键的一般方法。

  • 本地到特定程序
    (一个密钥可用于不同应用程序/窗口中的不同内容)
  • 全局特定用户
    (一个键在所有窗口中具有相同的功能)

对于“程序本地”方法,有时有一种方法可以更改应用程序本身提供的键绑定......例如。

Firefox有一个名为keyconfig的插件......有关一些信息,请参阅此MozillZine 帖子

大多数 Ubuntu 程序都是基于 Gnome 的,并且有一个特定的实用程序可以修改这些 Gnome 应用程序的任何菜单项的键绑定......它被称为Editable Menu Accelerator......这是一个非常“敏感”的工具,但非常强大......你可以启用通过运行gconf-editor(通过终端或 Alt+F2)...导航到desktop-- gnome--interface并选择can_change_accels.... 然后您可以将菜单项更改为您喜欢的任何虚拟内容(每个程序/窗口)...我建议您禁用一旦你完成了你需要的事情..

否则,您可以设置全局热键。我使用一个名为xbindkeys的程序 安装 xbindkeys,还有一个选项可以通过主菜单 - 首选项,称为 Keyboard Shortcuts

如果您使用 xbindkeys,您将需要将其添加到您的“启动应用程序”(主菜单 - 首选项)...此外(如 Stefano Palazzo 所建议)我之前在一个关于此的答案中写了更详细的 xbindkeys 描述askubuntu 页面


小智 11

这是我尝试将ENTER键的映射切换到SHIFT键(反之亦然)的方法:

$ uname -a
Run Code Online (Sandbox Code Playgroud)

报告:

Linux box 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:35:14 UTC 2011 i686 GNU/Linux

$ which xmodmap
Run Code Online (Sandbox Code Playgroud)

报告:

/usr/bin/xmodmap

$ which xev
Run Code Online (Sandbox Code Playgroud)

报告:

/usr/bin/xev

$ xev
Run Code Online (Sandbox Code Playgroud)

(忽略接下来的五十行左右)

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
Run Code Online (Sandbox Code Playgroud)

重要的是每个按键的第三行:

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".
Run Code Online (Sandbox Code Playgroud)

反转映射:

$ xmodmap -e "keycode 62 = Return"
$ xmodmap -e "keycode 36 = Shift_R"
Run Code Online (Sandbox Code Playgroud)

保存结果:

$ xmodmap -pke > ~/.Xmodmap
$ vi ~/.xinitrc
Run Code Online (Sandbox Code Playgroud)

添加

 xmodmap ~/.Xmodmap

$ sudo reboot
Run Code Online (Sandbox Code Playgroud)

主要问题是逆转没有奏效。该ENTER键被映射到SHIFT_R关键; 但SHIFT_R密钥没有映射到ENTER密钥。去搞清楚。


ara*_*and 8

为了独立于 X 进行全局重映射,您可以改用console-setup(5)

在我的情况下,我想将Caps Lockkey重新映射到D,因为我的D-key 坏了:)

首先,我使用dumpkeys(1)来获取映射模板,在D-key的情况下,有趣的是键码 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...)
Run Code Online (Sandbox Code Playgroud)

为了更改要应用的地图Caps Lock(键盘上的键码 58)

sed 's/32/58/' -i tempfile
Run Code Online (Sandbox Code Playgroud)

现在它读

keycode  58 = +d
    shift   keycode  58 = +D
    altgr   keycode  58 = +eth
(etc...)
Run Code Online (Sandbox Code Playgroud)

要将此重映射添加到默认映射,只需将其附加到控制台设置的重映射包含文件中

sudo sh -c 'cat tempfile >> /etc/console-setup/remap.inc'
Run Code Online (Sandbox Code Playgroud)

控制台设置需要重新配置(跳过低优先级的问题-phigh

sudo dpkg-reconfigure console-setup -phigh
Run Code Online (Sandbox Code Playgroud)

现在重新映射应该完成,并在启动时自动加载。


归档时间:

查看次数:

298887 次

最近记录:

4 年,7 月 前