我用 Linux 的日常是这样一条链路:
键盘 → 内核 → X11 / AwesomeWM → WezTerm → fcitx5-rime → tmux → zsh / Neovim
每一层都有自己的键位配置,每一层都能"吃掉"一个按键。配置攒了十几年,散落在
~/.Xmodmap、rc.lua、wezterm.lua、.tmux.conf、.zshrc、options.lua、
default.custom.yaml 里。单看每个文件都能读懂,但连起来经常回答不了这类问题:
Alt+b,为什么中文状态下 tmux 收不到?Ctrl+i 和 Tab 在 Neovim 里为什么绑不开?xmodmap 配好了,插上外接键盘就失效?这个系列把这些经验重新梳理一遍,目标是从物理层一路讲到应用层,让上面这些问题 都能有确定的答案,而不是靠试。
谈快捷键,最常见的评价标准是"少按几个键"。这个标准很容易度量,但它解释不了为什么 有些"很省键"的配置用起来反而累。
这个系列用的标准是另外三条:
一、保护注意力。 手离开主键区去够方向键、去看鼠标在哪,代价不是那几百毫秒, 而是思路被打断。一个键位设计得好不好,看的是它有没有让你在"想做的事"和"怎么做到" 之间反复切换。
二、减少状态确认。 模态编辑器、输入法、tmux 的 prefix、终端的 copy-mode,都是 状态机。每次"我现在在什么状态?"的自我确认,都是一次注意力开销。好的设计要么让状态 在视觉上一眼可辨,要么干脆让状态自动回到你需要的那个——比如离开 Neovim 插入模式时 自动把 rime 切回英文,你就永远不需要低头看输入法指示器。
三、降低错误恢复成本。 按错键之后要花多久回到原处,比按错的概率更重要。在正常
模式下误触了中文逗号 ,,如果它直接当成 leader 键 , 生效,那就没有"错误"需要
恢复;如果它插入了一个全角字符再报错,就得撤销、切输入法、重来。
后面每一篇的配置取舍,都会回到这三条上。
整个系列围绕四个问题展开:
按下一个键,从物理层到应用层到底发生了什么? 键盘矩阵扫描、USB HID、内核 input 子系统、X11 keycode/keysym、终端字节流。 对应第 1–3 篇。
ssh / awesome / wezterm / tmux / zsh / nvim 组合环境下,一个快捷键被谁捕获、 按什么顺序处理? 这是所有"快捷键冲突"问题的总纲。对应第 6 篇,第 4–5 篇打基础。
zsh / wezterm / nvim 三处"自动切换 rime 中英文"是如何实现的,底层原理是什么? 三个位置、三种触发时机、同一个 D-Bus 接口,以及 tmux 多 client 场景下的归因难题。 对应第 12 篇。
怎样设计一套不迫使用户反复确认状态、不中断心流,而且能长期维护的键位系统? 第 7–11 篇逐层示范,第 13 篇收束成可操作的原则。
| 篇 | 标题 | 内容 |
|---|---|---|
| 1 | 一次按键的旅程:从键盘矩阵到应用程序 | 全链路总览,每一层的职责与观测工具 |
| 2 | 四层编码:scancode、keycode、keysym 与字符 | 同一个键在每层叫什么名字 |
| 3 | 终端里的按键:转义序列、terminfo 与 CSI u | 为什么终端里有些组合键绑不了 |
| 篇 | 标题 | 内容 |
|---|---|---|
| 4 | X11 三层模型:xmodmap 的 keycode / keysym / modifier 组 | 三层模型与实战,顺序陷阱 |
| 5 | 到内核层重塑键盘:keyd、udev 与热插拔 | 为什么最终要下沉到内核层 |
| 篇 | 标题 | 内容 |
|---|---|---|
| 6 | 谁先拿到这个键:捕获顺序与冲突诊断 | 六层责任划分、二分定位法、ssh 的特殊性 |
| 7 | 窗口层:AwesomeWM 的克制 | 全局键该抢什么、不该抢什么 |
| 8 | 终端层:WezTerm | leader、CSI u、SendKey 转发 |
| 9 | 复用层:tmux | prefix 选择与那些"隐形"设置 |
| 10 | 命令行层:zsh ZLE | widget、hook 与状态可见性 |
| 11 | 编辑层:Neovim | 分组、可发现性与终端限制下的取舍 |
| 篇 | 标题 | 内容 |
|---|---|---|
| 12 | 中英文自动切换:fcitx5 + rime 三处联动 | D-Bus 接口、三处触发时机、tmux 归因 |
| 13 | fcitx5 极简配置与键位设计哲学 | 可长期维护的键位系统 |
每一篇都可以独立读。如果只关心某个具体问题:
文中所有实例来自我的实际环境,配置文件都在公开仓库里:
| 组件 | 版本 |
|---|---|
| 发行版 | Debian,X11 会话 |
| 窗口管理器 | AwesomeWM 4.3 |
| 终端 | WezTerm |
| 复用器 | tmux 3.7b |
| Shell | zsh |
| 编辑器 | Neovim 0.12 |
| 输入法 | fcitx5 5.1.12 + rime(白霜拼音) |
| 键盘 | ThinkPad 内置键盘 + Poker II(外接) |
配置仓库:
dotconfig:awesome / wezterm / tmux / zsh / xmodmap / udev / rimenvim:Neovim 配置