weasel icon indicating copy to clipboard operation
weasel copied to clipboard

Ctrl+Space应继续完善,适配switch_key中的所有上屏模式

Open hzinchengdu opened this issue 1 year ago • 8 comments

在最近的更新中,Ctrl+Space切换中英文的问题基本改善了,但现存的问题是Control+Space默认执行清除编码操作,并且用户无法自定义该快捷键的功能。这可能与用户的使用习惯存在冲突。

Control+Space来上屏编码,这种行为在其他主流输入法中得到支持,并可以通过设置进行调整。

此外,用户设置中英切换键的习惯有多样化,会有只使用Control+Space进行中英文切换的情况。依赖单一的Shift键或Ctrl键在某些软件中容易导致误触。

因此,建议将Control+Space的功能与ascii_composer/switch_key中定义的其他状态一致化,纳入可配置选项中。这样可以确保所有切换键的功能一致。

hzinchengdu avatar Oct 23 '24 15:10 hzinchengdu

支持楼上所说的需求。

#1389 之前提过此事,作者没当回事儿,直接关了。

huo-feng-ding avatar Oct 24 '24 03:10 huo-feng-ding

先让librime支持了ascii_composer/switch_key里设置Control+space再看有没有会的大神来处理这个,如何?

否则这个就要硬编码一点逻辑,会和后端的路线越行越远分叉了。

fxliang avatar Oct 24 '24 03:10 fxliang

支持,希望开发者早日完全实现这一功能。

感觉Ctrl+Space按键特殊的一点是——该快捷键可以在系统中变更,用户可能会改成别的组合键。

因此,输入法中用Control+space命名不妥,用ToggleImeOnOpenClose或者toggleime等命名更恰当,来表示“输入法/非输入法切换”这一行为。

hzinchengdu avatar Oct 24 '24 05:10 hzinchengdu

先让librime支持了ascii_composer/switch_key里设置Control+space再看有没有会的大神来处理这个,如何?

否则这个就要硬编码一点逻辑,会和后端的路线越行越远分叉了。

噢,原来是这个原因,明白了,感谢大神解惑

huo-feng-ding avatar Oct 24 '24 07:10 huo-feng-ding

这个问题(切换中英时会清除输入框中未提交的内容), 可以通过lua脚本解决。

  1. 如果你是Windows系统,你要禁用掉系统Ctrl+space禁用输入法的快捷键, 这个目前只能通过修改注册表来完成。 而且要注意,Windows的大版本更新会重置这些注册表,这时你需要重新禁用这个快捷键。具体方法详见https://github.com/rime/weasel/issues/717#issuecomment-1464936922

  2. 注释掉你配置中原有的Control+Space快捷键。

  3. 然后将以下脚本保存为toggle_ascii.lua文件,把它放到文件夹.../Rime/lua/下:

-- toggle_ascii.lua

local toggle_ascii = {}

function toggle_ascii.init(env)
end

function toggle_ascii.func(key, env)
    local engine = env.engine
    local context = env.engine.context

    if  not key:release()
        and (key:repr() == "Control+space")
    then
        local target_state = not context:get_option("ascii_mode")
        if context:is_composing() then
            context:clear_non_confirmed_composition()
            context:commit()
        end
        context:set_option("ascii_mode", target_state)
        return 1
    end
    return 2
end

return toggle_ascii
  1. 修改用户文件夹的文件.../Rime/rime.lua, 添加如下内容:
-- Control+space切换中英脚本
toggle_ascii = require("toggle_ascii")
  1. 在你的schema配置文件schema_name.custom.yaml中添加(比如我的schema是double_pinyin_flypy,就修改double_pinyin_flypy.custom.yaml文件,没有就自己新建一个):
patch:
  # 开启Control+space切换中英脚本
  engine/processors/+: 
    - lua_processor@toggle_ascii
  1. 重新部署输入法

  1. 补充,关键在于lua脚本中的这几个函数调用:
context:clear_non_confirmed_composition()
context:commit()

context:set_option("ascii_mode", target_state)

前两行负责将未提交的内容上屏,最后一行负责切换中英文。

  1. 补充2,这个脚本是大概一年多前写的,我自己用下来一直没问题

pqpeqr avatar Feb 01 '25 09:02 pqpeqr

使用安装包进行的安装,没有rime.lua文件可进行修改,有什么解决办法吗?

liyiqqq avatar Mar 18 '25 23:03 liyiqqq

使用安装包进行的安装,没有rime.lua文件可进行修改,有什么解决办法吗?

更建议从https://github.com/iDvel/rime-ice 这种完善的配置开始, 改出自己需要的配置 如果使用weasel的默认配置, 自行新建对应名称的文件/文件夹即可

pqpeqr avatar Mar 19 '25 01:03 pqpeqr

这个问题(切换中英时会清除输入框中未提交的内容), 可以通过lua脚本解决。

  1. 如果你是Windows系统,你要禁用掉系统Ctrl+space禁用输入法的快捷键, 这个目前只能通过修改注册表来完成。 而且要注意,Windows的大版本更新会重置这些注册表,这时你需要重新禁用这个快捷键。具体方法详见如何关闭禁用输入法这个功能 #717 (comment)
  2. 注释掉你配置中原有的Control+Space快捷键。
  3. 然后将以下脚本保存为toggle_ascii.lua文件,把它放到文件夹.../Rime/lua/下:

-- toggle_ascii.lua

local toggle_ascii = {}

function toggle_ascii.init(env) end

function toggle_ascii.func(key, env) local engine = env.engine local context = env.engine.context

if  not key:release()
    and (key:repr() == "Control+space")
then
    local target_state = not context:get_option("ascii_mode")
    if context:is_composing() then
        context:clear_non_confirmed_composition()
        context:commit()
    end
    context:set_option("ascii_mode", target_state)
    return 1
end
return 2

end

return toggle_ascii 3. 修改用户文件夹的文件.../Rime/rime.lua, 添加如下内容:

-- Control+space切换中英脚本 toggle_ascii = require("toggle_ascii") 4. 在你的schema配置文件schema_name.custom.yaml中添加(比如我的schema是double_pinyin_flypy,就修改double_pinyin_flypy.custom.yaml文件,没有就自己新建一个):

patch:

开启Control+space切换中英脚本

engine/processors/+: - lua_processor@toggle_ascii 5. 重新部署输入法

  1. 补充,关键在于lua脚本中的这几个函数调用:

context:clear_non_confirmed_composition() context:commit()

context:set_option("ascii_mode", target_state) 前两行负责将未提交的内容上屏,最后一行负责切换中英文。

  1. 补充2,这个脚本是大概一年多前写的,我自己用下来一直没问题

非常感谢,试了您的方案,完美解决

huo-feng-ding avatar Mar 26 '25 11:03 huo-feng-ding