输入法涉及隐私,因此用搜狗输入法、微信输入法之类的产品,这是绝对不可能的。再者,谁也不愿意电脑里莫名出现弹窗广告。
以下所有内容都基于 Windows 环境。
微软拼音
很多输入法都支持通过 Shift 切换中英文模式,我也已经适应这种方式。但如果用到 Blender 等软件就会发现 Shift 也可以作为快捷键的修饰键;如此极易导致误触切换,打断操作。
一个解决方案是添加英文键盘。因为我电脑上显示语言设的就是 English (United States),强制添加了 US 键盘。但同时微软拼音输入法本身附带英文模式,即:
- US 键盘:英文输入
- 微软拼音键盘
- 中文模式:中文输入
- 英文模式:英文输入
默认通过 Win + Space 切换键盘,而微软拼音输入法内部可以设置 Shift / Ctrl + Space / Ctrl 切换中英文模式。
既然已经有了两种键盘,理想情况下我希望它们分别对应中英文输入,同时微软拼音输入法始终保持中文模式。但这样带来两个问题:Win + Space 的快捷键无法更改,需要调整操作习惯;微软拼音输入法在特定情况下自动切换到英文模式,来回切换键盘才发现问题。
macOS 上 Caps Lock 默认切换输入法,长按才会真正切换大写锁定。考虑到自己几乎不用 Caps Lock,这一点可以借鉴。同时习惯上从 Shift 改到 Caps Lock 也没有那么困难。
于是写了一个 AutoHotkey 脚本,用 Caps Lock 切换键盘,同时每隔 500 毫秒将微软拼音输入法切换到中文模式。
CapsLock::Send "{LWin Down}{Space}{LWin Up}"
IsChinese(hWnd) {
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
IMEStatus := DllCall("GetKeyboardLayout", "int", ThreadID, "UInt")
return (IMEStatus & 0xffff) = 0x804
}
SwitchIMEState(id) {
SendMessage(0x283, 0x002, 1025, , id)
}
outer:
Loop {
try {
hWnd := WinGetID("A")
id := DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
if IsChinese(hWnd) {
SwitchIMEState(id)
}
} catch as e {
continue("outer")
}
Sleep 500
}
后来微软强推 Bing,在输入法加入了基于 Bing 的输入建议,按下 Tab 就会出现(即使该功能没有启用)。考虑微软在 Edge 里增加的种种冗余功能,还是觉得此地不宜久留。况且也不能对微软的隐私保护予以过度信任。
Rime
后来切换到 Rime。开源,隐私方面可以信任。很简洁。
词库用的是 雾凇拼音。自己稍微配置一下就行。Rime 似乎不会乱跳中英文模式,这一点就无须额外设计。
default.custom.yaml:
patch:
schema_list:
- { schema: rime_ice }
"ascii_composer/switch_key/Shift_L": noop
"ascii_composer/switch_key/Shift_R": noop
"menu/page_size": 7
weasel.custom.yaml:
patch:
"style/horizontal": true
"style/font_point": 12
这里贴一段模仿 macOS 行为的 AuthHotkey 脚本,短按切换输入法,长按切换大写锁定:
*CapsLock:: {
local startTime := A_TickCount
KeyWait "CapsLock"
local pressDuration := A_TickCount - startTime
if (pressDuration < 500)
{
Send "{LWin Down}{Space}{LWin Up}"
}
else
{
SetCapsLockState !GetKeyState("CapsLock", "T")
}
}
就先这样吧,之后有什么问题再折腾。