Mac 自带输入法似乎记不住我的用词习惯,候选词排序经常影响中文输入准确性和工作效率,甚至让我怀疑它在故意扰乱词序,降低我的工作效率。搜狗支持个人词库和主题词库,我已有约 2.2 万条个人词汇,因此决定换用搜狗。
问题
官网安装完搜狗输入法后,遇到两个与 macOS 系统输入法行为不一致的体验,亟需解决:
| 问题 | 实际表现 | 期望行为 |
|---|---|---|
| 1. 中英文切换逻辑改变 | 短按“中/英”直接亮绿灯,进入英文大写 | 保持原有逻辑:短按切换中英文,长按开启大写,再按解除 |
| 2. 数字后标点不符合习惯 | 中文状态下输入 2.2,得到 2。2 |
保持习惯:输入一个数字后,下一标点使用英文标点 |
Note
最初的问题是短按直接触发大写。后文的切换漏响应,发生在 Karabiner 调试阶段。
环境
2026.10.31
| 项目 | 版本或配置 |
|---|---|
| macOS | 26.6.2,构建号 25G83 |
| 搜狗输入法 Mac 版 | 6.25.3.12004 |
| Karabiner-Elements | 16.3.0,排查时安装 |
| 键盘 | Mac 内置键盘,“中/英”键对应 Caps Lock |
| 输入法 | ABC、系统简体拼音、搜狗拼音 |
解决方案
1. 中英切换:Karabiner + F18
解决逻辑
由 Karabiner 统一处理“中/英”键:短按发送输入法切换快捷键,长按发送 Caps Lock。同时关闭搜狗和 macOS 原有的中/英键切换绑定。
最终使用 F18 作为切换快捷键。调试时使用 Control+空格仍有漏响应,改为 F18 后恢复正常。
Karabiner 功能简介
Karabiner-Elements 是 macOS 键盘映射工具,可以把一个按键映射为另一个按键或组合键,也能分别设置短按、长按等行为。本次用它保留同一个“中/英”键的两种用途:切换输入法和开启大写。
Karabiner 安装
从 Karabiner 官网下载安装包。本次使用 16.3.0,安装和授权步骤参考官方安装说明。
- 打开下载的
.dmg,运行其中的Karabiner-Elements.pkg,按安装向导完成安装。 - 打开 Karabiner-Elements,按首页提示进入系统设置,允许后台服务运行,包括需要管理员权限和不需要管理员权限的服务。
- 在 系统设置 → 隐私与安全性 → 辅助功能 中,开启 Karabiner 提示的对应项目。再检查 输入监控;通常辅助功能授权会同时覆盖输入监控,若仍有提示,按提示补齐。
- 按 Karabiner 提示,允许虚拟键盘/鼠标驱动扩展。新版 macOS 可在 系统设置 → 通用 → 登录项与扩展 → 驱动程序扩展 中检查。
- 遇到系统验证弹窗,在本机使用 Touch ID 或管理员密码确认。
- 回到 Karabiner,确认不再提示缺少权限,并选择与实际键盘一致的虚拟键盘类型;本机使用 ANSI。
Important
这些授权用于读取和改写键盘输入、运行后台服务及创建虚拟键盘。仅安装软件还不够,完成授权后规则才能工作。
按键配置
- 搜狗 → 按键 → 中英文:禁用快捷键。
- macOS → 键盘 → 文字输入 → 编辑:关闭“使用中/英键切换 ABC 输入法”。
- macOS → 键盘 → 键盘快捷键 → 输入法:将“选择上一个输入法”改为 F18。
- Karabiner:短按发送 F18,长按发送 Caps Lock,已开启大写时再按解除。
Tip
日常仍按原来的“中/英”键,不需要实体 F18 键。启用文末规则后,在系统快捷键录入框中短按“中/英”,即可发送 F18。
Note
“选择上一个输入法”切换的是最近使用的两个输入源,并未固定绑定搜狗与 ABC。先分别选用这两个输入源,再测试切换。
flowchart TD
I([输入:按下中/英键]) --> K[已配置:Karabiner 接管]
K --> C{大写是否已开启?}
C -->|是| U[发送 Caps Lock:解除大写]
C -->|否| T{按键行为}
T -->|短按松开或紧接着打字| F[发送 F18]
T -->|按住达到 300 ms| L[发送 Caps Lock,保持至少 500 ms]
F --> S[macOS:选择上一个输入法]
S --> O([输出:切换中英文])
L --> A[输出:开启大写]
X[约束:关闭搜狗及系统原生 Caps 切换绑定] -.-> K
规则有两个时间参数:
- 300 ms:区分短按和长按。短按在松开时执行,不必等满 300 ms;按键尚未松开就开始打字时,补发切换,并避免重复触发。写法参考官方连打处理示例。
- 500 ms:长按触发后,发送给系统的 Caps Lock 事件至少保持这个时长。本机用 200 ms 且设置
repeat: false时无效,改为 500 ms 并移除该项后正常。
最终规则见文末。
2. 数字后自动英文标点:搜狗内配置
搜狗 → 常用 → 符号设置:开启“智能调整数字后标点”。
Important
开启的是“智能调整数字后标点”,不是“中文下使用英文标点”。中文句子仍保留中文标点。
通过设置界面重新开启后,数字后的英文标点恢复正常。
Note
本次直接修改配置文件后曾复发,检查时发现该选项已恢复为关闭。最终通过搜狗设置界面重新保存;界面操作还会更新“手动修改设置时间”。优先使用界面设置,不把直接改文件作为最终方案。
偏好设置打不开时
本次遇到设置进程仍在运行、窗口却不出现的情况。结束设置进程后,从菜单栏搜狗输入法菜单重新打开“偏好设置”,窗口恢复正常,无需重启电脑。
在“活动监视器”中搜索
SogouPreference并退出该进程,也可在终端执行:bash
killall SogouPreference-
从菜单栏搜狗输入法菜单点击“偏好设置”。
-
进入“常用”,重新保存“智能调整数字后标点”,在中文状态下测试
2.2。
本次直接启动应用包曾出现无窗口进程,因此重新打开时使用搜狗菜单入口。
排查过程与失败路径
最初故障可以稳定复现:使用搜狗时,短按“中/英”直接亮绿灯;切回系统拼音正常,换其他应用使用搜狗也一样。后续调整中还出现过“灯亮,但输入小写”。
第一阶段:排查原始故障
- 关闭再开启 macOS 中/英切换选项:无效。
- 将搜狗内部切换键设为 Caps Lock:无效,后续还出现指示灯与输入大小写不一致。
- 重启搜狗进程:暂时恢复,随后复发。
- 禁用搜狗内部 Caps Lock 绑定,再重启:仍复发,单独撤销绑定没有解决问题。
第二阶段:调试 Karabiner
- 短按发送 Control+空格,长按发送 Caps Lock:短按基本可用,长按无效。
- 将长按输出改为保持 500 ms,并移除
repeat: false:长按恢复正常。 - 增加快速连打处理,继续发送 Control+空格:仍有切换漏响应。
- 系统快捷键和规则输出同步改为 F18:切换恢复正常。
连续按键漏响应发生在 Karabiner 调试后期。当时多次按键后的状态是:
text
拼 → 拼 → 拼 → 拼 → A → A → 拼 → 拼 → A
它表示部分按键没有触发切换,输入法保持原状态;并非最初的“短按直接大写”,也不是输入法轮转顺序错误。补上连打处理仍无效,最后从 Control+空格改为 F18 后恢复正常。
Note
日志未定位到原始故障的根因。搜狗历史更新记录曾提及 Caps Lock 相关修复,但不能据此认定是同一个问题。
第三阶段:数字标点复发与重新保存
- 直接将
keySmartChangePunctuation改为"1",重启输入法主进程:之后仍出现2。2,配置中该项已回到"0"。 - 检查旧配置与进程:21:58 写入的配置同时恢复了另一项旧设置;后台服务仍从安装时持续运行。存在旧配置被写回的可能,尚未确定具体来源。
- 重启搜狗相关进程:数字标点保持开启,但偏好设置仍无窗口。
- 结束设置进程,从搜狗菜单重新打开:窗口恢复正常。通过界面重新保存数字标点选项,实际输入恢复正常。
Note
目前没有证据证明搜狗会强制关闭该功能,也尚未证实是后台缓存或云同步覆盖。此次已通过界面保存,长期是否复发仍需观察。
附:最终 Karabiner 规则
将下面的 JSON 保存到 ~/.config/karabiner/assets/complex_modifications/,在 Complex Modifications 中添加并启用。前提是系统“选择上一个输入法”已绑定 F18。
json
{
"title": "中英键短按切换与长按大写",
"rules": [
{
"description": "短按 F18 切换输入法,长按大写,再按解除",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "caps_lock",
"modifiers": { "mandatory": ["caps_lock"] }
},
"to": [
{
"key_code": "caps_lock",
"modifiers": ["caps_lock"],
"hold_down_milliseconds": 200,
"repeat": false
}
]
},
{
"type": "basic",
"from": { "key_code": "caps_lock" },
"to_if_alone": [
{ "key_code": "f18", "halt": true }
],
"to_if_held_down": [
{ "key_code": "caps_lock", "hold_down_milliseconds": 500 }
],
"to_delayed_action": {
"to_if_canceled": [{ "key_code": "f18" }]
},
"parameters": {
"basic.to_if_alone_timeout_milliseconds": 300,
"basic.to_if_held_down_threshold_milliseconds": 300,
"basic.to_delayed_action_delay_milliseconds": 300
}
}
]
}
]
}
