Linux下将Caps重映射为Esc和Ctrl的一种简便方法

Linux下将Caps重映射为Esc和Ctrl的一种简便方法


写在前面: 本文是对于Linux操作系统下,对于标准键盘的键盘重映射的记录,同时能够给想对键盘重映射的同学提供一个参考。



问题引入

由于本文更多是为了记录的目的,如果不想听个人的罗嗦,可以直接跳转到快速解决

在使用Vim的过程中,经常会使用到Esc键来进行Normal模式和Insert模式的切换。但是由于Esc键位距离主键盘的位置太远,所以需要自己进行设置。方式也有很多:有使用快捷键进行代替的,也有用Ctrl+]代替的。但是本人不喜欢这样优柔寡断的解决方案。希望能够在不仅仅使用Vim时做到esc键位的方便,在其他软件的使用中也能做到同样的效果。

所以,在网络上搜索之后发现了对键盘键位进行重映射的方法。于是才有了这篇文章。

常见的解决方案

一开始我在网络上找到了很多种键位重映射的方案

  1. 使用xmodmap,参考教程网站
  2. 使用XCaps软件辅助,参考教程网站
  3. 使用caps2esc软件达到重映射的效果,参考网站教程

xcaps

一开始我是使用的第二种方案,对于新手来说比较友好,也不需要配置复杂的环境。按照教程操作之后确实可以达到我想要的效果:Caps短按是Esc,按组合键是Ctrl。但是原来的Ctrl键变成了CapsLosck键,这一时间有些不习惯,会导致经常性按错。但是这不是主要原因我放弃了它,转而寻找一种新的方法。真正的不可接受的是,在我的电脑环境下(Ubuntu 22.04LTS), 经常性的失灵,这使得我在某个时间正愉快地编辑的时候,突然发现键位变了。想要恢复还得重启电脑(可能有简单的方法我没有找到).

caps2esc

在这个时间段里面,我同时也在尝试给我的Windows系统也修改一下键位的映射。不然在系统切换的时候得用两套不同的键盘很难受。于是我在网络上找到了,caps2esc这个软件。也就是上面提到的第三种方案。按照里面的教程我很快就在WIndows中配置好了。而且在Windows中的这个软件稳定性很高,并且能够保留原来的Ctrl功能,把CapsLock键位给映射到原来的Esc键上面去。很舒服。这样就不用担心会误触了,而且兼容之前的使用习惯。

查看caps2esc的gitlab官网的时候,我发现这个caps2esc还支持在linux系统下的使用,这让我很是激动。于是打算按照他的这个教程来配置一下我的Linux环境

我主要参考的是gitlab上的教程和上面提到的第三个教程,但是比较懵,现在看来教程的主要目的就是将一个系统服务添加到系统自启动项目中去。所以在教程中会叫你创建一个名为udenmon.yaml的文件和udevmon.service的文件。.yaml是一种脚本语言。.service是一项系统任务。关于** systemctl命令的相关介绍** 可以看这篇关于systemctld的博客.

后面的本地服务配置比较容易完成, 但是前面部分的程序环境搭建就没那么顺利了。要执行下面三个命令。

sudo add-apt-repository ppa:deafmute/interception
sudo apt install interception-tools
sudo apt install interception-caps2es

由于caps2esc是依赖于interception的,需要先创建相关的环境,所以在执行第二条命令的时候就出了问题。

Depends: libyaml-cpp0.6 (>= 0.6.2) but it is not installable

这一看就是相关的依赖又没有添加,所以正当我打算添加libyaml-cpp0.6时,发现直接用Ubuntu自带的apt-get安装只能安装0.7的版本,这就十分尴尬了。当然我尝试过能不能用0.7兼容0.6,显然是不能的,这东西它只认0.6的版本。我还得自己去找这个版本的.deb包。
前面说过,本文主要用来记录。所以给出下载网站.然后执行dpkg命令,后面跟上需要安装的.deb包。

sudo dpkg -i *******.deb 

之后重新执行以上三条命令就能成功安装了。

为什么我觉得恶心心呢,因为在我的环境下(有可能是软件的BUG也有可能是我本身环境的配置问题),不知道为什么,当我按下Ctrl与其他按键的组合键的时候,会自动执行原来CapsLock本身的功能,并且会输出一个大写的A之类的字符。

在我尝试排除过很多可能的问题之后,包括重装,重启,甚至直接从源码编译。我放弃了…

xmodmap

这个方法本身是最简单的,它只用到了xmodmap软件,在很多X11基础的图形化界面中甚至这个软件是自带的。如果没有就下载一个,自行搜索下载方法. 那为什么一开始不用这个方法呢,因为我看网上的教程中说这个方法只能把两个按键交换位置,并不能实现CapsLock在短按和长按分别为不同功能的作用。

但是经过我在无奈之下的研究,了解xmodmap重映射的原理之后,我发现只用xmodmap也能把CapsLock映射到两个按键的功能,具体实现看下一节的介绍。

原创解决方案

首先需要理解键盘的工作原理,这一部分网上有很多博客都在介绍,这里推荐这个博客.

简单理解就是:键盘上每一个按键按下只是给操作系统发送了一个信号(中断)。比如按下’a’,只是给操作系统发送了一个“38号按键”已经按下的信息,具体对此应该做怎样的处理则交给操作系统来处理。在这个情况下,按下“38号按键”对应的是’a’的编码。

  • 每一个按键的物理序号和位置都是固定的。('a’的位置对应38号按键)
  • 同时每一个想要真实表达的信息编码也是确定的(如’a’就只能对应0x62,'b’就只能对应0x63).

所以,能够改变的只是上面两者的对应关系。明白这一点后,再来看看组合键是如何实现的。

key_map
图中显示的shift,control,lock等是按键按下的功能,举个例子:假如说我按下了左边Shift_L对应位置的按键,正常来说是对应一个“使用者想按下shift而不是a”的信号,所以这时候对应的编码是0x32。

但是,按下Shift_L之后又有什么用呢?注意到一点,我们单独按Shift是没有任何反应的,说明shift功能本身对应的编码0x32就不会产生任何反应。我们都知道的Shift组合键的一个最简单的功能就是将其他按键对应的其他字符显示出来,或者切换大小写。

关键来了,Shift编号0x32本身是不会产生任何效果的,与0x62编号产生一个a不同。但是我们在这个基础上赋予了0x32按键按下不放开的状态一个新的含义.由于这个含义是后来赋予的,和键盘硬件以及对应的编码都没有关系。所以其实我们也是可以把这个含义赋予到其他按键编码上面。那为什么不这样做呢?原因就是其他案件都有自己本身产生的效果或者反映,而Shift(0x32)等等这一类的按键编码则没有任何自身的反应,这岂不是绝配?!

明白了这个shift组合键的原理,再来看conttrol和lock键也就自然能明白了。我在理解这一点之后做的事情很简单,首先将键盘上的Esc与CapsLock键对应的键码交换,所以Esc实现的是转换大小写的功能,CapsLock实现的是退出的功能。然后再将control键的这个状态赋予了Esc的键码(0x42).

前面说道,shift,control这个状态切换的能力是我们使用者有能力赋予给对应的键码的。所以这里赋予给ESC(0x42)也是没有任何问题的。然后就是考虑功能会不会重叠的问题,实际测试过:按下配置好的CapsLock后会首先给出一个Esc功能的键码给操作系统,再切换状态。

在日常使用中,如果想要按下Esc是只需要按一次的。反正我是没见过有哪种情况需要同时按下Esc和其他的按键。然后进入Control状态再退出,control模式只要你不同时按其他的键相当与没按,啥也不做,所以这个情况是没有任何影响的。

如果只想要按下Ctrl键,那么意味着自动先输入了一个Escape。这个虽然理论上是会有影响,但是在日常使用中可谓是微乎其微。除非你在看视频的全屏状态下想按下Ctrl组合键,这样会使得你退出全屏。还一点就是,对于使用Vim的人来说,这还是一件好事,因为大多数Ctrl的组合键都是在Normal模式下进行的。这相当于可以直接在Insert模式直接按下Ctrl组合键,然后直接跳转到Normal模式执行想要的命令。

总之这样改完是稍微有一点影响的,不过影响微乎其微。用过才知道真的好用。况且,要是真的有那种需要不先按下Esc直接按Ctrl组合键的需求,原来的左右两个Ctrl这不也没动它吗。

配置xmodmap

在家目录下创建一个.xmodmap的配置文件。这里附上我的配置供参考

clear lock
clear control 
add Control = Control_L
add Control = Control_R
add Control = Escape
keycode 9 = Caps_Lock
keycode 66 = Escape
keycode 37 = Control_L

因为我的这个配置之前弄得有点混乱,所以我选择一开始全部清除再重新配置,如果是默认的正常配置,那么前4行可以省略。

可能有同学会在网上看见这样的配置:

clear Lock
keysym Caps_Lock = Escape
keysym Escape = Caps_Lock
add Lock = Caps_Lock

一个主要的区别是,被修改的实际键盘上的编号表示方式的不同keycode是用一个不会变的物理编号来表示。keysym是用一个变量来表示,这个等号左边变量名又恰好和等号右边的实际功能名一样。就特别容易混淆,这里推荐还是用keycode表示,清晰又直观。

配置完成之后就只需要更新配置:

xmodmap ~/.xmodmap

当然一个很自然的想法就是希望能在开机时候自己启动,这样就可以毫无察觉地更改键位了,但是我按照网上的教程尝试过很多方法,包括但不限于:修改.bashrc_profile, 修改.profile,修改crontab周期执行程序,添加脚本到/etc/init.d/,添加system系统服务程序,添加autostart等等。后面三种是我在那照猫画虎,但是前面几种方法我是真没搞懂是哪出的问题。登录后再source ~/.profile都没有问题。我只能是理解成登录后又重新恢复了一下默认配置了。有知道原因的同学麻烦指导指导。

所以我只能用手动的方式来进行了:创建一个包含开机需要运行一次的脚本start.sh.然后在/usr/local/bin中创建一个软链接startup指向这个脚本。开机后手动执行一次startup,这也是一个暂时的方式了


写在最后:感谢能读到这里,希望没有浪费您宝贵的时间,如果觉得还不错,不要吝啬手中的赞呦~。

其他有关的资料代码放在了sycamoremoon’s github,需要的同学可以自取。

之后还会有其他的内容上传,希望我的小小努力能够给大家带来帮助

这是我的网站,内容会随着时间逐渐丰富的…

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不努力就会变成沸羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值