V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
leaves615
V2EX  ›  分享创造

MacOS 自动切换 APP 当前输入法小工具 1.1.0 更新

  •  
  •   leaves615 · 2020-05-01 23:10:37 +08:00 · 2688 次点击
    这是一个创建于 1696 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前情提要:
    https://www.v2ex.com/t/624091

    1.1.0 更新内容
    增加配置界面
    支持配置默认输入法
    支持按 app 配置 app 激活 /启动时的默认输入法

    下载链接:
    https://github.com/leaves615/KeyboardHolder/releases
    第 1 条附言  ·  2020-05-08 16:23:17 +08:00
    1.2.0
    增加辅助功能支持。增强 app 检测能力。 不授权辅助功能权限,只能检测 Dock 上有图标的 app,启用辅助功能可以检测非 Dock app 。比如 Spotlight
    第 2 条附言  ·  2020-09-08 22:40:26 +08:00
    更新 1.2.10

    修复 bug
    改进切换效率。
    第 3 条附言  ·  2020-11-16 11:58:13 +08:00
    1.2.15
    Apple Silicon 支持。
    3 条回复    2020-05-05 17:39:20 +08:00
    cookiejaysj
        1
    cookiejaysj  
       2020-05-02 23:10:48 +08:00
    挺好用的 支持!
    leaves615
        2
    leaves615  
    OP
       2020-05-02 23:13:51 +08:00
    @cookiejaysj 谢谢支持。
    nl101531
        3
    nl101531  
       2020-05-05 17:39:20 +08:00
    可以用 Hammerspoon 来实现,脚本可以按照下面方式写,对于 Item 的浮动窗口也能很好支持

    ```lua

    local function Chinese()
    hs.keycodes.currentSourceID("im.rime.inputmethod.Squirrel.Rime")
    end

    local function English()
    hs.keycodes.currentSourceID("com.apple.keylayout.ABC")
    end

    -- app to expected ime config
    local app2Ime = {}
    app2Ime['iTerm2'] = 'English'
    app2Ime['Alfred 3'] = 'English'

    function updateFocusAppInputMethod(appName)
    local ime = 'Chinese'

    if app2Ime[appName] then
    ime = app2Ime[appName]
    end

    if ime == 'English' then
    English()
    else
    Chinese()
    end
    end

    local focusedApp = {'iTerm2','Google Chrome','IntelliJ IDEA','IntelliJ IDEA-EAP','钉钉','Code','幕布'}

    -- 解决固定 APP
    hs.window.filter.new(focusedApp)
    :subscribe(hs.window.filter.windowFocused,function (win, appName)
    --print('windowFocused'..appName)
    updateFocusAppInputMethod(appName)
    end)

    -- 解决浮动窗口
    hs.window.filter.new{'iTerm2','Alfred 3'}:subscribe(hs.window.filter.windowOnScreen,function (win, appName)
    --print('windowOnScreen'..appName)
    updateFocusAppInputMethod(appName)
    end):subscribe(hs.window.filter.windowNotOnScreen,function (win, appName)
    local frontMostApp = hs.application.frontmostApplication()
    updateFocusAppInputMethod(frontMostApp:name())
    end)

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5528 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:49 · PVG 13:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.