weasel icon indicating copy to clipboard operation
weasel copied to clipboard

是否有可能修改shift切换中英的按键时长threshold

Open christaikobo opened this issue 1 year ago • 2 comments

上报前请检查

  • [X] 我遇到的问题没有其他人在 issue 里提到过
  • [X] 我的小狼毫版本于 rime/weasel 下载
  • [X] 我在使用小狼毫的最新发布版本,或最新发布版本后的 CI 构建

操作系统信息

  • OS 详细版本: [Windows 10 22H2 19045.4046]
  • 小狼毫版本: [0.16.1.0]

描述遇到的问题 piggy back on https://github.com/rime/weasel/issues/566 简单来说就是按shift同时鼠标去点击来进行多选的时候, 总是不慎切换中英, 时间长了难免有点烦躁 请问是否可以增加shift按键时间的threshold设置, 如果调稍微短一些应该会好很多

christaikobo avatar Jul 28 '24 23:07 christaikobo

不能,因为不存在这个概念。另外也试过按住shift多选,未发现有什么问题发生。就算是在输入的位置长按Shift之后再松开,一样没有切换中英状态。可能是不是你手抖了?

fxliang avatar Jul 29 '24 05:07 fxliang

录了一段小视频, 请看:

https://github.com/user-attachments/assets/4996c99c-6ae2-4736-860a-eb695abc7920

大概你操作比较慢, 所以无事发生, 我操作比较快一些, 基本每次都发生

christaikobo avatar Jul 29 '24 15:07 christaikobo

这个和操作快慢大概率没有关系,你可以试试添加一个proc.luauser_data_dir/lua目录下,内容如下

local M = {
  -- proc func
  func = function(key, env)
    log.error(key:repr())
    return 2 -- noop
  end;
}

return M

然后给方案添加这个lua_processor

  engine/processors/+:
  - lua_processor@*proc

部署之后,再操作Shift+选择多几次,然后在日志目录里面会留下rime.weasel.*ERROR*.log的文件,里面会有早前一点时候的按键事件的记录。

盲猜可能有多次Shift按键事件发出了

fxliang avatar Aug 06 '24 02:08 fxliang

这个和操作快慢大概率没有关系,你可以试试添加一个proc.luauser_data_dir/lua目录下,内容如下

local M = {
  -- proc func
  func = function(key, env)
    log.error(key:repr())
    return 2 -- noop
  end;
}

return M

然后给方案添加这个lua_processor

  engine/processors/+:
  - lua_processor@*proc

部署之后,再操作Shift+选择多几次,然后在日志目录里面会留下rime.weasel.ERROR.log的文件,里面会有早前一点时候的按键事件的记录。

盲猜可能有多次Shift按键事件发出了

Log file created at: 2024/08/05 20:30:47
Running on machine: CHRIS-PC2
Running duration (h:mm:ss): 0:00:11
Log line format: [IWEF]yyyymmdd hh:mm:ss.uuuuuu threadid file:line] msg
E20240805 20:30:47.419750  2528 types.cc:1459] Shift+Shift_L
E20240805 20:30:48.568654  2528 types.cc:1459] Shift+Shift_L
E20240805 20:30:49.827649  2528 types.cc:1459] Shift+Shift_L
E20240805 20:30:51.068659  2528 types.cc:1459] Shift+Shift_L

按照你的说法进行了日志记录, 信息如上 我操作了4次, 的确日志里也有4次记录

从操作来说, 我是 left click 选中第一个文件, lshift down, left click选中多个文件, lshift up 肯定不是手抖, 操作了几十年了....

christaikobo avatar Aug 06 '24 03:08 christaikobo

这个是四次点选,还是一次点选?

fxliang avatar Aug 06 '24 03:08 fxliang

这个是四次点选,还是一次点选?

四次点选

christaikobo avatar Aug 06 '24 03:08 christaikobo

呃,礼貌提醒,检查下键盘,如果是大配列,用右侧shift试一下,或者把别的按键映射成shift键再试一下?

Nikkiiw avatar Aug 10 '24 16:08 Nikkiiw

呃,礼貌提醒,检查下键盘,如果是大配列,用右侧shift试一下,或者把别的按键映射成shift键再试一下?

右侧shift试了一下结果是一样的 另外不是特别理解总觉得是我个人问题? https://github.com/rime/weasel/issues/566 明明有人有同样问题

christaikobo avatar Aug 10 '24 17:08 christaikobo

一般鍵盤固件單擊的時長上限爲 200 毫秒。librime 裏判斷 Shift 單擊的代碼設爲 500 毫秒。 你可以嘗試修改 https://github.com/rime/librime/blob/0cdce16a7d0d5a43fdf8183eb632bd3cbfc13a8d/src/rime/gear/ascii_composer.cc#L97 構建一個版本測試。 不知道這樣能不能解決問題,如果操作更快,200 毫秒也不行。

如果前端能做到,最好的辦法是把鼠標點擊事件 XK_Pointer_Button1 等等發給 librime,就可以準確判斷。

lotem avatar Aug 10 '24 17:08 lotem

一般鍵盤固件單擊的時長上限爲 200 毫秒。librime 裏判斷 Shift 單擊的代碼設爲 500 毫秒。 你可以嘗試修改 https://github.com/rime/librime/blob/0cdce16a7d0d5a43fdf8183eb632bd3cbfc13a8d/src/rime/gear/ascii_composer.cc#L97 構建一個版本測試。 不知道這樣能不能解決問題,如果操作更快,200 毫秒也不行。

如果前端能做到,最好的辦法是把鼠標點擊事件 XK_Pointer_Button1 等等發給 librime,就可以準確判斷。

我理解监听鼠标事件有可能被认为是恶意软件, 而且实现这个功能只怕还要写不少代码 所以修改toggle_duration_limit应该是比较合理的解决方法 请问是否有可能把toggle_duration_limit暴露出来由scheme来设置?

christaikobo avatar Aug 10 '24 18:08 christaikobo

自行编译之后的确解决了这个问题, 但是对于普通用户来说实在是太麻烦了, 还是希望maintainer考虑把把toggle_duration_limit暴露出来由schema来设置

christaikobo avatar Sep 06 '24 02:09 christaikobo

自行编译之后的确解决了这个问题, 但是对于普通用户来说实在是太麻烦了, 还是希望maintainer考虑把把toggle_duration_limit暴露出来由schema来设置

https://github.com/fxliang/weasel_config/blob/main/lua/shift_ascii_enhanced.lua

可供参考

fxliang avatar Sep 10 '24 13:09 fxliang

我把lua_processor@shift_ascii_enhanced写入schema的processors部分, 然后把lua放到/lua文件夹里, 内容改成env.toogle_expired_ = os.clock() + 0.2

似乎没用.....

christaikobo avatar Sep 10 '24 19:09 christaikobo

我把lua_processor@shift_ascii_enhanced写入schema的processors部分, 然后把lua放到/lua文件夹里, 内容改成env.toogle_expired_ = os.clock() + 0.2

似乎没用.....

忘记了提,这个要放在ascii_composer 之前

我测试用的是这样的 user_data_dir/lua/shift_ascii_enhanced.lua

  'engine/processors/@before 0': lua_processor@*shift_ascii_enhanced

demo脚本的效果是threshold为0.3秒(大概),左shift切换中文,右shift切换英文

fxliang avatar Sep 10 '24 23:09 fxliang

放在ascii_composer之前的确就有效过了, 感谢!

christaikobo avatar Sep 11 '24 04:09 christaikobo

请问这个lua必须要分开左右shift么, 尝试修改了一下, threshold效果就没用了

local function init(env)
  env.toogle_expired_ = 0
  env.shift_key_pressed_ = false
  env.XK_Shift_L, env.XK_Shift_R = 0xffe1, 0xffe2
  env.kRejected, env.kAccepted, env.kNoop = 0, 1, 2
end

local function processor(key, env)
	local context = env.engine.context
  local is_shift = key.keycode == env.XK_Shift_L or key.keycode == env.XK_Shift_R
  if is_shift then                                       -- shift key processing
    if key:release() then -- shift released
      if env.shift_key_pressed_ then
        env.shift_key_pressed_ = false
        if os.clock() < env.toogle_expired_ then
          local ascii_mode = context:get_option("ascii_mode")
          if ascii_mode == true then                                ----------就改了这几句
            context:set_option("ascii_mode", false) end
          else
            context:set_option("ascii_mode", true)
            context:clear()                                        ----------就改了这几句
          end
        end
      end
    -- shift key is pressed down for the first time
    elseif not env.shift_key_pressed_ then
      env.shift_key_pressed_ = true
      env.toogle_expired_ = os.clock() + 0.2    -- shift hold threshold 0.2 sec
    end
    -- shift key always accepted, don't pass it to ascii_composer
    return env.kAccepted
  end
  -- not shift key, clear shift_key_pressed_ and ignore this key
  -- and pass it to next processor
  env.shift_key_pressed_ = false
  return env.kNoop
end

return {init = init, func = processor}

christaikobo avatar Sep 11 '24 04:09 christaikobo

请问这个lua必须要分开左右shift么, 尝试修改了一下, threshold效果就没用了

不一定,这个只是一个更复杂一点的例子而已。不分左右可以下面这样修改

diff --git a/lua/shift_ascii_enhanced.lua b/lua/shift_ascii_enhanced.lua
index e526e99..e139ece 100644
--- a/lua/shift_ascii_enhanced.lua
+++ b/lua/shift_ascii_enhanced.lua
@@ -14,12 +14,8 @@ local function processor(key, env)
         env.shift_key_pressed_ = false
         if os.clock() < env.toogle_expired_ then
           local ascii_mode = context:get_option("ascii_mode")
-          if key.keycode == env.XK_Shift_L then                       -- Shift_L
-            if ascii_mode == true then context:set_option("ascii_mode", false) end
-          elseif ascii_mode == false then                             -- Shift_R
-            context:set_option("ascii_mode", true)
-            context:clear()    -- modify this line if you want to commit code or something else
-          end
+          context:set_option("ascii_mode", not ascii_mode)
+          context:clear()
         end
       end
     -- shift key is pressed down for the first time

fxliang avatar Sep 11 '24 06:09 fxliang

再一次感谢! 的确解决了问题.

christaikobo avatar Sep 11 '24 15:09 christaikobo

如果用 Control_R 來切換 ASCII mode, 可避免意外格式切換。Shift keys 也可留著為大寫字母和其它符號輸入。My 2 cents😎

ascii_composer: switch_key: Shift_L: noop Shift_R: noop Control_R: inline_ascii

JoKlever avatar Nov 12 '24 02:11 JoKlever