rime / squirrel

【鼠鬚管】Rime for macOS
https://rime.im
GNU General Public License v3.0
4.63k stars 410 forks source link

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

Open qxj opened 7 years ago

qxj commented 7 years ago

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

lotem commented 7 years ago

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

wych42 commented 6 years ago

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

northleafup commented 6 years ago

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

tshu-w commented 6 years ago

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

wych42 commented 6 years ago

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

northleafup commented 6 years ago

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

tshu-w commented 5 years ago

我改成用 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)
kopinions commented 5 years ago

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

tshu-w commented 5 years ago

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

kopinions commented 5 years ago

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

tshu-w commented 5 years ago

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

Justsoos commented 4 years ago

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

cocobear commented 4 years ago

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

MrWrh commented 3 years ago

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

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

KenChv commented 2 years ago

这个问题这么多年没有人回答,我来回答一下。目前本人只在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.然后就有了上面的具体配置。

tshu-w commented 2 years ago

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

ukn0who commented 2 years ago

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

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

tshu-w commented 2 years ago

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

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

没太关注,应该是

KenChv commented 2 years ago

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

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

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

chenghuzi commented 1 year ago

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

game-loader commented 1 year ago

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