哪款输入法是目前你认为综合体验最好的?
打字的话就用 rime + https://github.com/amzxyz/rime-wanxiang ,emacs 也可以用这个配置 emacs-rime
语音输入就用豆包输入法,已经上线 macos 版本,之前用的讯飞,能用但是不太好用 。
通过 karabiner-elements 配合 hammerspoon脚本,实现鼠标中键按下就切换到豆包并激活语音输入,再按下中键就回车上屏的方式,非常好用。
然后 hammerspoon 脚本实现应用自动切换输入法的功能。
好的,以下是对你描述的配置过程与解决方案进行排版优化后的版本,结构更清晰,方便查阅与复现。
---
## 🧩 背景与目标
- **输入法**:
- 语音输入 → 豆包输入法(`com.bytedance.inputmethod.doubaoime.pinyin`)
- 打字输入 → 鼠须管(Rime,`im.rime.inputmethod.Squirrel.Hans`)
- **核心需求**:
按下鼠标中键 → 自动切换到豆包输入法 + 激活语音输入(模拟双击 Fn)
再次按下鼠标中键 → 发送回车(上屏)
---
## ❗遇到的问题
豆包输入法存在 **“假激活”** 现象:
菜单栏显示已切换到豆包,但实际并未真正激活,导致后续模拟 Fn 无法触发语音输入。
尝试过的方法均不理想:
- `AppleScript` 模拟菜单栏点击 → 速度太慢
- `hammerspoon` 的 `hs.keycodes.currentSourceID()` + `select_input_source` 等 API → 无效
- `im-select` + `shell_command` → 无法稳定激活
---
## ✅ 最终稳定方案
### 思路
放弃依赖系统输入法切换 API,改用 **自定义快捷键** 强制激活豆包:
- 定义 `Ctrl+1` 为切换到豆包输入法的系统快捷键(在「系统设置 → 键盘 → 输入法」中手动绑定)
- 用 Hammerspoon 判断当前输入法,决定发送 `Ctrl+1` 的次数:
- 当前为 **ABC 英文** → 按 **1 次** `Ctrl+1`
- 当前为 **鼠须管** → 按 **2 次** `Ctrl+1`(强制切换回豆包)
---
### 1️⃣ Hammerspoon 脚本(智能切换)
```lua
-- 智能切换到豆包输入法:仅在当前为 ABC 或鼠须管时,模拟按下 Ctrl+1
function smartSwitchToDoubao()
local currentInput = hs.keycodes.currentSourceID()
if currentInput == "com.apple.keylayout.ABC" then
hs.eventtap.keyStroke({ "ctrl" }, "1")
elseif currentInput == "im.rime.inputmethod.Squirrel.Hans" then
hs.eventtap.keyStroke({ "ctrl" }, "1")
hs.timer.usleep(50000) -- 延迟 50ms
hs.eventtap.keyStroke({ "ctrl" }, "1")
else
-- 其他输入法(已经是豆包?)可不处理,或直接回车
hs.eventtap.keyStroke({}, "return")
end
end
-- 绑定全局快捷键:Ctrl + Shift + D
hs.hotkey.bind({ "ctrl", "shift" }, "d", smartSwitchToDoubao)
```
> 快捷键 `Ctrl+Shift+D` 将在后续被 Karabiner 触发。
---
### 2️⃣ Karabiner-Elements 配置(鼠标中键映射)
将鼠标中键(`button3`)映射为一连串操作:
1. 发送 `Ctrl+Shift+D` → 触发 Hammerspoon 切换到豆包
2. 短暂延时
3. 模拟 **Fn + Left Control**(双击)→ 激活豆包的语音输入
4. 再次按下鼠标中键时,发送 `Return` 上屏
```json
{
"description": "鼠标中键 -> 智能切豆包 + 双Fn语音 -> 再次中键回车",
"enabled": true,
"manipulators": [
{
"from": { "pointing_button": "button3" },
"to": [
{
"hold_down_milliseconds": 100,
"key_code": "d",
"modifiers": ["control", "shift"]
},
{
"hold_down_milliseconds": 200,
"key_code": "vk_none"
},
{
"hold_down_milliseconds": 100,
"key_code": "left_control",
"modifiers": ["fn"]
},
{
"hold_down_milliseconds": 100,
"key_code": "vk_none"
},
{
"hold_down_milliseconds": 100,
"key_code": "left_control",
"modifiers": ["fn"]
}
],
"type": "basic"
}
]
}
```
> 注:`left_control + fn` 即模拟按下“Fn”键(因为 Karabiner 中 Fn 需组合其他键表达)。
---
## 🔁 完整工作流程
| 动作 | 触发效果 |
|------|----------|
| 按下鼠标中键 | ① 自动切到豆包输入法(`Ctrl+1`×1或×2)<br>② 双击 Fn → 激活语音输入 |
| 语音输入完毕 | 再次按下鼠标中键 → 发送 `Return` 上屏 |
---
## 📎 补充说明
- 请确保系统已设置 `Ctrl+1` 为切换到豆包输入法的快捷键
- 如果语音输入快捷键不是“双击 Fn”,可修改 Karabiner 中对应的按键
- `hs.timer.usleep(50000)` 的延迟可根据实际情况微调
这样就能稳定绕开豆包的“假激活”问题,实现一键语音输入并上屏。