安装

# Arch系
sudo pacman -S xorg-xmodmap

# Debian / Ubuntu
sudo apt install x11-xserver-utils

# Fedora
sudo dnf install xorg-x11-utils

使用

查看所有按键和键码值映射

xmodmap -pke

命令会打印以表达式格式呈现的键映射表:

[...]
keycode  57 = n N
[...]

每个键码后面都跟着映射到的键符。上面的例子意思是:键码57被映射到小写n键符,而大写N键符则对应按下Shift输入的57号键码。

表中的每一列键符都对应着一个特定的修饰键组合,Key为键码所对应的按键:

  1. Key
  2. Shift+Key
  3. Mode_switch+Key
  4. Mode_switch+Shift+Key
  5. ISO_Level3_Shift+Key
  6. ISO_Level3_Shift+Shift+Key

并非所有的键符都必须设置,但如果要跳过一个键符,请将其值设为NoSymbol

使用JavaScript获取键码值的在线网站
JavaScript Key Code Event Tool | Toptal®

自定义映射

临时修改进行测试

假设你想将 Caps Lock 键映射为 Escape 键,首先找到 Caps LockEscape 键对应的键码(例如 Caps Lock66Escape9),然后运行

xmodmap -e "keycode 66 = Escape"

# 重置键盘映射为系统默认的布局和选项,使用另一个工具setxkbmap
setxkbmap
# or
setxkbmap -option

使映射永久生效

关键字:

  • keycode:指定按键的符号映射。
  • clear:清除修饰键的所有绑定。
  • add:将按键添加到修饰键。
  • remove:从修饰键中移除按键。
  • pointer:重新映射鼠标按钮。
  • keysym:重新映射按键符号。
  • shift:修改按键在按下 Shift 键时的行为

创建或编辑 ~/.Xmodmap 文件,添加映射规则:

keycode 66 = Escape

让配置生效

xmodmap ~/.Xmodmap

# 多次修改可以先重置到默认
setxkbmap && xmodmap ~/.Xmodmap

开机自动加载配置

对于GDMXDMLightDM,不需要特别激活~/.Xmodmap。对于startx,请编辑~/.xinitrc 文件:

[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap

也可以编辑全局启动脚本 /etc/X11/xinit/xinitrc

i3wm配置自动加载

# ~/.config/i3/config
exec_always --no-startup-id setxkbmap && xmodmap ~/.Xmodmap

鼠标键

反向滚动

由于 synaptics 驱动程序使用 4/5/6/7 按钮进行上/下/左/右滚动,你只需要调换一下 ~/.Xmodmap 中按钮的声明顺序,比如调换45 的顺序:

pointer = 1 2 3 5 4 7 6 8 9 10 11 12

交换鼠标按键

鼠标左、中、右按钮分别对应于 synaptics 驱动程序中的按钮 1、2和3。如果要交换鼠标左键和右键,也只需将它们在~/.Xmodmap中的顺序颠倒过来即可。

pointer = 3 2 1

修饰键(Mod键)

查看所有修饰键

xmodmap -pm

重新安排修饰键位

在重排之前,需要清除修饰键。原来的键和新的键都得清除。例如,如果您打算将Caps_Lock换到A键,将B换成NumLock键,那么Caps_Lock,Num_Lock,A,B四个键都得清除,然后分配键位,最后再把他们加回来。! 用于注释一行。

举个🌰,编辑~/.XmodmapCapsLock修改为Control,将Shift+CapsLock修改为CapsLock

clear lock
clear control
add control = Caps_Lock Control_L Control_R
keycode 66 = Control_L Caps_Lock NoSymbol NoSymbol

我的使用场景

⚠️ 我在公司的电脑Garuda Linux i3wm下使用的有线键盘,其他环境和设备的配置和键码可能有点差异,键码值映射和修饰键表需要自行通过xmodmap -pkexmodmap -pm 或者xev 确定。🤔 在键盘映射中,Mode_switch键、Hyper 键(emacs、openbox或i3的附加修饰键)通常并没有物理键盘上的直接对应。Hyper 键最初源自早期的计算机键盘设计,如 Lisp 机器键盘,但在现代键盘中,它几乎不再存在。尽管如此,Hyper 键可以通过重新映射其他按键来创建或模拟。
Garuda Linux i3wm的默认修饰键定义

将右Control转为Hyper,让i3wm多一个修饰键使用

clear lock
remove control = Control_R
remove mod4 = Hyper_L

keycode 105 = Hyper_L

!由于i3wm只认识Mod1~5,所以要把Hyper_L绑定到Mod3上面去
add mod3 = Hyper_L

# ~/.config/i3/config
set $super Mod4
set $alt Mod1
set $hyper Mod3

set $preferredBrowser /usr/bin/firedragon

...

exec_always --no-startup-id setxkbmap && xmodmap ~/.Xmodmap

...

bindsym $hyper+Return exec $preferredBrowser;focus

将CapsLock转为Mode_switch将q键的Mode_switch层改成BackSpace,将e键的Mode_switch层改成Delete,将空格键的Mode_switch层改成Return

就像QMK固件的机械键盘能通过VIA改键盘一样,因为公司的键盘不支持VIA改键,我只能想办法通过软件实现,Windows上也有好多软件实现的办法,什么时候互联网公司能给程序员标配麻将音机械键盘吗🐶

clear lock !如果添加了上面的这里就不用了

keycode 66 = Mode_switch
keycode 24 = q Q BackSpace
keycode 26 = e E Delete
keycode 65 = space NoSymbol Return

这个按键映射还是从CapsLock+ 这个Windows软件上学来的

其他我用过的相关/不相关的键盘鼠标工具

  • setxkbmap (Linux)
  • xev (Linux)
  • showkey (Linux)
  • xbindkeys和xdotool (Linux)
  • capslock+ (Windows)
  • capslox (Windows/macOS)
  • autohotkey (Windows)
  • Pulover's Macro Creator (Windows)
  • Quicker (Windows)
  • win-vind (Windows)
  • kmonad (Windows/Linus/macOS)
  • GestureSign  (Windows)

Kenis
1 声望0 粉丝

独立开发者,瞎折腾软硬件,全栈开发,全平台自动化,CV大法。木工,胶佬。。。