我有一个名为 ~/.speedswapper 的文件,其中包含以下内容:
! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock
...当我跑步时xmodmap ~/.speedswapper
,这会切换esc和Caps Lock键。我的 ~/.profile 中有这一行,这样每当我登录时这些键就会被切换。
然而,如果我插入外部 USB 键盘,此设置似乎不会保留。我的笔记本电脑的键盘工作得很好,但我必须再次运行该命令才能使外接键盘切换两个键。幸运的是,这样做似乎不会影响我笔记本电脑的键盘——它们似乎是同步的。
一种解决方案是找到某种方法来在插入外部键盘时运行 xmodmap 命令,但我愿意接受另一种按键交换解决方案,如果它更强大的话。操作系统是Ubuntu 13.04。
鉴于 justbrowsing 的评论,看起来这可以通过编写 udev 规则来实现 - 我想我必须使用 RUN 选项,并且应该在 /dev/hidraw0 或 /dev/hidraw1 上触发,这些设备是当我插入键盘时出现...但我仍在尝试理解这个概念,所以我非常感谢那些知道他们在使用 udev 做什么的人提供的任何帮助。
答案1
由于您的 中有此命令~/.profile
,因此它只会在您登录时执行一次。一种不太优雅的解决方案是将该命令放在您的 中,~/.bashrc
以便每次打开终端时都会运行该命令。
更好的解决方案是定义一个在插入 USB 键盘时udev
执行的规则xmodmap
(我使用的是为 USB 键盘返回的值,您需要编辑此解决方案以适合您的解决方案):
获取 USB 键盘的详细信息。在插入键盘的情况下运行此命令:
$ /lib/udev/findkeyboards | grep USB USB keyboard: input/event6
要编写
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
udev
当使用 X 程序时变得很复杂,例如,我什至在导出和xmodmap
时都无法让它工作。无论如何,我无法让它与你的方法一起工作,所以我的解决方案使用了。首先,您需要找出和的关键代码,您可以通过运行来完成此操作$DISPLAY
$XAUTHORITY
keymap
EscCaps Locksudo /lib/udev/keymap -i input/event6
然后按相关键。在我的系统上,返回:
scan code: 0x70029 key code: esc scan code: 0x70039 key code: capslock
创建包含以下行的新键盘映射规则:
0x70029 capslock 0x70039 esc
并将其另存为
/lib/udev/keymaps/speedswap
.定义一个新
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反之亦然。