AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 24916
Accepted
NES
NES
Asked: 2011-02-06 05:20:44 +0800 CST2011-02-06 05:20:44 +0800 CST 2011-02-06 05:20:44 +0800 CST

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

  • 772

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

IE

我想更改PgUp为Home或。PgDownEnd

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

xorg
  • 11 11 个回答
  • 313612 Views

11 个回答

  • Voted
  1. Best Answer
    NES
    2011-02-06T08:00:08+08:002011-02-06T08:00:08+08:00

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


    要重新映射某些键,您需要两个工具。第一个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 115和Next- 行为的名称。

    3. 现在,当您要交换两个键时,请使用xmodmap.

        xmodmap -e "keycode 110 = Next"
      

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

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

        xmodmap -e "keycode 53 = backslash bar"
      

    附加信息:这些映射的顺序取决于键盘布局。它通常是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 -pke >~/.Xmodmap
    

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

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

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

    来源:Ubuntu论坛

    奖励的东西:

    如果您要重新映射的键具有不同的行为,具体取决于状态(例如数字键盘中的键如何依赖于 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。

    • 283
  2. cmcginty
    2012-12-18T10:46:18+08:002012-12-18T10:46:18+08:00

    如果您尝试移动 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
    
    • 26
  3. Peter.O
    2011-02-06T06:04:34+08:002011-02-06T06:04:34+08:00

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

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

    重新映射重新绑定密钥有两种通用方法。

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

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

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

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

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

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

    • 16
  4. Bill Davis
    2012-01-27T19:04:29+08:002012-01-27T19:04:29+08:00

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

    • 12
  5. arand
    2013-05-12T13:38:03+08:002013-05-12T13:38:03+08:00

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

    就我而言,我想将Caps Lock键重新映射到D,因为我的D-key 坏了:)

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

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

    • 8
  6. HRJ
    2014-01-20T21:30:13+08:002014-01-20T21:30:13+08:00

    我花了一整天时间尝试为Ctrl+Pageup.

    我第一次尝试xmodmap但无法生成修饰符事件。因此,不可能创建生成例如Control事件的快捷方式。

    然后我尝试xbindkeys使用xmacro. 这种方法有效,但xbindkeys无法在我的系统上捕获某些组合键,例如Alt + ___.

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

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

    • 3
  7. ego
    2018-07-29T04:15:13+08:002018-07-29T04:15:13+08:00

    对我来说,软件中心的 AutoKey 效果最好。它有直观的 GUI,添加新的绑定点击 New -> Phrase 和

    1. 添加名称,点击确定
    2. 在“短语设置”部分,确保粘贴使用设置为键盘
    3. 添加要使用的热键
    4. 将命令添加到文本字段中,例如模拟左箭头键 - 它会是<left>(特殊键列表在这里)。
    • 3
  8. sezanzeb
    2020-12-10T11:52:47+08:002020-12-10T11:52:47+08:00

    你也可以试试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/

    • 3
  9. Vladimir Panteleev
    2019-04-16T02:33:24+08:002019-04-16T02:33:24+08:00

    如果您只需要为特定程序重新映射密钥,我刚刚将此功能添加到 hax11。

    我想更改PgUp为Home或。PgDownEnd

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

    Enable=1
    MapK112=K110
    MapK117=K115
    
    • 1
  10. Pau Coma Ramirez
    2021-02-18T03:18:58+08:002021-02-18T03:18:58+08:00

    通过 .desktop 快捷方式进行非持久性重映射

    在我的情况下,我想将键盘小数点重新映射为逗号,但只是暂时的,所以 xmodmap 在我的情况下满足这个要求

    • 找出要重新映射的特定键的键码和我也想 映射的键符。
      • :~$ xev | grep keycode
    • 按下感兴趣的键并监控标准输出
        state 0x10, keycode 91 (keysym 0xffae, KP_Decimal), same_screen YES,
        XKeysymToKeycode returns keycode: 129
        state 0x10, keycode 59 (keysym 0x2c, comma), same_screen YES,
    
    • 第一次我按下了我想重新映射的键,第二次我按下了我想映射到的键。

      • 我要重新映射的键的键码:..., keycode 91 (...
      • Keysym 我希望该键码映射到:...(keysym 0x2c, comma),...
    • 找出要重新映射的键码的当前映射是什么:

      • :~$ xmodmap -pke | grep "keycode\s*91"
    keycode  91 = KP_Delete KP_Decimal KP_Delete KP_Decimal
    

    如 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\来轻松切换到一个或另一个配置:

    [Desktop Entry]
    Name=KeyPad comma
    Exec=xmodmap -e "keycode 91 = KP_Delete comma KP_Delete KP_Decimal"
    Terminal=false
    Type=Application
    Icon=/home/paui/.icons/KP_comma.png
    

    额外信息: 状态字段输出xev,

    状态字段是当前活动修饰符的“总和”。这些是我破译的。

        0x01 Shift
        0x02 Caps
        0x04 Control
        0x08 Alt
        0x10 NumLock
        0x80 Alt Gr
    
    • 1

相关问题

  • 如何从命令行重新启动 X Window Server?

  • xorg 中是否有用于更改视频驱动程序的 GUI?

  • 类似于 Eyefinity 的东西?

  • 如何重置我的键盘布局?

  • 帮助让 Flash 播放器在第二个屏幕上工作?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    我需要什么命令来解压缩/提取 .tar.gz 文件?

    • 8 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Martin Hope
    EmmyS 我需要什么命令来解压缩/提取 .tar.gz 文件? 2011-02-09 14:50:41 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve