squirrel icon indicating copy to clipboard operation
squirrel copied to clipboard

请问如何设置打开某app始终切换到英文模式?

Open qxj opened this issue 7 years ago • 21 comments

我看到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哪部分能够支持这种激活应用始终静默的功能?谢谢。

qxj avatar May 23 '17 08:05 qxj

你這個需求很有道理。但我現在不知道輸入法能不能感知到應用窗口切換。 Mac 輸入法是這樣的——並不像 Windows 上那樣輸入法在應用進程裏跑——輸入法和應用是隔離的。你開一個應用,系統爲他接通一個到輸入法的通信連接,往返各種消息。窗口後臺了甚至關閉了,通常應用還活着,在輸入法那端看,這個應用還是開着的。所以得找到一個合適的消息,做狀態切換,才行;系統沒給消息,就別想了。 這個案子先開着,我得找時間學習一個。

lotem avatar Jun 02 '17 12:06 lotem

我有一个实现方式是:Mac 上有一个工具: https://github.com/Hammerspoon/hammerspoon ,利用这个工具的 hs.window.filter:subscribe 功能可以监听到 Application 的 Window 事件,比如 Created、Focused等,在回调函数里用 hs.keycodes.currentSourceID 设置输入法。

wych42 avatar Jan 03 '18 11:01 wych42

@RichardW42 请问如何使用呢,有具体的示例不,谢谢

northleafup avatar Sep 26 '18 02:09 northleafup

@northleafup 参考下这个?分享一个 HammerSpoon 的输入法状态管理代码

tshu-w avatar Sep 28 '18 10:09 tshu-w

@Voleking 正解。 @northleafup currentSourceID 可以在 hammerspoon 的 console 里找到,像这样: image

wych42 avatar Sep 28 '18 10:09 wych42

@Voleking @RichardW42 非常感谢,我研究一下

northleafup avatar Sep 29 '18 02:09 northleafup

我改成用 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)

tshu-w avatar Oct 09 '18 04:10 tshu-w

@Voleking 你改成watcher 之后,有没有出现 setMethod之后 Squirrel 菜单栏显示 请点击查看图片 的情况呢?不知道是什么情况。

kopinions avatar Mar 27 '19 01:03 kopinions

@sjkyspa 没有,这个与 setMethod 无关,我不会因为通过 setMethod 切换导致出现,不用 HammerSpoon 也会有这样的情况 #156,我以前也经常出现,最近好像很少了,没太注意。

tshu-w avatar Mar 27 '19 01:03 tshu-w

@Voleking 我猜频繁的调用setMethod可能会导致这种情况出现。我原来设置cmd + space 为切换输入法快捷键,所以频繁调用的情况下,非常容易出现上面图片中的情况。系统的切换输入法快捷键就不会出现这样的情况,所以我做了处理。详情见 代码

kopinions avatar Mar 27 '19 01:03 kopinions

@sjkyspa 我尝试疯狂切换 QQ 和 Safari,并没有出现上述情况,事实上我近期很少出现卡死的情况了。不知道别人有没有这样的困惑吧,感谢指出。

tshu-w avatar Mar 27 '19 01:03 tshu-w

我改成用 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 更佳

Justsoos avatar Dec 02 '19 05:12 Justsoos

希望能加这么一个选项。使用hammerspoon还是太不自然了。

cocobear avatar Dec 31 '19 14:12 cocobear

我在一个配置文件上看见有这样的功能:https://github.com/grasonchan/squirrel-config 详见squirrel.custom.yaml的app_options。

不过,我没有实际用过,能不能用,自行测试吧 🤔

MrWrh avatar Feb 28 '21 07:02 MrWrh

这个问题这么多年没有人回答,我来回答一下。目前本人只在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 avatar Oct 30 '21 13:10 KenChv

@KenChv 请仔细重读 issue 第一层描述

tshu-w avatar Oct 30 '21 15:10 tshu-w

@KenChv 请仔细重读 issue 第一层描述

请问现在还是只有通过另一个程序来监听事件才能达到目的吗? rime本身目前依然没有这种选项?

ukn0who avatar Sep 22 '22 10:09 ukn0who

@KenChv 请仔细重读 issue 第一层描述

请问现在还是只有通过另一个程序来监听事件才能达到目的吗? rime本身目前依然没有这种选项?

没太关注,应该是

tshu-w avatar Sep 22 '22 11:09 tshu-w

@KenChv 请仔细重读 issue 第一层描述

请问现在还是只有通过另一个程序来监听事件才能达到目的吗? rime本身目前依然没有这种选项?

目前还是用这种方式,对于其内部选项没有深入研究。

KenChv avatar Sep 22 '22 11:09 KenChv

我改成用 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 搜索框?

chenghuzi avatar Feb 07 '23 05:02 chenghuzi

再推荐一个我目前在用的工具 keyboardholder,有很好的图形配置界面,很方便就能设置切换到指定app时得默认输入法,切换到terminal时配置为自动切换abc输入法,切换到qq等时自动为rime。

game-loader avatar Sep 25 '23 02:09 game-loader