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

现在就把alt的修饰功能也换过来啦!

=========

(2023-06-27)

上面的方法有些不稳定,有时机器休眠一下再打开,xmodmap的效果就消失了,需要再次运行一遍脚本。

更稳定的方法是修改xdk。参考:https://wgzhao.github.io/notes/tips/change-keyboard-layout-in-ubuntu/

posted on 2021-08-01 15:00  Narh  阅读(405)  评论(0编辑  收藏  举报

导航