ubuntu键位修改

Endless_daydream Lv4

2024.7.14 更新:使用.desktop开机启动

在 ~/.config/autostart/ 下建一个 setkeyboard.desktop,写:

1
2
3
4
5
6
7
8
9
10
11
[Desktop Entry]
Type=Application
Exec=gnome-terminal -- bash -c 'setxkbmap -option caps:swapescape -option ctrl:swap_lalt_lctl'
Terminal=true
Hidden=false
NoDisplay=false
Name[zh_CN]=set keyboard map
Name=set keyboard map
Comment[zh_CN]=键盘映射:交换caps&escape lalt&lctrl
Comment=键盘映射:交换caps&escape lalt&lctrl
X-GNOME-Autostart-enabled=true

要点在这两行:

1
2
Exec=gnome-terminal -- bash -c 'setxkbmap -option caps:swapescape -option ctrl:swap_lalt_lctl'
Terminal=true

必须新开一个terminal来运行,不然不会执行,为此Terminal必须设置为true
命令运行完后这个终端会自动退出,一般不会被察觉


2024.5.20 更新:改用setxkbmap,封装了各种键映射和交换的命令

setxkbmap 修改键位

1
setxkbmap -option caps:swapescape -option ctrl:swap_lalt_lctl

交换capsLock和escape, lAlt和lCtrl。对于第一条,caps是组,swapescape是命令名。第二条同理。

setxkbmap对于不同的映射做了分组管理,各组之间会有重复功能的命令。

/usr/share/X11/xkb/rules文件夹下的base.lst或evdev.lst文件中写了相应的命令和对应的功能,按需查找。

查看当前规则:

1
setxkbmap -print

输出

1
2
3
4
5
6
7
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+us:2+inet(evdev)+capslock(swapescape)+ctrl(swap_lalt_lctl)" };
xkb_geometry { include "pc(pc105)" };
};

可以看出使用的就是evdev规则,由于我的前一条设置,xkb_symbols多了capslock(swapescape)+ctrl(swap_lalt_lctl)这两项

持久化修改

命令行的修改仅对于当前登陆有效,注销或关机后又失效。为了长期有效,将修改键位的命令写到~/.xprofile中,然后chmod +x ~/.xprofile,命令将会在登入时执行

通过打log实测发现.xprofile确实运行了,但键位修改未生效。改为:

1
(sleep 5 && setxkbmap -option caps:swapescape -option ctrl:swap_lalt_lctl)&

休眠的方法生效了,疑似有其他登陆启动项覆盖了我的设置。查看/var/log/Xorg.0.log和/var/log/syslog定位到gdm-x-session启动程序,每次登陆桌面会话都会设置键盘项。怀疑是它,但还没有找到方法在它之后运行~/.xprofile


以下是原博客,使用xmodmap手动修改键位

演示交换大写锁定键caps_lock和esc。

Linux: 使用xmodmap

参考

xmodmap修改keycode到keysyms的映射关系。keycode对应编码物理按键,keysyms是按键翻译成什么功能。参考Linux下的keycode与keysyms

1
2
3
4
xmodmap -pke # 查看键位
xmodmap -pm # 查看功能键
xmodmap -g # 查看语法
xmodmap -e "clear lock" # 执行一条指令

创建~/.Xmodmap, “!”表示注释:

1
2
3
4
clear lock
keycode 66 = Escape NoSymbol Escape
keycode 9 = Caps_Lock NoSymbol Caps_Lock
add lock = Caps_Lock

使用:

1
xmodmap ~/.Xmodmap

一开始调如果键盘不自带大写锁定灯,可能不容易发现问题,可以安装一个键盘回显软件帮助调试,比如screenkey。

修改.bashrc使得每次启动生效,加入:

1
[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap &>/dev/null

但这会导致打开CLI窗口可能两行xmodmap命令,据说要写在~/.xinitrc里,现在还没整出来。

vscode中上述调整不生效

ctrl+,打开设置找到Keyboard Dispatch,将选项从code改为keyCode即可

个人配置

Capslock <-> Escape
Left Ctrl <-> Left Alt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
! swap Escape and Caps_lock
clear lock
keycode 66 = Escape NoSymbol Escape
keycode 9 = Caps_Lock NoSymbol Caps_Lock
add lock = Caps_Lock

! swap left Ctrl and left Alt
remove mod1 = Alt_L
remove control = Control_L
keycode 64 = Control_L NoSymbol Control_L
keycode 37 = Alt_L NoSymbol Alt_L
add mod1 = Alt_L
add control = Control_L

  • Title: ubuntu键位修改
  • Author: Endless_daydream
  • Created at : 2024-03-02 14:39:52
  • Updated at : 2024-07-14 17:28:50
  • Link: https://endless_daydream.gitee.io/2024/03/02/linux/ubuntu键位修改/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
ubuntu键位修改