交换和以与外部键盘相同的方式

交换和以与外部键盘相同的方式

我有一个名为 ~/.speedswapper 的文件,其中包含以下内容:

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

...当我跑步时xmodmap ~/.speedswapper,这会切换escCaps Lock键。我的 ~/.profile 中有这一行,这样每当我登录时这些键就会被切换。

然而,如果我插入外部 USB 键盘,此设置似乎不会保留。我的笔记本电脑的键盘工作得很好,但我必须再次运行该命令才能使外接键盘切换两个键。幸运的是,这样做似乎不会影响我笔记本电脑的键盘——它们似乎是同步的。

一种解决方案是找到某种方法来在插入外部键盘时运行 xmodmap 命令,但我愿意接受另一种按键交换解决方案,如果它更强大的话。操作系统是Ubuntu 13.04。

鉴于 justbrowsing 的评论,看起来这可以通过编写 udev 规则来实现 - 我想我必须使用 RUN 选项,并且应该在 /dev/hidraw0 或 /dev/hidraw1 上触发,这些设备是当我插入键盘时出现...但我仍在尝试理解这个概念,所以我非常感谢那些知道他们在使用 udev 做什么的人提供的任何帮助。

答案1

由于您的 中有此命令~/.profile,因此它只会在您登录时执行一次。一种不太优雅的解决方案是将该命令放在您的 中,~/.bashrc以便每次打开终端时都会运行该命令。

更好的解决方案是定义一个在插入 USB 键盘时udev执行的规则xmodmap(我使用的是为 USB 键盘返回的值,您需要编辑此解决方案以适合您的解决方案):

  1. 获取 USB 键盘的详细信息。在插入键盘的情况下运行此命令:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. 要编写udev规则,您需要知道它们应该匹配什么。您可以通过搜索udevadm info --export-db条目的输出来获取该event6信息,或者直接解析它,如下所示:

    udevadm info --export-db | perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
    

    这会返回几行文本,其中包括我们将使用的文本:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udev当使用 X 程序时变得很复杂,例如,我什至在导出和xmodmap时都无法让它工作。无论如何,我无法让它与你的方法一起工作,所以我的解决方案使用了。首先,您需要找出和的关键代码,您可以通过运行来完成此操作$DISPLAY$XAUTHORITYkeymapEscCaps Lock

    sudo /lib/udev/keymap -i input/event6
    

    然后按相关键。在我的系统上,返回:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. 创建包含以下行的新键盘映射规则:

    0x70029 capslock
    0x70039 esc
    

    并将其另存为/lib/udev/keymaps/speedswap.

  5. 定义一个新udev规则。创建一个名为的文件/etc/udev/rules.d/95-speedswap.rules并将以下行添加到其中:

    ACTION=="add", 
    SUBSYSTEM=="input", 
    ATTRS{idVendor}=="1c4f", 
    ATTRS{idProduct}=="0002", 
    RUN+="keymap $name speedswap"
    

应该可以,至少在我的系统上,插入我的外部 USB 会导致如下Esc行为Caps Lock反之亦然

相关内容