程序员键盘的最佳实践
也许是程序员键盘的最佳实践,它是我创造的东西里我最喜欢的——一把自己组的客制化机械键盘。
起因
打字速度其实非常重要。即便进入了 vibe coding 时代、人类已经很少手写代码,提示词的撰写依然繁琐:为了把每个细节说清楚,提示词往往写得很长,还要反复增删改。打字速度仍然是码字效率的核心。
输入效率可以分两层来看:一层是敲键本身——手指在物理键盘上的移动距离;另一层是从拼音到汉字的映射——同样的中文意图需要敲多少个键。本文聚焦前者;后者请见 为什么 AI 时代更应该使用双拼。
而真正的瓶颈往往不是十指的快慢,而是手指频繁离开主键区:下划线 _ 离主键区很远还要按 Shift;括号 ()/[]/{} 要伸到右上角;运算符 +/-/* 在最远的右上角;方向键更是要把整只右手挪走——单看每个操作都很轻,叠起来就是一笔不小的「打字税」。
理想的状态是所有常用符号和功能键都在主键区一格之内,手指几乎不离开 ASDF/JKL; 这一带。这就是本文要讲的方案能做到的事。
解决方案:Via 改键
Via 是一个可视化的键盘改键工具——浏览器打开,连上键盘,点选 + 拖拽即可重映射每一颗键,还能定义多个图层 (Layer)。
图层的切换有两种常见模式:按住触发键时进入图层、松手即返;或者按一下松开就切换到图层、再按一下切回。我用的是前一种——按住 Fn 时,H/J/K/L 不再是字母而是 Left/Down/Up/Right,松开 Fn 立刻回到字母层。于是输入符号不再需要大范围移动手指——除了阿拉伯数字,所有字母和符号的手指移动距离都不超过一格。
不是所有键盘都支持 Via,购买前可以直接询问商家。我用的是唯咖(weikav)Lucky65 V2,支持 Via,不过无线模式下复杂的 Via 操作有 bug——烧录必须在有线下完成,平时使用也建议保持有线,否则部分映射会失效。
三处核心改动
整套方案归根结底只有三处关键改动:
Caps改为短按Esc/ 长按Fn——Caps是左小指最容易触及的位置,而大写锁定平时根本用不上。把它改造成 Esc + Fn 的双功能键性价比极高:Esc本身就是高频键(很多工具用它退出、Claude Code 双击Esc触发/rewind),vim 用户更是离不开它- 添加大量
Fn组合键——把所有常用符号、方向键、功能键塞进 Fn 层 - 交换
;和/,用:和"覆盖原本;和'的位置——:在写代码时比;高频得多(Python、字典、JSON、TypeScript 类型注解全都用它),右小指本位键留给更常用的字符更划算
调整后的两层布局如下:


Fn 层映射示例
下面是几组高频用到的 Fn 组合键,完整映射可见后文的 Via json 文件:
- 方向键:
Fn + H/J/K/L→Left/Down/Up/Right(vim 风格) - 翻页:
Fn + N/M→Pagedown/Pageup - 退格:
Fn + D→Backspace - 回车:
Fn + ;→Enter - 下划线:
Fn + F→_ - 运算符:
Fn + G/S/B→+/-/* - 括号:
Fn + I/O/P→()/[]/{} - 数字行符号:
Fn + Q/W/E/R/T/Y/U→!/@/#/$/%/^/&
中文用户在码字时频繁切换输入法——英文敲代码 / 提示词、中文敲提示词的描述部分。vim 普通模式下中文输入法有 bug:按 J 期望下移一行,输入法会把它当作字母键拦截、进入输入状态。而 Fn + J 直接映射到系统的下方向键,无论当前输入法是中文还是英文,按下去都是下移一行,不需要先切换输入法。
Fn + I/O/P 并不是输出单个左括号,而是用 Via 的宏功能一次性输出左右括号、并把光标定位到中间。这样做有两个好处:
- 节省按键位:左右括号合并为一颗键,原本
()/[]/{}需要 6 个键位,现在压缩成 3 个。主键区一格之内就能塞下三种括号 - 跨编辑器配对:大多数 IDE 已经做了自动补完,但终端和纯文本编辑器没有——键盘自带这功能后所有场景统一
常用组合键演示
Fn 改键之后,配合 OS 级别的快捷键(macOS 用 Cmd、Windows 用 Ctrl),左手小指按住 Caps(即 Fn)的同时其他手指几乎不用移动就能完成大量编辑动作:
- 跳到行首:
Cmd+Caps+H——左手大拇指按Cmd、左手小指按Caps、右手食指按H→ 触发Cmd + Left - 跳到行尾:
Cmd+Caps+L——右手无名指按L→ 触发Cmd + Right - 删除整行:
Cmd+Caps+D——左手中指按D→ 触发Cmd + Backspace
再也不需要把右手挪到方向键区,也不需要去摸 Home / End / Backspace。
macOS 上最常用的修饰键 Cmd 紧挨着空格,左手大拇指直接就能按到;而 Windows 上最常用的 Ctrl 在键盘最左下角,左手小指要大幅外移才能够到。这就是为什么 macOS 上「大拇指 + 字母键」可以舒服地一只手完成,Windows 上等价操作总要把整个左掌扭一下——同样的快捷键,体感差很多。
Via 配置文件
完整的 Via json 配置文件(导入 Via 后可直接复用):
{ "name": "Lucky65V2", "vendorProductId": 875422727, "macros": [ "{+KC_LSFT}{1}9{1}0{1}{-KC_LSFT}{1}{+KC_LEFT}{1}{-KC_LEFT}", "[{1}]{1}{+KC_LEFT}{1}{-KC_LEFT}", "{+KC_RSFT}{1}[{1}]{1}{-KC_RSFT}{1}{+KC_LEFT}{1}{-KC_LEFT}", "", "", "", "", "", "", "", "", "", "", "", "", "" ], "layers": [ [ "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_MINS", "KC_EQL", "KC_BSPC", "KC_NO", "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_NO", "LT(1,KC_ESC)", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SLSH", "S(KC_QUOT)", "KC_ENT", "KC_NO", "KC_NO", "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "S(KC_SCLN)", "KC_RSFT", "KC_UP", "KC_NO", "KC_NO", "KC_LCTL", "KC_NO", "KC_LALT", "KC_LGUI", "KC_SPC", "KC_SPC", "KC_SPC", "KC_RGUI", "KC_RALT", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_NO", "KC_NO", "KC_MUTE" ], [ "QK_CLEAR_EEPROM", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "RGB_TOG", "KC_NO", "TO(3)", "S(KC_1)", "S(KC_2)", "S(KC_3)", "S(KC_4)", "S(KC_5)", "S(KC_6)", "S(KC_7)", "MACRO(0)", "MACRO(1)", "MACRO(2)", "KC_NO", "CUSTOM(7)", "RGB_MOD", "KC_NO", "KC_TRNS", "S(KC_SLSH)", "KC_PMNS", "KC_BSPC", "S(KC_MINS)", "KC_PPLS", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_ENT", "KC_QUOT", "RGB_HUI", "CUSTOM(5)", "KC_NO", "KC_TRNS", "KC_GRV", "KC_BSLS", "KC_DEL", "KC_PEQL", "KC_PAST", "KC_PGDN", "KC_PGUP", "S(KC_BSLS)", "S(KC_GRV)", "KC_SCLN", "KC_TRNS", "RGB_VAI", "CUSTOM(6)", "KC_NO", "KC_TRNS", "KC_NO", "KC_TRNS", "KC_TRNS", "CUSTOM(7)", "KC_TRNS", "CUSTOM(7)", "KC_TRNS", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI", "CUSTOM(0)", "CUSTOM(1)", "KC_MUTE" ], [ "QK_CLEAR_EEPROM", "KC_MYCM", "KC_WWW_HOME", "KC_MAIL", "KC_CALC", "KC_MSEL", "KC_MSTP", "KC_MPRV", "KC_MPLY", "KC_MNXT", "KC_MUTE", "KC_VOLD", "KC_VOLU", "RGB_TOG", "KC_NO", "TO(3)", "CUSTOM(0)", "CUSTOM(1)", "CUSTOM(2)", "CUSTOM(5)", "CUSTOM(6)", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_PSCR", "KC_TRNS", "KC_TRNS", "RGB_MOD", "KC_NO", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_SLCK", "KC_PAUS", "KC_HOME", "KC_END", "KC_TRNS", "KC_TRNS", "RGB_HUI", "KC_TRNS", "KC_NO", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_VAI", "KC_TRNS", "KC_NO", "CUSTOM(8)", "KC_NO", "KC_NO", "KC_TRNS", "CUSTOM(7)", "CUSTOM(7)", "CUSTOM(7)", "KC_TRNS", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI", "KC_TRNS", "KC_TRNS", "KC_MUTE" ], [ "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_MINS", "KC_EQL", "KC_BSPC", "KC_NO", "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_NO", "LT(4,KC_ESC)", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SLSH", "S(KC_QUOT)", "KC_ENT", "KC_NO", "KC_NO", "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "S(KC_SCLN)", "KC_RSFT", "KC_UP", "KC_NO", "KC_NO", "KC_LCTL", "KC_NO", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_SPC", "KC_SPC", "KC_RCTL", "KC_RALT", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_NO", "KC_NO", "KC_MUTE" ], [ "QK_CLEAR_EEPROM", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "RGB_TOG", "KC_NO", "TO(0)", "S(KC_1)", "S(KC_2)", "S(KC_3)", "S(KC_4)", "S(KC_5)", "S(KC_6)", "S(KC_7)", "MACRO(0)", "MACRO(1)", "MACRO(2)", "KC_NO", "CUSTOM(7)", "RGB_MOD", "KC_NO", "KC_TRNS", "S(KC_SLSH)", "KC_PMNS", "KC_BSPC", "S(KC_MINS)", "KC_PPLS", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_ENT", "KC_QUOT", "RGB_HUI", "CUSTOM(5)", "KC_NO", "KC_TRNS", "KC_GRV", "KC_BSLS", "KC_DEL", "KC_PEQL", "KC_PAST", "KC_PGDN", "KC_PGUP", "S(KC_BSLS)", "S(KC_GRV)", "KC_SCLN", "KC_TRNS", "RGB_VAI", "CUSTOM(6)", "KC_NO", "KC_TRNS", "KC_NO", "KC_TRNS", "KC_TRNS", "CUSTOM(7)", "KC_TRNS", "CUSTOM(7)", "KC_TRNS", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI", "CUSTOM(0)", "CUSTOM(1)", "KC_MUTE" ], [ "QK_CLEAR_EEPROM", "KC_BRIU", "KC_BRID", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPRV", "KC_MPLY", "KC_MNXT", "KC_MUTE", "KC_VOLD", "KC_VOLU", "RGB_TOG", "KC_NO", "TO(0)", "CUSTOM(0)", "CUSTOM(1)", "CUSTOM(2)", "CUSTOM(5)", "CUSTOM(6)", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_PSCR", "KC_TRNS", "KC_TRNS", "RGB_MOD", "KC_NO", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_HUI", "KC_TRNS", "KC_NO", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_VAI", "KC_TRNS", "KC_NO", "CUSTOM(8)", "KC_NO", "KC_TRNS", "KC_TRNS", "CUSTOM(7)", "CUSTOM(7)", "CUSTOM(7)", "KC_TRNS", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI", "KC_TRNS", "KC_TRNS", "KC_MUTE" ] ], "encoders": [ [ ["KC_VOLU", "KC_VOLD"], ["KC_VOLU", "KC_VOLD"], ["KC_VOLU", "KC_VOLD"], ["KC_VOLU", "KC_VOLD"], ["KC_VOLU", "KC_VOLD"], ["KC_VOLU", "KC_VOLD"] ] ]}关于键盘本身
聊完软件层面再聊硬件。这一节简单介绍键盘选购的基础知识,给打算自己组一把客制化键盘的人作参考。
键盘类型
按按键技术,键盘大致分四类:
- 薄膜键盘:所有按键共用一片硅胶 / 橡胶导电膜。便宜、安静,但手感和耐用度都差,长期使用容易疲劳
- 机械键盘:每颗按键有独立的「轴体」,根据触发方式和声音又能继续细分(见下一节)
- 光轴键盘:用红外光束被按键阻断来判定触发,触发响应比传统机械接触式更快
- 磁轴键盘:用霍尔效应感应磁铁与 PCB 的距离来判断按键深度。触发距离可以在 Via 等软件里自定义,电竞圈用得多
「静音」不是一个独立类别,而是机械键盘的一种附加属性——在轴的 stem 加阻尼材料降低声音即可。
机械轴的两个维度
机械键盘的轴体可以按两个独立维度分类:
形态维度(决定键程长短):
- 标准轴:键程约 4mm,触底反馈强烈,是经典手感
- 矮轴:键程约 3mm 甚至更短,键盘整体厚度也变薄。除了便携性更好,键程介于标准轴和薄膜之间,适合作为薄膜键盘到机械键盘的过渡
手感维度(决定段落感):
- 线性轴(红轴、黄轴等):按下到底全程没有阻力变化,丝滑顺畅
- 段落轴(青轴、茶轴等):按到一定深度有明显的「咔哒」反馈,确认感强
市场上标准轴 + 线性轴的组合最为常见。
客制化键盘的三大件
一把客制化机械键盘由三个部分组成,可以分别选购、自由搭配:
- 套件:键盘的「骨架」——包括外壳、PCB、定位板、卫星轴等。决定配列(68 / 75 / 84 / 全键等)、连接方式(有线 / 无线 / 三模)、以及是否支持 Via 等改键软件
- 轴体:决定手感和声音的核心
- 键帽:键盘的「皮肤」,影响外观和敲击声。常见材质有 ABS(亮、轻、易打油)和 PBT(哑光、重、耐磨)
我的选择
- 套件:唯咖(weikav)Lucky65 V2,67 键。我不需要 F 区按键和小键盘,所以特意选了 65 配列——桌面占用最小,常用键一颗不少
- 轴体:高特青柠轴 V3,当时静音段落轴的王者之一(现在可能有更好的轴体了)
- 键帽:淘宝买的芙宁娜主题二创键帽
经过 Via 改键之后,65 配列里右侧的方向键、右 Enter、右 Shift、Backspace 等键平时基本用不到——它们的功能都在 Fn 层有等价键,左手小指按住 Caps,其他手指移动不超过一格就能搞定。我甚至把最右侧的 4 颗特殊键直接设置成空白(按下去什么都不会发生),纯装饰。
我自己不太能接受线性轴——按下去全程没阻力变化,容易误触,少了一点「我按到了」的确认感。段落轴那种「咔哒」一下的反馈对我刚刚好。
同时强烈推荐学生选静音轴体:舍友睡觉时也能尽情码字、图书馆里也不必担心键盘声扰人,既不影响别人又能保持自己的码字节奏。
每个人对手感的偏好差异极大,光看视频和评测很难选到合适的。
- 去线下店实际敲:键盘展、专卖店都能现场试不同轴体
- 买「轴体全家桶」:每种轴体各一颗 + 一个试轴器,自己在家对照按一按,选出最喜欢的再下单
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!