天天在 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的朋友.