GUI按键映射

概述

最近过年打算给现在使用的双飞燕薄膜键盘做个扫除,但无奈键盘清洁失败导致按键失灵,所以只能使用备用的机械键盘。由于一直习惯左侧Caps lockCtrl键使用,所以需要按键映射。
以往的做法是使用setkeycode命令实现键盘映射,setkeycode能够兼容console和GUI环境,不存在其他后续问题。但是新键盘使用的是USB接口,刚好家里有一个USB转PS/2接口的转接头,测试了下键盘直接失效了,所以只能其他方法实现按键映射,网上关于键盘映射的办法有很多,这里把几种经过测试的办法罗列出来。

方法1 xmodmap

  1. 安装xmodmap
emerge xmodmap
  1. 添加自定义映射配置脚本
vim ~/.Xmodmap
remove Lock = Caps_Lock
remove Control = Control_L
keysym Caps_Lock = Control_L
keysym Control_L = Caps_Lock
add Lock = Caps_Lock
add Control = Control_L
  1. 设置映射
xmodmap ~/.Xmodmap

现在左侧的Caps lock键就可以当Ctrl键使用了。这种设置有2个问题:

  1. 按键映射只能在X环境中使用
  2. 需要提前加载映射配置

从网上搜索到一些资料,可以在$HOME/.xinitrc文件中调用xmodmap命令加载按键映射。
由于我使用了登陆管理器,打算直接修改/etc/X11/xinit/xinitrc文件,但是gentoo已经默认设置了读取$HOME/.Xmodmap文件加载按键映射。(可能跟已经安装了xmodmap有关系)
所以可以根据目前使用的系统更改下配置的应用方法,正如前面提到的,这个配置文件的位置决定了这种按键映射的覆盖范围,所以如果你的电脑是多用户使用,最好不要设置成全局的。

方法2 使用setxkbmap

  1. 安装setxkbmap
emerge setxkbmap
  1. 执行映射命令
setxkbmap -layout us -option ctrl:nocaps

以上操作只是把caps lock键映射成了ctrl键,左下角的ctrl键没有互换。对于这个操作也是本次系统启动有效,所以如果想持久化这个按键映射需要写入到配置文件中。可以参考方法的设置。

方法3 使用localectl

localectl set-x11-keymap "" "" "" "ctrl:swapcaps"

localectl命令是systemd全家桶的一个命令,可以用来修改键盘布局,设置后注销登陆即可生效,自动保存配置。localectl使用的设置是全局的,任何用户都会应用这种配置。

总结

三种办法都可以实现按键的映射,由于我的系统只是个人使用,所以使用了localectl的方法设置按键映射。但是,无论使用哪种办法,在virtualbox虚拟机中,映射都会失效。需要在虚拟机中单独配置按键映射。这个就需要根据虚拟机内的环境,选择映射工具了。(setkeycode不存在这种问题)

另外,关于薄膜键盘的清理,由于键盘是一个键冒、死角众多的设备,所以如果想清理键盘,那注定是要拔掉键冒。而在拔掉键冒以后,键盘本身的附着物由于长时间附着在键盘上,强力吸尘器都无法清理掉这些碎屑,唯有水洗。而键盘的主体包含电路板和薄膜部分,所以必须拆开水洗。内部的胶皮碗众多,这又增加了清理的复杂程度。最后算一算,清晰一个键盘大概需要半天的时间。想一想时间成本,其实你可以做很多事情!
所以针对这次清洗操作,得到以下观点:

  1. 键盘长期使用,作为一个长期与手接触的设备,必定需要保持清洁。
  2. 清洁薄膜键盘是一个不划算的事情,建议使用2-3年后直接换新的。
  3. 养成良好的使用习惯,身体不要前倾,减少头屑、掉发落入键盘缝隙。
  4. 不要在电脑跟前吃食物,食物残渣和手上的油污都是键盘变脏的直接原因。

参考链接

xmodmap命令(Arch Wiki)
localectl按键映射
命令行按键映射
udev 按键修改
按键映射的众多办法