Rime 在连续输入 jj 后自动切换到英语

Rime
之前编写了 Rime 小狼毫切换窗口重置默认中英状态,用了一段时间已经养成在输入中文前先按 Control_R 的习惯了,很好。
但另一方面,在保持中文状态下还是经常忘记切回英文。

所以写了个 processor,通过按键抬起事件,检测到输入了 jj 就自动切换回英语。
如果用 env.engine.process_key("Escape") 并不能把已经输入的字符清除掉,这里用 commit_text() 结合 clear() 来模拟 commit_code 的逻辑,把当前内容上屏。

lua/force_ascii_mode.lua
-- force_ascii_mode.lua
-- Typing "jj" while composing (non-ASCII mode) switches to ASCII mode.
-- This prevents accidental Vim movements when composition is active.
 
local M = {}
 
function M.init(env)
    local config = env.engine.schema.config
    local name_space = env.name_space:gsub('^*', '')
    local trigger_list = config:get_list(name_space .. "/trigger_inputs")
    M.trigger_inputs = {}
    if trigger_list then
        for i = 0, trigger_list.size - 1 do
            local key = trigger_list:get_value_at(i).value
            M.trigger_inputs[key] = true
        end
    end
end
 
function M.func(key_event, env)
    local engine = env.engine
    local context = env.engine.context
 
    -- The `is_composing()` check ensures this shortcut only triggers when an IME is active.
    if key_event:release() and context:is_composing() then
        if M.trigger_inputs[context.input] then
            -- keep current input from dropping
            engine:commit_text(context.input)
            context:clear()
            -- reset back to english mode
            context:set_option("ascii_mode", true)
            return 1
        end
    end
    return 2
end
 
return M

在配置文件中指定按键集合。在小鹤双拼下 jj 对应的 jan 没有意义,所以可用。其他的像 ` 在写 Obsidian Markdown 常用。

kokomi_flypy.schema.yaml
engine:
  processors:
    - lua_processor@*force_ascii_mode # 特定按键组合强制英
 
force_ascii_mode:
  trigger_inputs: # 在小鹤双拼上没意义但会和常用按键习惯冲突的输入
    - jj # vim
    - win # windows, winget
    - brew
    - git
    - http
    - rm
    - mv
    - cp
    - ps
    - my # mysql
    - "`" # markdown
    - "["

下一步,考虑让 CapsLock 的行为变得可预测,现在这样是当处于英文状态时,要按两下才能切换到中文。