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 215 天前 挺好的, 不过小狼毫有 vim_mode 也能满足 |
![]() | 3 jqtmviyu 215 天前 我在用 rime, 但 macos 版缺少查询当前中英文状态的 api |
![]() | 5 jqtmviyu 214 天前 |
![]() | 6 dbing 167 天前 我的解决方案是中文只用鼠须管,英文用系统自带的 ABC ,使用是 karabiner 将 caps lock 映射成超级按键,单独按下切换式鼠须管或者 ABC ,这个按键配合其他键 用于实现其他功能 |