分享一个 HammerSpoon 的输入法状态管理代码

天天在 Emacs, iTerm2, Chrome 三个应用之间来回切换的工作者, 这些开发先关的工具, 包括 Alfred, Spotlight 等希望默认是英文输入状态, 需要的时候才切换到输入法进行中文输入.

一直都在用 Keyboard Pilot 这个插件, 今天用 HammerSpoon 替换了Mac默认的 application switcher, 我就想能否用 HammerSpoon 也替换 Keyboard Pilot 的功能?

看了 hs.keycodes 模块, 用下面的代码可以实现 Keyboard Pilot 同样的功能, 而且性能更高:

local function Chinese()
  hs.keycodes.currentSourceID("com.sogou.inputmethod.sogou.pinyin")
end

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

local function set_app_input_method(app_name, set_input_method_function, event)
  event = event or hs.window.filter.windowFocused

  hs.window.filter.new(app_name)
    :subscribe(event, function()
                 set_input_method_function()
              end)
end

set_app_input_method('Hammerspoon', English, hs.window.filter.windowCreated)
set_app_input_method('Spotlight', English, hs.window.filter.windowCreated)
set_app_input_method('Alfred', English, hs.window.filter.windowCreated)
set_app_input_method('Emacs', English)
set_app_input_method('iTerm2', English)
set_app_input_method('Google Chrome', English)
set_app_input_method('WeChat', Chinese)

如果不知道当前的应用的名字和输入法SourceID, 可以用下面的函数查看:

hs.hotkey.bind({'ctrl', 'cmd'}, ".", function()
		  hs.alert.show("App path:        "
				..hs.window.focusedWindow():application():path()
				.."\n"
				.."App name:      "
				..hs.window.focusedWindow():application():name()
				.."\n"
				.."IM source id:  "
				..hs.keycodes.currentSourceID())
end)

希望能够帮助在 Mac 上玩Emacs的朋友. :wink:

15 个赞

应该是 ..hs.window.focusedWindow()

我的配置文件有alias

不知道这个函数能不能加进core

官方已经有 hs.keycodes 模块了.

这个切输入法的hs代码似乎不够健壮,有个问题:

  • 切到微信,中文输入法,输入几个字,没错
  • 在微信中切到英文输入法,输入几个字母,没错
  • 切到emacs
  • 切到微信:此时系统状态栏图标是中文输入法,但按下按键输出的是英文。(再手动切两次输入法到中文可以回到正常)

欢迎提交 patch

vscode 在切换的时候貌似也是有点问题,无法自动切换

vscode 是名字不对的原因(换成Code即可),wechat 貌似无法监听。

要用app path,而不是app。name

切输入法这个,我用的是'微信',可以工作。然后切app的lua代码,微信非常奇怪,在别的app和它自己里面分别叫'wechat'微信,我就把它踢出去在它app自己里设切换的按键了。

Every application's input method status under control, haha. · manateelazycat/hammerspoon-config@8441ddd · GitHub 今天改了一下, 非常健壮了.

不论切换快捷键还是 switcher 动作, 都会动态更新输入法的状态, 再也不会发生别的应用切换到 emacs 后输入中文的现象了.

2 个赞

要用 path name: /Applications/WeChat.app

用keyboard maestro应该也可以把,我只用emacs activates trigger keyboard layout ABC

另外我是用km绑快捷键切换输入法,cjk本身好像有点问题有个kawa可以切换但是km支持shift+ 所以我在action里多切换几遍好像就可以了

alfred本身支持切换输入法

我主要用 hammerspoon , 比 alfred 快, 因为常用的应用不会超过十个, 绑定快捷键更快.

hammerspoon 至少替换了十几个开机启动的应用

2 个赞

替换成了lazy loading autoload吗哈哈

不是, 大多数碉堡程序都可以被 HammerSpoon 写成 Lua 代码替换

1 个赞

谢谢,这段代码帮我省了30块钱买ghostSKB,谢谢

能说说都替换了哪些应用不?分享一下,我也是Mac用户,想学习一下😆