MacOS 下切换输入法一直很恼人,特别是在 vim mode 下。
利用 Harmmerspoon 今天终于达到自己满意的效果了,实现逻辑 AppGroup1 默认开启英文输入法,AppGroup2 在 ESC 或 Ctrl [ 后切换为英文输入。参考实现如下:
local function switchToABC()
hs.keycodes.currentSourceID("com.apple.keylayout.ABC")
end
local targetAppsGroup1 = {
"com.runningwithcrayons.Alfred",
"com.apple.finder",
"org.hammerspoon.Hammerspoon",
"com.apple.Safari",
"com.mitchellh.ghostty",
"com.todesktop.230313mzl4w4u92", -- Cursor
"com.microsoft.VSCode",
"com.apple.dt.Xcode",
"com.apple.Terminal",
"org.vim.MacVim",
}
local targetAppsGroup2 = { -- 在这些应用中按下 Esc 或 Ctrl+[ 时切换为 ABC
"com.apple.Terminal",
"com.apple.dt.Xcode",
"com.jetbrains.intellij",
"com.microsoft.VSCode",
"com.mitchellh.ghostty",
"com.todesktop.230313mzl4w4u92", -- Cursor
"org.vim.MacVim",
}
-- 监听应用切换事件
local function handleAppSwitch(appName, eventType, app)
if eventType == hs.application.watcher.activated then
local bundleID = app:bundleID()
-- 检查是否在 Group 1 中
for _, appID in ipairs(targetAppsGroup1) do
if bundleID == appID then
switchToABC()
break
end
end
end
end
-- 创建应用切换监听器
local appWatcher = hs.application.watcher.new(handleAppSwitch)
appWatcher:start()
-- 监听键盘事件( Esc 和 Ctrl+[)
local eventTap = hs.eventtap.new({hs.eventtap.event.types.keyDown}, function(event)
local keyCode = event:getKeyCode()
local modifiers = event:getFlags()
local isEsc = (keyCode == hs.keycodes.map.escape) -- Esc 键
local isCtrlOpenBracket = (keyCode == hs.keycodes.map["["] and modifiers.ctrl) -- Ctrl+[
if isEsc or isCtrlOpenBracket then
local frontmostApp = hs.application.frontmostApplication()
local bundleID = frontmostApp:bundleID()
-- 检查是否在 Group 2 中
for _, appID in ipairs(targetAppsGroup2) do
if bundleID == appID then
switchToABC() -- 切换输入法
break
end
end
end
return false -- 允许事件继续传递
end)
eventTap:start() -- 启动监听
![]() |
1
shinonome 175 天前
挺好的, 不过小狼毫有 vim_mode 也能满足
|
![]() |
3
jqtmviyu 174 天前
我在用 rime, 但 macos 版缺少查询当前中英文状态的 api
|
![]() |
5
jqtmviyu 174 天前
@jerommix #4 哈哈, 刚看了眼 Karabiner 配置, 其实有相同困扰的 v2exer 不少, https://www.v2ex.com/t/565667
这个 19 年的帖子也是解决同样的问题. shift 轮换输入法, esc 切换英文. |
![]() |
6
dbing 127 天前
我的解决方案是中文只用鼠须管,英文用系统自带的 ABC ,使用是 karabiner 将 caps lock 映射成超级按键,单独按下切换式鼠须管或者 ABC ,这个按键配合其他键 用于实现其他功能
|