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


236

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

我想换PgUpHomePgDownEnd

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


在这里查看我的答案。不值得复制并粘贴相同的答案。也许会对您有所帮助。
拉胡尔·维尔帕拉

1
这里是否有用于CTRL-P / N的,类似于Emacs的单位步骤绑定?
莱奥波德·赫兹(LéoLéopoldHertz)2015年

由于有一段时间了xmodmap!要获得系统范围的设置,您必须使用xkb。因此,在其中编辑语言文件以/usr/share/X11/xkb/symbols/在其中添加您的更改。参见askubuntu.com/a/898462/34298
rubo77

Answers:


249

注意:自2013年起,Ubuntu及其衍生版本不再使用xmodmap,而是使用xkb。有关更多信息,请参见此答案。以下答案与当前版本不再相关。


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

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

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

    state 0x10, keycode 110 (keysym 0xff55, Prior), same_screen YES,
    

    在此示例中,Prior是该键当前分配给的行为的名称,数字keycode是识别该键的内部ID。现在,用另一个键执行此操作,即PgDown给出此输出

    state 0x10, keycode 115 (keysym 0xff56, Next), same_screen YES,
    

    对我们来说keycode 115,最有趣的部分是Next-行为的名称。

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

     xmodmap -e "keycode 110 = Next"
    

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

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

     xmodmap -e "keycode 53 = backslash bar"
    

其他信息:这些映射的顺序KeyShift+Keymode_switch+Keymode_switch+Shift+KeyAltGr+KeyAltGr+Shift+Key。要跳过列,请使用NoSymbol。此外,是所有按键的全面列表。

注意:这些更改仅适用于活动的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关闭时保持“删除”行为。

xmodmap -e "keycode 91 mod2 = KP_Delete period"

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


3
xev无法捕获Fn按键信息
om-nom-nom

3
所选答案无法为我在Ubuntu 12.10上重新映射Caps-lock键。我可以通过转到系统设置->键盘->布局设置->选项来做到这一点,该菜单包含键和替代行为的列表。在Unity和终端中完美工作。
异氰酸烯丙酯

1
如果您连接了多个键盘,这些工具会在另一个键盘上看到相同按键之间的区别吗?
stommestack

1
奇怪,我做了所有事情,但是重新启动后我的键盘映射仍然重置。
哥斯达黎加

1
我认为我-event在Ubuntu 12.04中没有标志。它会引发错误,并且不会在中提及“事件” man xev
同构

20

如果您尝试移动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

+1所有修改器中最统一的答案(我已经这样做了,回到我的iBook 2,当我希望Enter键具有Control_R的功能,但忘记了细节时)。
rbrito

2
用户在Lenovo笔记本电脑上使用键盘的重要答案
EinarÓlafsson17年

16

我刚想了一下。.我想您可能会说“重新映射”一词完全不同。.但是我将保留原样……(我不知道如何重新分配一个键来表现得一样)

更新:我的“事后想法”已得到确认;(我回答了错误的问题:)...请参阅NES的Community 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页面


+1,非常好!一个建议:您应该将您对另一个问题的好的回答集成到这个问题中,或者也可以稍微解释一下xbindkeys的配置格式。
Stefano Palazzo

1
有关分配其他键的内容,可以通过xdotool查看手册页来解决,我已使用它来解决此问题
Stefano Palazzo

我最近发现了另一种方法,将xmodmap工具与xev工具结合使用。我不知道xmodmap和xbindkeys之间的区别是什么,但这对我来说很好。一些建议与工具,以首选的两个?这是一个非常有用的分步指南,其中介绍了xmodmap和xev ubuntuforums.org/showpost.php?p=7675138&postcount=2
NES

@NES ..看来我已解决了错误的问题。.您似乎想实际重新映射操作系统解释特定键的方式,即非标准键盘解释,而我一直在指标准键盘解释,并且只需重载默认键分配即可。(我认为您所追求的类似于交换左右鼠标按钮)..看来我的回答对错是有帮助的:)
Peter.O 2011年

是的,但是没有问题。答案也很有趣。我发布上面链接的分步指南是正确的方法。因此,我将为其他用户提供良好指导的解决方案提供简短答案。感谢弗雷德
NES

9

这是我尝试将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密钥。去搞清楚。


7

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

在我的情况下,由于-key损坏,我想将Caps Lockkey 重新映射到:)DD

首先,我使用dumpkeys(1)获取映射模板,在使用-key的情况下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...)

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

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

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


3

我花了一整天的时间尝试为它创建快捷方式Ctrl+Pageup

我首先尝试过,xmodmap但是不能生成修饰符事件。因此,不可能创建用于生成Control事件的快捷方式。

然后xbindkeys,我尝试了xmacro。这种工作有效,但是xbindkeys无法捕获我系统上的某些组合键,例如Alt + ___

因此,我最终使用Unity自己的键盘快捷键->自定义快捷键来设置我的快捷键。

而不是xmacro,我现在使用xvkbd程序来生成键盘事件,但这只是个人喜好。两者xmacroxvkbd工作几乎相同。另一个提示是在其中添加延迟参数xmacroxvkbd确保事件不会丢失。


2

对我而言,Software Center的AutoKey表现最好。它具有直观的GUI,要添加新的绑定,请单击“新建”->“短语”,然后

  1. 添加名称,单击确定
  2. 在“短语设置”部分,确保将“使用粘贴”设置为键盘
  3. 添加您要使用的热键
  4. 在文本字段中添加命令,例如模拟左箭头键-可以<left>(特殊键列表在此处)。

这个工作PERFEKT建立Super+CSuper+VCtrl+CCtrl+V。在Mac上通过VirtualBox使用Ubuntu时,这是一个完美的解决方案
Ben

但是,这不会禁用其他侦听这些快捷方式的命令。要禁用Super+V“显示通知列表”,请转到“设置”->“设备”->“键盘”并在此处禁用它
Ben

@Ben是的,如果它显示了其他应用程序的绑定,那就太好了,但这真是锦上添花。我的问题是不可能重新映射“ Fn”键。我决定尝试使用uhk键盘-可以独立于os进行编程的东西,它将了解它的运行情况。
自我

0

如果您只需要为特定程序重新映射键,则我刚刚将此功能添加到hax​​11。

我想换PgUpHomePgDownEnd

要使用hax11进行此操作,请在~/.config/hax11/profiles(例如~/.config/hax11/profiles/usr\lib\firefox\firefox)下打开程序的配置文件配置文件,然后添加:

Enable=1
MapK112=K110
MapK117=K115
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.