Karabiner-Elements 键盘映射与配置指南
modules/home-manager/darwin-files/karabiner 的项目说明。先看下方摘要,再按需展开具体专题。展开完整 README 原文
Karabiner-Elements 键盘映射与配置指南
本目录包含了基于 Karabiner-Elements 的 macOS 键盘深度定制配置。通过底层内核级虚拟 HID 驱动,实现了日文键盘按键重映射、跨平台快捷键习惯统一(Control $\rightarrow$ Command 映射)以及输入法状态无缝切换。
1. 目录结构与路径映射
karabiner.json 现在由 ~/nixos-config 的 Darwin Home Manager 配置进行版本控制与部署:
~/.config/karabiner/ (源文件位于 ~/nixos-config/modules/home-manager/darwin-files/karabiner/)
├── karabiner.json # 核心配置文件(当前生效的所有 Profile、按键映射、设备参数)
├── README.md # 本文档:架构说明、规则详解、修改范例与排障手册
└── assets/ # 规则库资产目录
└── complex_modifications/ # 自定义复杂规则 JSON 导入目录
| 路径类型 | 对应路径 | 说明 |
|---|---|---|
| nixos-config 源目录 | ~/nixos-config/modules/home-manager/darwin-files/karabiner/ |
Git 仓库管理路径,所有手动编辑必须在此进行 |
| 本机目标目录 | ~/.config/karabiner/ |
Karabiner-Elements 守护进程实际读取的配置文件路径 |
| 自动备份目录 | ~/.config/karabiner/automatic_backups/ |
Karabiner 在每次 GUI 改动时自动生成的历史快照(无需入库) |
2. 当前生效的配置详解
配置文件采用 Default profile 作为主配置方案,包含以下核心设定:
(1) 日文英数/假名键映射(JIS Eisuu / Kana $\rightarrow$ F13 / F14)
- 规则描述:
Map Japanese Eisuu/Kana to F13/F14 - 映射关系:
japanese_eisuu(空格键左侧的英数键) $\longrightarrow$F13japanese_kana(空格键右侧的假名键) $\longrightarrow$F14
- 设计目的与联动原理:
- macOS 原生英数/假名键直接切换系统输入源时存在约 50~100ms 的切换延迟,且难以被外部输入法框架精准捕获。
- 映射为无物理冲突的功能键
F13/F14后,可与 Fcitx5 / Rime / 系统快捷键 绑定,实现「单击左键必切英文、单击右键必切中文」的绝对状态切换,彻底消除中英文切换的二义性。
(2) Control 快捷键映射为 Command 快捷键(Windows/Linux 习惯统一)
- 规则描述:
Map Control shortcuts to Command shortcuts - 映射关系:
| 输入按键 (From) | 触发修饰键 (Mandatory) | 可选修饰键 (Optional) | 转换目标 (To) | 实际功能 |
|---|---|---|---|---|
T |
Control + Shift |
Caps Lock |
Command + Shift + T |
重新打开关闭的标签页 |
T |
Control |
Caps Lock |
Command + T |
新建标签页 |
W |
Control + Shift |
Caps Lock |
Command + Shift + W |
关闭当前窗口 |
W |
Control |
Caps Lock |
Command + W |
关闭当前标签页 |
R |
Control + Shift |
Caps Lock |
Command + Shift + R |
强制刷新页面 (Hard Reload) |
R |
Control |
Caps Lock |
Command + R |
刷新当前页面 (Reload) |
N |
Control + Shift |
Caps Lock |
Command + Shift + N |
新建无痕/隐身窗口 |
N |
Control |
Caps Lock |
Command + N |
新建窗口 |
Z |
Control + Shift |
Caps Lock |
Command + Shift + Z |
重做 (Redo) |
Z |
Control |
Caps Lock |
Command + Z |
撤销 (Undo) |
Y |
Control |
Caps Lock |
Command + Y |
重做 / 历史记录 |
L |
Control |
Caps Lock |
Command + L |
聚焦地址栏 (Focus URL Bar) |
F |
Control |
Caps Lock |
Command + F |
页面内查找 (Find in Page) |
S |
Control |
Caps Lock |
Command + S |
保存网页/文件 (Save) |
A |
Control |
Caps Lock |
Command + A |
全选 (Select All) |
C |
Control |
Caps Lock |
Command + C |
复制 (Copy) |
V |
Control |
Caps Lock |
Command + V |
粘贴 (Paste) |
X |
Control |
Caps Lock |
Command + X |
剪切 (Cut) |
- 设计目的:
- 保留跨平台(Windows / Linux / macOS)高度一致的
Ctrl+C、Ctrl+V编辑肌肉记忆。
- 保留跨平台(Windows / Linux / macOS)高度一致的
- 包含
optional: ["caps_lock"],确保大写锁定开启时快捷键依然有效。
(3) 左 Control 单击或长按触发 F13
Left Control: F13 when pressed alone 是一个全局规则,不区分内置键盘
和外接键盘:
- 单独短按并释放左 Control:当前暂时不发送任何按键(单击 F13 已停用);
- 左 Control 持续按住超过 250ms:立即发送
F13,并记录长按状态; - 左 Control 与其他键一起按:继续发送普通的
left_control; - 现有的 Control 快捷键规则仍会继续处理
Ctrl + C、Ctrl + V等组合。
这里暂时移除了 to_if_alone,只保留 to_if_held_down,并以
left_control_long_press 变量记录长按状态,在按键释放时清零。
长按阈值和单独按键判定阈值都是 250ms。组合键仍然保留原始 Control,
但如果先长按超过阈值再按其他键,F13 已经被触发,这是长按触发和组合键
同时存在时无法完全避免的时间边界。
(4) 虚拟键盘与基础设备参数
- 虚拟键盘布局 (
virtual_hid_keyboard):keyboard_type_v2:"jis"(声明为标准日文 JIS 键盘配列,避免 macOS 识别为 ANSI 导致按键错位)。country_code:0。
- 功能键直通 (
fn_function_keys):F6$\longrightarrow$F6(保持原生功能键直通)。
(5) MINILA-R Convertible 专用布局
MINILA-R 的 USB 设备信息为:
Product: MINILA-R Convertible
vendor_id: 3141 (十六进制 0c45)
product_id: 8888 (十六进制 22b8)
Karabiner 规则通过 vendor_id 和 product_id 限定设备,因此只影响
MINILA-R,不会改变 MacBook 内置键盘或其他外接键盘。
当前 MINILA-R 规则位于 karabiner.json 的
MINILA-R Convertible layout (USB 0c45:22b8) 中:
| MINILA-R 按键 | macOS 事件 | 当前输出 |
|---|---|---|
| 左 Option | left_option |
左 Command |
| 左 Command | left_command |
左 Option |
| 無変換 | japanese_pc_nfer |
F13 |
| 片假名/平假名 | japanese_pc_katakana |
左方向键 |
| 下方 Delete | delete_forward |
右方向键 |
| 右 Control | right_control |
上方向键 |
| 右 Option | right_option |
下方向键 |
| 全角/半角 | grave_accent_and_tilde |
Escape |
| Escape | escape |
全角/半角 |
空格两侧的两个 Fn 键
MINILA-R 空格左右的两个键是键盘硬件层的左右 Fn 键,不是普通的
HID 键。它们由键盘固件直接参与组合键处理,单独按下时不会向 macOS
发送独立的按键事件,因此:
- Karabiner-EventViewer 中不会出现这两个键的
key_code; - Karabiner 和 keyd 都不能直接把它们单独重映射成普通按键;
- 只有
Fn + 其他键产生的最终组合键,才可能被 Karabiner 捕获; - 这两个 Fn 键不能通过当前的 Karabiner JSON 配置改成独立的 Command、Option、Control 或方向键。
这不是 chezmoi 或 Karabiner 配置丢失,而是 MINILA-R 固件的工作方式。 如果需要利用 Fn 层,应在 EventViewer 中测试实际组合,例如:
左 Fn + J
右 Fn + J
左 Fn + Delete
右 Fn + Delete
记录组合键实际产生的 key_code 后,再为该组合键添加 Karabiner 规则。
如果组合键也完全没有事件,则它由键盘固件直接转换成另一个普通键,
只能对转换后的结果进行映射。
设备规则的验证方式
打开 Karabiner EventViewer:
open -a Karabiner-EventViewer
按键时重点记录 name.key_code。常见的 MINILA-R 按键可能显示为:
japanese_pc_nfer
japanese_pc_katakana
delete_forward
grave_accent_and_tilde
right_control
right_option
不要根据键帽文字猜测 key_code;不同键盘固件、蓝牙/USB 连接方式
以及日文/英文配列可能报告不同名称。新增规则前应先在 EventViewer
确认,并继续保留 MINILA-R 的设备条件。
3. 日常修改与维护工作流
Karabiner-Elements 支持 GUI 操作和 JSON 直接编辑两种维护方式:
方式一:通过 Karabiner-Elements GUI 图形界面修改(推荐初学者)
- 打开 macOS 应用程序中的 Karabiner-Elements。
- 在 Complex Modifications、Simple Modifications 或 Function Keys 页面中调整设置。
- 调整完成后,Karabiner 会立即写入
~/.config/karabiner/karabiner.json。 - 将改动复制回 nixos-config 源文件:
cp ~/.config/karabiner/karabiner.json ~/nixos-config/modules/home-manager/darwin-files/karabiner/karabiner.json cd ~/nixos-config git commit -m "feat(karabiner): update key mappings" git push
方式二:直接在 nixos-config 源目录编辑 JSON(高级用户)
- 编辑源文件:
vim ~/nixos-config/modules/home-manager/darwin-files/karabiner/karabiner.json - 验证 JSON 语法正确后,应用到系统:
sudo /run/current-system/sw/bin/darwin-rebuild switch --flake ~/nixos-config#macbook-m1-max - 即时热重载:Karabiner 守护进程通过文件系统事件(fsevents)监听
~/.config/karabiner/karabiner.json。Home Manager 完成链接更新后,通常无需重启软件;如未生效,可在 Karabiner 中手动 reload。
4. 常用高级规则扩展范例
若需要扩充功能,可将以下代码块加入 karabiner.json 的 rules 数组中:
范例 A:排除特定应用程序(如终端 / Kitty 内不拦截 Ctrl+C)
默认情况下全局映射 Ctrl+C $\rightarrow$ Cmd+C 会导致终端内无法发送 SIGINT 中断信号。可以通过添加 conditions 限定仅在非终端应用生效:
{
"description": "Map Control shortcuts to Command (Exclude Terminal / Kitty)",
"manipulators": [
{
"conditions": [
{
"bundle_identifiers": [
"^net\\.kovidgoyal\\.kitty$",
"^com\\.apple\\.Terminal$",
"^com\\.googlecode\\.iterm2$"
],
"type": "frontmost_application_unless"
}
],
"from": {
"key_code": "c",
"modifiers": { "mandatory": ["control"] }
},
"to": [{ "key_code": "c", "modifiers": ["left_command"] }],
"type": "basic"
}
]
}
范例 B:Caps Lock 单击为 Esc,长按为 Control(双模神键)
{
"description": "Change caps_lock to Control when held, Escape when pressed alone",
"manipulators": [
{
"from": {
"key_code": "caps_lock",
"modifiers": { "optional": ["any"] }
},
"to": [{ "key_code": "left_control" }],
"to_if_alone": [{ "key_code": "escape" }],
"type": "basic"
}
]
}
范例 C:增加保存 (Ctrl+S $\rightarrow$ Cmd+S) 与撤销 (Ctrl+Z $\rightarrow$ Cmd+Z)
{
"description": "Map Ctrl+S and Ctrl+Z to Cmd+S and Cmd+Z",
"manipulators": [
{
"from": { "key_code": "s", "modifiers": { "mandatory": ["control"] } },
"to": [{ "key_code": "s", "modifiers": ["left_command"] }],
"type": "basic"
},
{
"from": { "key_code": "z", "modifiers": { "mandatory": ["control"] } },
"to": [{ "key_code": "z", "modifiers": ["left_command"] }],
"type": "basic"
}
]
}
5. 排障与常见问题(Troubleshooting)
1. 修改后按键未生效
- 检查 JSON 格式:
jq . ~/.config/karabiner/karabiner.json确认无语法错误。 - 检查 Karabiner 状态:在顶部菜单栏确认 Karabiner-Elements 正在运行。
- 查看控制台日志:在 Karabiner GUI $\rightarrow$ Log 标签页查看是否有规则解析告警。
2. 系统升级或换机后提示权限丢失
Karabiner 依赖 macOS 底层权限。若按键完全失灵,请检查:
- 系统设置 $\rightarrow$ 隐私与安全性 $\rightarrow$ 辅助功能 (Accessibility):确保
karabiner_grabber与karabiner_console_user_server处于勾选状态。 - 输入监控 (Input Monitoring):确保
karabiner_grabber已授权。
3. 新机器一键恢复配置
在已经安装 Karabiner-Elements 的新 Mac 上:
# 1. 克隆 nixos-config 并安装 Nix
# 具体安装流程见 ~/nixos-config/docs/macos-nix-darwin/
# 2. 授权 macOS 辅助功能与输入监控权限后即刻恢复完整按键体验
本文件由 nixos-config 的 Darwin Home Manager 配置管理,源文件路径:~/nixos-config/modules/home-manager/darwin-files/karabiner/README.md。