squirrel
squirrel copied to clipboard
请问如何设置打开某app始终切换到英文模式?
我看到Squirrel支持所谓静默模式,我理解应该是可以让我在打开某应用的时候始终是英文输入模式?
但目前的情况是:在用iterm的时候如果偶尔我切换到中文模式,比如open一个中文名pdf,这时切换到pdf阅读。等过一会再切换回iterm窗口的时候,发觉iterm依然是中文模式,并未自动切换成英文模式。
请问,能否设置为只要切换到iterm窗口,该窗口的输入界面始终是英文模式?
我目前的squirrel.custom.yaml
里的相关配置如下:
patch:
app_options/com.googlecode.iterm2:
ascii_mode: true
update (2017-05-26):
看到之前已经有人提了类似的issue #136 ,从 @lotem 的意见看这应该算Squirrel的一个feature,即切换窗口后依然保持各应用之前的输入状态。
但是对terminal、vim、emacs、alfred、词典等主要由ascii字符输入或控制的应用来说,在激活它们的时候,默认是英文状态对用户应该会更省心,无需去记忆自己上一次的输入法状态是什么,这样更能最大化静默模式的作用。因为不是总是退出应用的话,打开该应用一般只有一次,而切换并激活该应用会非常频繁。
此外,主动切换窗口以个人经验来看本次录入已经告一段落,如果开启静默模式,下次切换回来,直觉上也应该静默为英文状态。
请问代码上应该patch哪部分能够支持这种激活应用始终静默的功能?谢谢。
你這個需求很有道理。但我現在不知道輸入法能不能感知到應用窗口切換。 Mac 輸入法是這樣的——並不像 Windows 上那樣輸入法在應用進程裏跑——輸入法和應用是隔離的。你開一個應用,系統爲他接通一個到輸入法的通信連接,往返各種消息。窗口後臺了甚至關閉了,通常應用還活着,在輸入法那端看,這個應用還是開着的。所以得找到一個合適的消息,做狀態切換,才行;系統沒給消息,就別想了。 這個案子先開着,我得找時間學習一個。
我有一个实现方式是:Mac 上有一个工具: https://github.com/Hammerspoon/hammerspoon ,利用这个工具的 hs.window.filter:subscribe 功能可以监听到 Application 的 Window 事件,比如 Created、Focused等,在回调函数里用 hs.keycodes.currentSourceID 设置输入法。
@RichardW42 请问如何使用呢,有具体的示例不,谢谢
@northleafup 参考下这个?分享一个 HammerSpoon 的输入法状态管理代码
@Voleking 正解。
@northleafup
currentSourceID 可以在 hammerspoon 的 console 里找到,像这样:
@Voleking @RichardW42 非常感谢,我研究一下
我改成用 application.watcher 了,可以参考下(这样 Alfred 不行不过其自带设置了):
local function Chinese() hs.keycodes.setMethod('Squirrel') end
local function English() hs.keycodes.setLayout('U.S.') end
local appInputMethod = {
Hammerspoon = English,
Emacs = English,
iTerm2 = English,
['Sublime Text'] = English,
Dash = English,
Safari = English,
WeChat = Chinese,
QQ = Chinese,
AliWangwang = Chinese
}
return hs.application.watcher.new(function(appName, eventType, appObject)
if (eventType == hs.application.watcher.activated) then
if (appName == 'Finder') then
-- Bring all Finder windows forward when one gets activated
appObject:selectMenuItem({'Window', 'Bring All to Front'})
end
for app, fn in pairs(appInputMethod) do
if app == appName then
fn()
end
end
end
end)
@Voleking 你改成watcher 之后,有没有出现 setMethod之后 Squirrel 菜单栏显示 请点击查看图片 的情况呢?不知道是什么情况。
@sjkyspa 没有,这个与 setMethod 无关,我不会因为通过 setMethod 切换导致出现,不用 HammerSpoon 也会有这样的情况 #156,我以前也经常出现,最近好像很少了,没太注意。
@Voleking 我猜频繁的调用setMethod可能会导致这种情况出现。我原来设置cmd + space 为切换输入法快捷键,所以频繁调用的情况下,非常容易出现上面图片中的情况。系统的切换输入法快捷键就不会出现这样的情况,所以我做了处理。详情见 代码
@sjkyspa 我尝试疯狂切换 QQ 和 Safari,并没有出现上述情况,事实上我近期很少出现卡死的情况了。不知道别人有没有这样的困惑吧,感谢指出。
我改成用 application.watcher
改成默认英文,WeChat 切换到中文,鼠须管 + 系统美式英文:
local function Chinese()
hs.keycodes.currentSourceID("im.rime.inputmethod.Squirrel.Rime")
end
local function English()
hs.keycodes.currentSourceID("com.apple.keylayout.US")
end
local appInputMethod = {
-- {'Hammerspoon' , 'English'},
-- {'Emacs' , 'English'},
-- {'iTerm2' , 'English'},
-- {'Dash' , 'English'},
-- {'Safari' , 'English'},
-- {'Google Chrome' , 'English'},
-- {'Code' , 'English'},
{'WeChat' , 'Chinese'}
}
function updateFocusAppInputMethod(appName, eventType, appObject)
if (eventType == hs.application.watcher.activated) then
local default = true
for index, app in pairs(appInputMethod) do
if app[1] == appName then
default = false
if app[2] == 'Chinese' then
Chinese()
else
English()
end
end
end
if default then
English()
end
end
end
appWatcher = hs.application.watcher.new(updateFocusAppInputMethod)
appWatcher:start()
配合 ShowyEdge 更佳
希望能加这么一个选项。使用hammerspoon还是太不自然了。
我在一个配置文件上看见有这样的功能:https://github.com/grasonchan/squirrel-config 详见squirrel.custom.yaml的app_options。
不过,我没有实际用过,能不能用,自行测试吧 🤔
这个问题这么多年没有人回答,我来回答一下。目前本人只在MacOS下配置使用,而且能满足这种要求。具体如下:
用vim等文本编辑器打开squirrel.custom.yaml; 具体配置: "app_options/com.runningwithcrayons.Alfred-3/ascii_mode": true "app_options/com.sublimetext.3/ascii_mode": true "app_options/com.google.Chrome/ascii_mode": true "app_options/org.gnu.Emacs/ascii_mode": true "app_options/com.googlecode.iterm2/ascii_mode": true 以上文件怎么获取具体的path(仅限macOS): a. 例如:Emacs,path:/Application/Emacs.app/Contents b. 打开info.plist c. 搜索"BundleIdentifier" d. 获取其值:org.gnu.Emacs e.然后就有了上面的具体配置。
@KenChv 请仔细重读 issue 第一层描述
@KenChv 请仔细重读 issue 第一层描述
请问现在还是只有通过另一个程序来监听事件才能达到目的吗? rime本身目前依然没有这种选项?
@KenChv 请仔细重读 issue 第一层描述
请问现在还是只有通过另一个程序来监听事件才能达到目的吗? rime本身目前依然没有这种选项?
没太关注,应该是
@KenChv 请仔细重读 issue 第一层描述
请问现在还是只有通过另一个程序来监听事件才能达到目的吗? rime本身目前依然没有这种选项?
目前还是用这种方式,对于其内部选项没有深入研究。
我改成用 application.watcher
改成默认英文,WeChat 切换到中文,鼠须管 + 系统美式英文:
local function Chinese() hs.keycodes.currentSourceID("im.rime.inputmethod.Squirrel.Rime") end local function English() hs.keycodes.currentSourceID("com.apple.keylayout.US") end local appInputMethod = { -- {'Hammerspoon' , 'English'}, -- {'Emacs' , 'English'}, -- {'iTerm2' , 'English'}, -- {'Dash' , 'English'}, -- {'Safari' , 'English'}, -- {'Google Chrome' , 'English'}, -- {'Code' , 'English'}, {'WeChat' , 'Chinese'} } function updateFocusAppInputMethod(appName, eventType, appObject) if (eventType == hs.application.watcher.activated) then local default = true for index, app in pairs(appInputMethod) do if app[1] == appName then default = false if app[2] == 'Chinese' then Chinese() else English() end end end if default then English() end end end appWatcher = hs.application.watcher.new(updateFocusAppInputMethod) appWatcher:start()
配合 ShowyEdge 更佳
这个好像监听不了激活spotlight 搜索框?
再推荐一个我目前在用的工具 keyboardholder,有很好的图形配置界面,很方便就能设置切换到指定app时得默认输入法,切换到terminal时配置为自动切换abc输入法,切换到qq等时自动为rime。