哪款输入法是目前你认为综合体验最好的?

打字的话就用 rime + github.com/amzxyz/rime- ,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)` 的延迟可根据实际情况微调


这样就能稳定绕开豆包的“假激活”问题,实现一键语音输入并上屏。

编辑于 2026-05-15 · 著作权归作者所有