Linux系统下修改键盘映射
因为用 Emacs 的时候常用到 ctrl ,所以小指不适。想将 ctrl 和 capslock 换一下。
https://www.bilibili.com/read/cv5156572/
可是输入 udevadm hwdb -- update 之后出现提示:
/etc/udev/hwdb.d/99-personal-kbd.hwdb:5: Property expected, ignoring record with no properties
没有成功。
还是用 xmodmap 的方法吧。
http://t.zoukankan.com/zhaoyu1995-p-6288412.html
remove Lock = Caps_Lock remove Shift = Shift_L remove Control = Control_L keysym Shift = Control_L keysym Control = Caps_Lock keysym Caps_Lock = Shift_L add Lock = Caps_Lock add Shift = Shift_L add Control = Control_L
但是输入xmodmap .xmodmap之后提示:
xmodmap: .xmodmap:4: bad keysym target key symbol 'Shift'
xmodmap: .xmodmap:5: bad keysym target key symbol 'Control'
xmodmap: 2 errors encountered, aborting.
之前只改 control 和 capslock 的时候成功了,但想改三个的时候失败了。变成了 control 和 shift 换了、capslock 没变。待机又启动后改的映射都没了!
上面那个博客里改三个键的时候用了 keycode .下面这两篇博客说了 keycode .
https://blog.csdn.net/wslzj2003/article/details/78590248
https://www.cnblogs.com/yinheyi/p/10146900.html
用 xmodmap -pk 查看现在的映射:
37 0xffe3 (Control_L) 0x0000 (NoSymbol) 0xffe3 (Control_L) 50 0xffe1 (Shift_L) 0x0000 (NoSymbol) 0xffe1 (Shift_L) 66 0xffe5 (Caps_Lock) 0x0000 (NoSymbol) 0xffe5 (Caps_Lock)
于是写成了这样:
remove Lock = Caps_Lock remove Shift = Shift_L remove Control = Control_L keycode 37 = Caps_Lock NoSymbol Caps_Lock keycode 50 = Control_L NoSymbol Control_L keycode 66 = Shift_L NoSymbol Shift_L add Lock = Caps_Lock add Shift = Shift_L add Control = Control_L
然后在目录 ~ 下输入 xmodmap .xmodmap ,就成功改好了!
每次重启之后都需要再次输入 xmodmap ~/.xmodmap 才行。
(2021-08-01)
=========
(2022-06-30)
可以把这个命令加到开机启动项里,即在“启动应用程序”里把xmodmap脚本加进去。
今天用上了一个机械键盘,发现win键和左alt键的映射与我的习惯是反着的,于是想调整一下。因为这两个键有修饰键的功能,所以遇到了一些困难,记录一下。
参考:https://blog.csdn.net/guangmingsky/article/details/78721370
首先用xmodmap -pm查看当前修饰键的映射情况:
xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x25) control Control_L (0x42), Control_R (0x69) mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
经过xev命令,发现原先的左alt对应“Super_L”,键值133;右alt对应"Alt_L",键值108.
用keycode ** = ***交换二者^ ^
交换之后,左alt确实变成左alt了,可以在emacs里作为meta使用,但在系统层面还是不能作为修饰键使用,比如ctrl+alt+T之类的快捷键还是跟着原来的按键位置,而且不论哪个键都不能召出alt+v了!
用keycode进行修改,只是改了按键的“处理方法”,还没有改“修饰方法”。在emacs里,emacs自己利用处理方法做出了修饰方法,但在系统层面,修饰方法还没有被改过去。
应该用 add ** = *** 来改变修饰方法的绑定,但只知道Lock, Control, Shift,不知道alt叫什么名字(不叫Alter、Option、Command)
参考:https://www.jianshu.com/p/afaaf8eb99d5
原来只需要用xmodmap -pm里看到的mod1、mod4作为修饰名字即可!
remove mod1 = Alt_L remove mod4 = Super_L keycode 133 = Alt_L NoSymbol Alt_L keycode 64 = Super_L NoSymbol Super_L add mod1 = Alt_L add mod4 = Super_L
=========
(2023-06-27)
上面的方法有些不稳定,有时机器休眠一下再打开,xmodmap的效果就消失了,需要再次运行一遍脚本。
更稳定的方法是修改xdk。参考:https://wgzhao.github.io/notes/tips/change-keyboard-layout-in-ubuntu/