是否有可能修改shift切换中英的按键时长threshold
上报前请检查
- [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设置, 如果调稍微短一些应该会好很多
不能,因为不存在这个概念。另外也试过按住shift多选,未发现有什么问题发生。就算是在输入的位置长按Shift之后再松开,一样没有切换中英状态。可能是不是你手抖了?
录了一段小视频, 请看:
https://github.com/user-attachments/assets/4996c99c-6ae2-4736-860a-eb695abc7920
大概你操作比较慢, 所以无事发生, 我操作比较快一些, 基本每次都发生
这个和操作快慢大概率没有关系,你可以试试添加一个proc.lua到user_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按键事件发出了
这个和操作快慢大概率没有关系,你可以试试添加一个
proc.lua到user_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 肯定不是手抖, 操作了几十年了....
这个是四次点选,还是一次点选?
这个是四次点选,还是一次点选?
四次点选
呃,礼貌提醒,检查下键盘,如果是大配列,用右侧shift试一下,或者把别的按键映射成shift键再试一下?
呃,礼貌提醒,检查下键盘,如果是大配列,用右侧shift试一下,或者把别的按键映射成shift键再试一下?
右侧shift试了一下结果是一样的 另外不是特别理解总觉得是我个人问题? https://github.com/rime/weasel/issues/566 明明有人有同样问题
一般鍵盤固件單擊的時長上限爲 200 毫秒。librime 裏判斷 Shift 單擊的代碼設爲 500 毫秒。 你可以嘗試修改 https://github.com/rime/librime/blob/0cdce16a7d0d5a43fdf8183eb632bd3cbfc13a8d/src/rime/gear/ascii_composer.cc#L97 構建一個版本測試。 不知道這樣能不能解決問題,如果操作更快,200 毫秒也不行。
如果前端能做到,最好的辦法是把鼠標點擊事件 XK_Pointer_Button1 等等發給 librime,就可以準確判斷。
一般鍵盤固件單擊的時長上限爲 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来设置?
自行编译之后的确解决了这个问题, 但是对于普通用户来说实在是太麻烦了, 还是希望maintainer考虑把把toggle_duration_limit暴露出来由schema来设置
自行编译之后的确解决了这个问题, 但是对于普通用户来说实在是太麻烦了, 还是希望maintainer考虑把把toggle_duration_limit暴露出来由schema来设置
https://github.com/fxliang/weasel_config/blob/main/lua/shift_ascii_enhanced.lua
可供参考
我把lua_processor@shift_ascii_enhanced写入schema的processors部分, 然后把lua放到/lua文件夹里, 内容改成env.toogle_expired_ = os.clock() + 0.2
似乎没用.....
我把
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切换英文
放在ascii_composer之前的确就有效过了, 感谢!
请问这个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}
请问这个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
再一次感谢! 的确解决了问题.
如果用 Control_R 來切換 ASCII mode, 可避免意外格式切換。Shift keys 也可留著為大寫字母和其它符號輸入。My 2 cents😎
ascii_composer: switch_key: Shift_L: noop Shift_R: noop Control_R: inline_ascii