hchunhui / librime-lua

Extending RIME with Lua scripts
BSD 3-Clause "New" or "Revised" License
309 stars 44 forks source link

分享一个五笔手工增删词组方案 #182

Open youlans opened 2 years ago

youlans commented 2 years ago

链接: https://pan.baidu.com/s/1DFR6jd83ufj40BJqG-64Qw  提取码:8ajy

一 包含以下功能

  1. 手工造词、删词、置顶候选(dict_proc + dict_filter) 1) 可以手工添加2-7字词组(不能带非汉字符号) 2) 可以删除系统自带词组,但不能删除单字 3) 可以置顶单字或词组,之前的首选词会变成次选 4) 操作实时生效,无须重新部署 5) 增删记录自动保存在新文件,后台不会修改系统原有固定词库
  2. 候选只显示单字开关(需要自行增加option: single_char控制)
  3. 候选字符集,只显示GB2312简体(6700字)或GBK全集(含繁体、生僻约2万字)  (通过默认option: extended_charset控制) wubi86自带字表有将近8万字,有做裁减
  4. 调整候选顺序,单字=>二字=>三字以上(sort_filter,默认开启)
  5. 控制显示的候选字数量(count_filter,不需要可自行删除)

二 适用范围

  1. 只适用五笔,4码定长模式,需要关闭rime自带的用户词库。
  2. 只适配了windows和android平台

三 安装

  1. 使用前需要根据实际情况修改压缩包里面rime.lua中的rime用户目录 local RIME_DIR_ANDROID = "/storage/emulated/0/rime/" local RIME_DIR_WINDOWS = "C:/rime/"
  2. 自行增加option: single_char和extended_charset及切换菜单或热键(可选)
  3. 将压缩包解压替换到rime用户目录
  4. 五笔反查词依赖pinyin_simp方案,自行添加。
  5. 需要librime_lua最新版本  (weasel-0.14.3自带librime/lua版本太老,需要更新rime.dll到最新版本)  (trime-3.2.7默认支持)
  6. android: -- 需要自行添加菜单分别绑定三个按键<ctrl+1><ctrl+2><ctrl+3>,分别代表增/删/置顶 -- 需要自行添加菜单分别绑定按键用于移动候选词

四 用法

  1. 造词: 1) 在任意编辑器逐字输入2-7字词组 (如果输错可以使用backspace修改,但不能使用其它按键移动光标) 2) 按zz或zzz:自动在候选框显示最近输入的2-4字或5-7字词组 3) windows: 按数字键或空格选择相应候选即可(词组不上屏且候选框自动清除代表成功) android: -- 通过绑定的菜单移动选择想要增加的候选词 -- 单击<ctrl+1>绑定的菜单(词组不上屏且候选框自动清除代表成功)
  2. 删词: 1) 正常输入,让待删除词组显示在候选框 2) windows: 按<ctrl+shift+n>即可,候选框实时更新(与主流输入法搜狗等一致) n代表待删除词组序号 android: -- 通过绑定的菜单移动到想要删除的候选词 -- 单击<ctrl+2>绑定的菜单,候选框实时更新
  3. 置顶: 1) 正常输入,让待删除单字/词组显示在候选框(如在靠后位置可翻页寻找) 2) windows: 按<ctrl+n>即可,候选框实时更新(与主流输入法搜狗等一致) n代表待置顶词组序号 android: -- 通过绑定的菜单移动到想要删除的候选词 -- 单击<ctrl+3>绑定的菜单,候选框实时更新

五 备注

rime用户目录下会生成三个文件记录增删的词组,不熟悉的情况下不要手工修改。 wubi86_add.txt wubi86_del.txt wubi86_top.txt

shewer commented 2 years ago

查找 types.cc xxxxReg func methods get set https://github.com/hchunhui/librime-lua/blob/ad90e2ef5c2071d5b68b70de533e4689d4b7eb12/src/types.cc#L1581-L1586 RIME_DIR ==> rime_api.get_user_data_dir() package.config:sub(1,1) ==> "/" or "\"

utils.lua global func 太多 建議放入 utils table utils.xxxx(env ...) 還可以做成 metatable

local p={}
function p.init(env)
  setmetatable( env , {__index= utils} )
  env:sel_cand)
  env:index()
end
function p.func(key,env)
   local inp= env:sel_inp()
   local ascii_mode = env:get_opt('ascii_mode')
   ....
end

librime-lua #177 可以利用 leveldb key value 可以參考 sample/leveldb.lua 用leveldb 可以降低內存 搜尋速度也不錯

youlans commented 2 years ago

做这个的背景是最近在手机上练习五笔(电脑上一直用五笔),发现手机上的主流五笔输入法竟然没有一个支持手工造词的,个人认为手工造词是五笔的必备功能,自动造词对五笔反而毫无用处。刚好发现有rime还有lua,于是就对着lua源码和参考手册边学边用自己写了一个,当初完全是自用,没有专门考虑对外发布,lua脚本也是用手机编写和调试的,开发平台是trime。 leveldb和rimeapi有在lua master代码里面看到,但实际试了trime最新版本不支持,为了适应性就自己写了个hash库,发现性能还可以,用三四年前的低端手机测试一万条以内的自造词量都是秒开,应对一般人的自有词汇量绰绰有余。 metedata的用法,看了下lua的参考手册就弃用了,单纯为了封装而增代码没有意义,utils里面的东西大部分函数纯粹是为了手机编码时少打几个字。

youlans commented 2 years ago

还有一个待改进的点,就是造词时,希望通过commit_notifier在zz模式拦截,用户通过任意方式commit后成词(这点理论上可以实现),但是我想同时在commit_notifier里面控制不让输入字上屏,这点还没有弄清楚好不好实现。 目前是通过拦截space和数字键部分实现上述功能,但分号次选或者手机上直接点击候选上屏这种还没有好的办法。 实现这个功能后在安卓下可以避免打开造词菜会方便不少。

shewer commented 2 years ago

https://github.com/shewer/trime/tree/develop-2 (己將 librime librime-lua 更新最新版 ,release bin 是由github ci 編譯的)

trime 3.2.3以後 #131 lua_filter 支援 tags_match(seg,env) return bool true 插入此filter false pass 此filter

-- single_char
local F={}
function F.tags_match(seg,env)
  return env.engine.context:get_option('single_char')
end
function F.func(inp,env)
   for cand in inp:iter() do
      if utf8.len(cand.text) ==1 then 
         yield(cand)
      end
   end
end
return F
local function Version()
  local ver
  if LevelDb then
    ver = 177
  elseif Opencc then
    ver = 147
  elseif KeySequence and KeySequence().repr then
    ver= 139
  elseif  ConfigMap and ConfigMap().keys then
    ver= 127
  elseif Projection then
    ver= 102
  elseif KeyEvent then
    ver = 100
  elseif Memory then
    ver = 80
  else
    ver= 79
  end
  return ver
end
blackhole889 commented 1 year ago

这个能再分享一下吗?很有用的lua。

chzhsh commented 1 year ago

连接已经失效,请重发一下吧

qq420100523 commented 1 year ago

非常好的lua,希望能再分享一下

youlans commented 1 year ago

新版文件:trime.rc-wubi-pub.7z 链接:https://pan.baidu.com/s/1F-uncRl8q3RYbw-IMyQmLA?pwd=74i9  提取码:74i9

压缩文件包含:

  1. 五笔手工造词lua脚本(相比初始版本有更新)
  2. 一个同文输入法的五笔十六键/全键主题,已经配合lua造词脚本定义了相应的热键菜单(在小鹤主题基础上修改)
  3. 配套的基础wubi86词库和方案(注意:十六键词库为减少重码有做深度删改,单字简码与86原版差异较大)
redleafnew commented 7 months ago

这个如何增加到现有方案中啊,如https://github.com/KyleBing/rime-wubi86-jidian方案中,现在用的模块lua了

WhisperWindE commented 7 months ago

local keys_win = { --{ 0, 0, 1,1,0, "9", dict_deploy}, { -1, -1, 1, 1, 0, "0", lua_test}, { 1, 1, 0, 0, 0, " ", dict_add}, { 1, 1, 0, 0, 0, "", dict_add}, { 0, 1, 1, 1, 0, "", dict_del}, { 0, 1, 1, 0, 0, "", dict_top}, } local cc = { hist_mode(env) and 1 or 0, has_menu(env) and 1 or 0, key:ctrl() and 1 or 0, key:shift() and 1 or 0, key:alt() and 1 or 0, } 这两个表的对应逻辑关系, 看得脑壳都疼了. 我觉得直接做个返回当前按键值, 再用按键值做一个表来对应操作, 不是更简单?

redleafnew commented 7 months ago

local keys_win = { --{ 0, 0, 1,1,0, "9", dict_deploy}, { -1, -1, 1, 1, 0, "0", lua_test}, { 1, 1, 0, 0, 0, " ", dict_add}, { 1, 1, 0, 0, 0, "", dict_add}, { 0, 1, 1, 1, 0, "", dict_del}, { 0, 1, 1, 0, 0, "", dict_top}, } local cc = { hist_mode(env) and 1 or 0, has_menu(env) and 1 or 0, key:ctrl() and 1 or 0, key:shift() and 1 or 0, key:alt() and 1 or 0, } 这两个表的对应逻辑关系, 看得脑壳都疼了. 我觉得直接做个返回当前按键值, 再用按键值做一个表来对应操作, 不是更简单?

具体怎么操作的,不懂lua啊