mirror of
https://github.com/d0zingcat/rime_wanxiang.git
synced 2026-05-14 15:10:20 +00:00
63 lines
2.2 KiB
Lua
63 lines
2.2 KiB
Lua
-- backspace_limiter.lua
|
||
-- 防止连续 Backspace 在编码为空时删除已上屏内容,虽然我更推荐拍下esc。
|
||
-- 这个功能依赖按键事件的处理,运行逻辑的问题在手机上无法得到好的效果,其中macOS特非常特殊,它的按键事件等同于手机逻辑,因此手机和Mac都屏蔽了这一功能
|
||
-- @author amzxyz
|
||
local M = {}
|
||
local ACCEPT, PASS = 1, 2
|
||
|
||
-- 引入移动设备检测模块
|
||
local wanxiang = require("wanxiang")
|
||
|
||
-- 状态标志说明:
|
||
-- env.prev_input_len: 上一次按键前的输入长度
|
||
-- env.bs_sequence: 当前是否处于连续 Backspace 序列中
|
||
|
||
function M.init(env)
|
||
env.prev_input_len = -1 -- 初始化为无效值
|
||
env.bs_sequence = false
|
||
end
|
||
|
||
function M.func(key, env)
|
||
local ctx = env.engine.context
|
||
local kc = key.keycode
|
||
-- 这里嵌入一段记录按键的逻辑,给英文空格使用
|
||
if not key:release() and ctx.composition:empty() then
|
||
-- 检测:回车 (0xff0d, 0xff8d) 或 空格 (0x20)
|
||
if kc == 0xff0d or kc == 0xff8d or kc == 0x20 then
|
||
-- 发送信号:刚才发生了空闲换行或空格,打断英文连贯性
|
||
ctx:set_property("english_spacing", "true")
|
||
end
|
||
end --嵌入结束
|
||
-- 非 Backspace 键或按键释放事件:重置状态
|
||
if kc ~= 0xFF08 or key:release() then
|
||
env.bs_sequence = false
|
||
env.prev_input_len = -1
|
||
return PASS
|
||
end
|
||
|
||
-- 获取当前输入长度
|
||
local current_len = #ctx.input
|
||
|
||
-- 处于连续 Backspace 序列中
|
||
if env.bs_sequence then
|
||
-- 移动设备由于运行逻辑的问题不能实现友好的逻辑
|
||
if wanxiang.is_mobile_device() then
|
||
return PASS -- 直接放行
|
||
-- PC设备保持原有逻辑:长度1变0时拦截
|
||
else
|
||
if env.prev_input_len == 1 and current_len == 0 then
|
||
return ACCEPT -- 拦截:PC设备上从1变为0的情况
|
||
end
|
||
end
|
||
-- 更新状态
|
||
env.prev_input_len = current_len
|
||
return PASS
|
||
end
|
||
-- 开始新的 Backspace 序列
|
||
env.bs_sequence = true
|
||
env.prev_input_len = current_len
|
||
-- 首次按键总是允许
|
||
return PASS
|
||
end
|
||
|
||
return M |