Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
youlans opened this issue Sep 1, 2022 · 11 comments
Open

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

youlans opened this issue Sep 1, 2022 · 11 comments

Comments

@youlans
Copy link

youlans commented Sep 1, 2022

链接:
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>绑定的菜单(词组不上屏且候选框自动清除代表成功)
  1. 删词:
  1. 正常输入,让待删除词组显示在候选框
  2. windows: 按<ctrl+shift+n>即可,候选框实时更新(与主流输入法搜狗等一致)
    n代表待删除词组序号
    android:
    -- 通过绑定的菜单移动到想要删除的候选词
    -- 单击<ctrl+2>绑定的菜单,候选框实时更新
  1. 置顶:
  1. 正常输入,让待删除单字/词组显示在候选框(如在靠后位置可翻页寻找)
  2. windows: 按<ctrl+n>即可,候选框实时更新(与主流输入法搜狗等一致)
    n代表待置顶词组序号
    android:
    -- 通过绑定的菜单移动到想要删除的候选词
    -- 单击<ctrl+3>绑定的菜单,候选框实时更新

五 备注

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

@shewer
Copy link
Contributor

shewer commented Sep 1, 2022

查找 types.cc xxxxReg func methods get set

librime-lua/src/types.cc

Lines 1581 to 1586 in ad90e2e

static const luaL_Reg funcs[]= {
{ "get_rime_version", WRAP(get_rime_version) },
{ "get_shared_data_dir", WRAP(get_shared_data_dir) },
{ "get_user_data_dir", WRAP(get_user_data_dir) },
{ "get_sync_dir", WRAP(get_sync_dir) },
{ NULL, NULL },

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
Copy link
Author

youlans commented Sep 2, 2022

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

@youlans
Copy link
Author

youlans commented Sep 2, 2022

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

@shewer
Copy link
Contributor

shewer commented Sep 2, 2022

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
Copy link

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

@chzhsh
Copy link

chzhsh commented Nov 24, 2022

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

@qq420100523
Copy link

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

@youlans
Copy link
Author

youlans commented May 20, 2023

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

压缩文件包含:

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

@redleafnew
Copy link

redleafnew commented Feb 19, 2024

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

@WhisperWindE
Copy link

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
Copy link

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啊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants