当前位置: 首页>>技术教程>>正文


我如何重新映射特定的密钥或设备?

, , ,

问题描述

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

我想将PgUp更改为HomePgDown更改为End

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

最佳解决方法

注意:截至2013年,Ubuntu和衍生产品不再使用xmodmap,而是使用xkb。欲了解更多信息,请参阅this answer。以下答案与当前版本不再相关。


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

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

  2. 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 115Next–行为的名称。

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

     xmodmap -e "keycode 110 = Next"
    

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

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

     xmodmap -e "keycode 53 = backslash bar"
    

附加信息:这些映射的序列为KeyShift+Keymode_switch+Keymode_switch+Shift+KeyAltGr+KeyAltGr+Shift+Key。要跳过列,请使用NoSymbol。此外,here是所有键盘的综合列表。

注意:这些更改仅适用于活动X会话,并且在重新引导后会丢失。如果要永久保存更改,则必须在上述命令之后运行以下命令:

xmodmap -pke >~/.Xmodmap

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

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

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

来源:Ubuntu Foruns

奖金的东西:

如果您重新映射的键具有不同的行为(取决于状态(例如数字键盘中的键取决于NumLock),则只需执行xmodmap -pm即可获取修饰符列表,然后执行下列操作:

xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"

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

xmodmap -e "keycode 91 mod2 = KP_Delete period"

mod2,因为xmodmap -pm告诉我们mod2Num_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)…导航到desktopgnomeinterface并选择can_change_accels ….然后,您可以更改菜单项以虚拟任何您喜欢的东西(每个程序/窗口)…我建议你一旦完成你所需要的就尽快关闭它。

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

xorg,keyboard,shortcut-keys,ubuntu

如果您使用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程序来生成键盘事件,但这只是个人偏好。 xmacroxvkbd的工作几乎相同。另一个提示是在xmacroxvkbd中添加延迟参数,以确保事件不会丢失。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/183.html,未经允许,请勿转载。