[Share Experiences] rime输入法五笔86方案改造过程记录
Tofloor
poster avatar
chenyun
deepin
2024-07-22 16:46
Author

一、感谢

本改造使用脚本主要取自以下网址,在此表示感谢。

https://github.com/KyleBing/rime-wubi86-jidian

https://gitlab.mintimate.cn/Mintimate/oh-my-rime

https://github.com/happyDom/dyyRime

二、免责申明:

本方案仅在deepin23rc2中测试通过,其它系统请谨慎使用。因使用本方案造成的一切后果,与本人无关。

三、改造成果:

  1. 对几个重要的补丁文件中设置条目进行了注释,几乎注释了所有我能理解的条目。
  2. 对〔/〕键引导输入的系列符号进行了优化和补充。并为〔/〕做了一个分类帮助。
  3. 按自己的喜好,对符号输入进行了适当的优化
  4. 丰富了〔z〕键的功能,并为〔z〕键做了一个系列符号输入分类帮助
    原五笔 86 方案,〔z〕键只有输入拼音反查五笔的功能,现在保留此功能的基础上添加了以下几项功能
    1. 〔z〕键,若已有输入,则第1候选项显示前面上屏的字词,下面候选项显示〔z〕键的提示;否则全部候选项显示〔z〕键的提示(可在lua/Help_z.lua脚本中修改)
    2. 〔z〕键 + 特定的字母,显示系列符号,等同〔/〕功能,系列符号取自dicts/wubi86_symbols.dict.yaml
    3. 〔z〕键 + 数字,显示中文数字大小写和金额大小写。
    4. 〔z〕键 +8 位数字,在上面的基础上增加显示农历和公历日期
      8 位数字前 4 位,表示年份,农历只能在 1899~2100 之间,公历无此限制
      8 位数字中间 2 位,表示月份,如果不足 2 位,则补 0
      8 位数字后 2 位,表示日期,如果不足 2 位,则补 0
  5. 添加了若干分类词库,为避免与原五笔词库重码,除 个人词库和系列符号词库 外新添加词库如果码长少于 4,都加 z 识别。(均可以自定义)
    1. 化学词库(dicts/wubi86_chemistry.dict.yaml):化学式、化学方程式,离子符号、元素符号,元素名称。
    2. 笔画词库(dicts/wubi86_bihua.dict.yaml):约 27540 多字的笔画编码
    3. latex符号格式词库(dicts/wubi86_latex.dict.yaml):一些常用的 latex 符号
    4. 系列符号词库(dicts/wubi86_symbols.dict.yaml):以〔z〕键引导,即4中b功能所用的词库,
    5. 个人词库(dicts/wubi86_user.dict.yaml):个人常用五笔词库
  6. 添加了候选项生僻字注音功能,可在弹出菜单中选择直接输出带拼音的候选项
  7. 添加候选项注释功能,可在弹出菜单中关闭
  8. 添加了简入繁出功能,可在弹出菜单中设置
  9. 添加了敏感词屏蔽和替换功能,可在弹出菜单中关闭
  10. 添加了切换纯单字模式功能,可在弹出菜单中开启
  11. 添加了切换单字优先功能,可在弹出菜单中开启
  12. 添加了词组优先功能,可在弹出菜单中开启,若单字优先和词组优先同时开启,则词组优先。
  13. 添加了联想功能,当候选项中出现特定的字词时,补充相应的候选项。
Reply Favorite View the author
All Replies
chenyun
deepin
2024-07-22 16:48
#1

四、改造过程

  1. 安装 rime 和安装五笔输入方案

    sudo apt install fcitx5-rime rime-data-wubi
    
  2. 添加 rime 输入法:

    1. 在系统设置(〔启动器〕-〔控制中心〕-〔键盘和语言〕-〔输入法〕)右上角点击〔+〕
    2. 选择〔中州韻〕,点击下方〔添加〕

    rime 默认的输入方案如图所示:

  3. 截图_选择区域_20240715150953
    没有我需要的五笔输入法方案

  4. 改造(一):自定义全局设置,添加五笔输入方案

    1. 清空 ~/.local/share/fcitx5/rime 文件夹里的所有文件和文件夹(不清空也没事),若原来就使用 rime 输入法,注意备份

    2. 复制 /usr/share/rime-data/default.yaml 到 ~/.local/share/fcitx5/rime 文件夹中

      cp /usr/share/rime-data/default.yaml ~/.local/share/fcitx5/rime/
      
    3. 用文件管理器打开 ~/.local/share/fcitx5/rime 文件夹或命令行中进入

      cd .local/share/fcitx5/rime
      
    4. 重命名 default.yaml 为 default.custom.yaml

      mv default.yaml default.custom.yaml
      
    5. 文本编辑器编辑 default.custom.yaml

      vim default.custom.yaml
      

      如下图所示:image

      1. 在文件中所有行行首增加两列空格,在 vim 中操作
        :%s/^/ / (^/后是2个空格)
      2. 在 config_version: 所在行上方插入一行,在行首开始输入:patch:,如下图所示
        image
        👀 后面所有设置条目都要比patch:至少缩进2空格,否则无效👀️,此文件中只能有一个patch:
      3. 找到 schema_list 段,修改其下方一个方案为 wubi86,也可以按形式添加一个,也可以删除所有原有方案,只添加 wubi86,如下图所示
        image
        • 说明:schema_list 段的作用是向 rime 添加输入方案,没在此段中列出的方案不能使用。
        • 输入方案可在 /usr/share/rime-data/ 文件夹找到,也可以自定义,见下文。
          以 .schema.yaml 为后缀的是输入方案,以 .dict.yaml 为后缀的是方案对应的词库文件。
          schema_list 段中 - schema: 后的字符串必须与 .schema.yaml 前的文件名相同。
      4. 现在保存 default.custom.yaml 文件,验证第一阶段改造成果。文中各条目的含意见文末我的default.custom.yaml
        1. :w vim 中保存文件操作
        2. 右键点击任务栏输入法图标,在弹出菜单中选择〔重新布署〕
      5. 现在当切换到中州韻时,可选择五笔进行输入。

      说明:default.custom.yaml 文件是对 /usr/share/rime-data/default.yaml 补丁(或覆写文件),rime 在重新布署时,会将 default.custom.yaml 中 patch: 段下的条目覆盖 /usr/share/rime-data/default.yaml 中的相应条目,没有被覆盖的条目保存原样,再应用至 ~/.local/share/fcitx5/rime/build/default.yaml(真正发挥作用的文件)
      在default.custom.yaml中修改的条目,对所有在schema_list 段中列出的方案发挥作用,即是全局设置,其优先级低于方案自身的设置。

Reply View the author
chenyun
deepin
2024-07-22 16:53
#2
  1. 改造(二):自定义wubi86 方案的设置
    1. 复制/usr/share/rime-data/wubi86.schema.yaml到~/.local/share/fcitx5/rime中

      cp /usr/share/rime-data/wubi86.schema.yaml ~/.local/share/fcitx5/rime/
      
    2. 用文件管理器打开 ~/.local/share/fcitx5/rime 文件夹或命令行中进入

      cd .local/share/fcitx5/rime
      
    3. 重命名 wubi86.schema.yaml 为 wubi86.custom.yaml

      mv wubi86.schema.yaml wubi86.custom.yaml
      
    4. 文本编辑器编辑 wubi86.custom.yaml

      vim wubi86.custom.yaml
      

      如下图所示:image

      1. 在文件中所有行行首增加两列空格,在 vim 中操作
        :%s/^/ / (^/后是2个空格)
      2. 在 schema: 所在行上方插入一行,在行首开始输入:patch:,如下图所示
        image
        👀 后面所有设置条目都要比patch:至少缩进2空格,否则无效👀️,此文件中只能有一个patch:
      3. 现在保存 wubi86.custom.yaml 文件,验证第二阶段改造成果。
        :w vim 中保存文件操作
        右键点击任务栏输入法图标,在弹出菜单中选择〔重新布署〕
      4. 现在,可以在此文件中改变五笔输入的一些设定了。若不改变其中的条目,与改造(一)没有区别。各条目的具体含意见文末我的wubi86.custom.yaml

      说明:wubi86.custom.yaml 文件是对 /usr/share/rime-data/wubi86.schema.yaml 补丁(或覆写文件),rime 在重新布署时,会将 `wubi86.custom.yaml` 中 patch: 段下的条目覆盖 `/usr/share/rime-data/wubi86.schema.yaml` 中的相应条目,没有被覆盖的条目保存原样,再应用至 ~/.local/share/fcitx5/rime/build/wubi86.schema.yaml(真正发挥作用的文件)
      在`wubi86.custom.yaml`中修改的条目,仅对wubi86 方案发挥作用,优先级高于default.yaml中的设置。

Reply View the author
chenyun
deepin
2024-07-22 16:55
#3
  1. 改造(三):挂接自定义词库
    1. 复制/usr/share/rime-data/wubi86.dict.yaml到~/.local/share/fcitx5/rime中

      cp /usr/share/rime-data/wubi86.dict.yaml ~/.local/share/fcitx5/rime/
      
    2. 用文件管理器打开 ~/.local/share/fcitx5/rime 文件夹或命令行中进入

      cd .local/share/fcitx5/rime
      
    3. 文本编辑器编辑 wubi86.dict.yaml

      vim wubi86.dict.yaml
      

      如下图所示:(上面还有一些注释文字,同样用#表示注释)

      image

      对词库设置的详细注释见文末我的wubi86.dict.yaml
      这里需要强调的时,词库设置必须放在---行和...行之间。这两行不是简单的分隔符号,而是词库设置的起始和结束符号。.
      ... 行下方才是词库的内容
      词库内容共分4列,第1列是词组,第2列是编码,第3列是权重(可省略),第4列是构词码(可省略),各列必须以 Tab 分隔。

      现在,我们在sort:所在行下面插入几行输入如下所示

      import_tables:
        - dicts/wubi86_user
      

      注意,第1行首字符与sort所在行首字符对齐,第2行缩进2空格。

      保存文件

    4. 制作自定义词库

      1. 在~/.local/share/fcitx5/rime/文件夹中新建一个名为dicts的文件夹
        其实把自定义词库放在rime文件夹中也可以,这儿为了以后管理方便,把所有自定义词库都放在dicts 中

      2. 在dicts文件夹中新建一个文本文件,重命名为wubi_user.dict.yaml,用文本编辑器打开,输入如下内容。自定义词库结构与wubi86.dict.yaml相同

        ---
        name: wubi86_user
        version: "2024-07-07"
        last_edit_time: "2024-07-13"
        dict_grouped: true # 词库管理应用识别:标记该码表为分组模式
        sort: original
          # 码表的排序方式
          # by_weight 权重
          # original 原始顺序
        #use_preset_vocabulary: true # 是否引入【八股文】的词频词序
        # 格式:字词 键码  权重 (中间是tab,不是空格)
        # '#'开头的只是注释, 注释只能另起一行写,不能在词条后面写
        # `##` 两个 # 开头的会被识别为分组名,其后跟的词条就是该组的内容
        ...
        ## 未分组 
        气密性	rpnt
        石蕊	dgan
        试液	yaiy
        根毛区	staq
        根冠	svpf
        

        说明:为管理自定义词组方便,我设置了dict_grouped: true,可以对自定义词组进行分组管理。

        强调:自定义词库的文件名前部(.dict.yaml前面部分)必须与wubi86.dict.yaml 中输入的一样。可以用相同方法挂接多个词库,见我的wubi86.dict.yaml

    5. 现在执行〔重新布署〕,可以输入自定义词库中的词组了。

Reply View the author
chenyun
deepin
2024-07-22 16:58
#4
  1. 改造(四):优化系列符号
    rime自带了众多的系列符号,但不一定符合每个人的输入习惯,接下来通过改造让其符合我个人的输入习惯
    1. 复制/usr/share/rime-data/symbols.yaml到~/.local/share/fcitx5/rime文件夹中

      cp /usr/share/rime-data/symbols.yaml ~/.local/share/fcitx5/rime/
      
    2. 用文件管理器打开 ~/.local/share/fcitx5/rime 文件夹或命令行中进入

      cd .local/share/fcitx5/rime
      
    3. 重命名 symbols.yaml 为 symbols.custom.yaml

      mv symbols.yaml symbols.custom.yaml
      
    4. 文本编辑器编辑 symbols.custom.yaml

      vim symbols.custom.yaml
      

      如下图所示:

      image

      1. 在文件中所有行行首增加两列空格,在 vim 中操作
        :%s/^/ / (^/后是2个空格)
      2. 将其头部改成如下图所示
        image
        👀 后面所有设置条目都要比patch:至少缩进2空格,否则无效👀️,此文件中只能有一个patch:
        • full_shape:段表示全角模式时输入的符号,
        • half_shape:表示半角模式时输入的符号,
        • symbols:表示系列符号,
        • 基本格式:"按键": [ "符号1", "符号2"]
        • 直接上屏:"按键": { commit: "符号"}
        • 轮流直接上屏:"按键": {pair: [ "符号1", "符号2"]}
          按键按奇数次,上屏符号1,按偶数数,上屏符号2
        • recognizer/patterns/punct:段设置系列符号的引导键,此引导键在此处,还有wubi86.custom.yaml文件中以及symbols:段中都要设置,而且要设置成相同才能发挥作用。
        • '^/([0-9]0?|[A-Za-z]+$'表示首字符为 / ,后跟1个数字或字母字符串,可发挥作用。
      3. 现在可以按格式及自己的习惯修改符号输入了,修改后记得保存 symbols.custom.yaml 文件,然后〔重新布署〕
Reply View the author
蓝鲸
deepin
2024-07-22 17:02
#5

感谢楼主分享kissing_heart

Reply View the author
chenyun
deepin
2024-07-22 17:15
#6
  1. 改造(五)为系列符号做一个帮助提示界面
    系列符号众多,而且必须用特定的编码才能显示特定的系列符号,而一些符号不常用,久后,我往往忘记系列符号的编码,为此,设计一个按 / 就会出现的系列符号分类提示如下图所示
    image
    1. 将symbols.custom.yaml中"/": 所在行修改如下:

      "/": [ "、" ]
      

      减少 / 键对应的候选项,为显示帮助增加更多的空间

    2. 在~/.local/share/fcitx5/rime/lua中新建一个名为Help.lua的文本文件,输入以下内容并保存(如果没有lua文件夹,新建一个)

      --lua语言中的注释用“--” 
      function translator(input, seg)
      	if (input == "/") then
      		yield(Candidate("",seg.start,seg._end,"提示:大写+d,名称+m,东+d、南+n、西+x、北+b",""))
      		yield(Candidate("",seg.start,seg._end,"标点+bd|特殊+ts|箭头+jt|数学+sx|货币+hb|上标+sb|下标+xb|单位+dw",""))
      		yield(Candidate("",seg.start,seg._end,"符号+fh|电脑+dn|几何+jh|星号+xh|方块+fk|两性+lx|天体+tt|天气+tq",""))
      		yield(Candidate("",seg.start,seg._end,"结构+jg|偏旁+pp|部首+bs|笔画+bh|注音+zy|拼音+py|声调+sd",""))
      		yield(Candidate("",seg.start,seg._end,"希腊+xl|罗马+lm|俄文+ew|韩文+hw|日文+rw|星座+xz|八卦+bg|钟表+zb",""))
      		yield(Candidate("",seg.start,seg._end,"汉字圆+hzy|数字圆+szy|字母圆+zmy|日文圆+rwy|韩文圆+hwy|太玄经+txj",""))
      		yield(Candidate("",seg.start,seg._end,"数字点+szd|汉字括+hzk|数字括+szk|字母括+zmk|韩文括+hwk|苏州码+szm",""))
      		yield(Candidate("",seg.start,seg._end,"月份+yf|日期+rq|整点+zd|音乐+yy|麻将+mj|象棋+xq|骰子+tz/sz|扑克+pk",""))
      		yield(Candidate("",seg.start,seg._end,"天干+tg|地支+dz|干支+gz|节气+jq|星宿+xx|曜日+yr|六十四卦+lssg",""))
      	end
      end
      
      return translator
      
    3. 编辑wubi86.custom.yaml文件,找到engine:下方translators:段在其下方添加

      - lua_translator@*Help 
      

      格式如下方所示:

        engine:
          translators:
            - lua_translator@*Help
      

      注意空格缩进对齐,其它原有条目不要修改,@* 后的字符串,必须与.lua文件的文件名一样

    4. 保存文件,然后〔重新布署〕,按 / 键测试效果

    5. 你可以按自己的习惯修改Help.lua和symbols.custom.yaml文件。

    6. 若不需要显示提示帮助,可以在- lua 前添加 # ,将它设置为注释;也可以直接删除。

Reply View the author
chenyun
deepin
2024-07-22 17:20
#7

改造(六)添加 z键 的功能

原生wubi86方案,z键 只有输入拼音反查五笔的功能。zz 引导可以输入少量的系列符号

  1. 重复上屏词功能
    1. 编辑wubi86.custom.yaml文件,找到engine:下方translators:段,在其下方添加

      - history_translator@repeat_last_input 
      

      格式如下方所示

        engine:
          translators:
            - history_translator@repeat_last_input
      

      注意空格缩进对齐,其它原有条目不要修改,注意与上面不同,@ 后无 * 号

    2. 在wubi86.custom.yaml文件尾部添加如下内容

      # 重复上一次输入
        repeat_last_input:
          input: z
          size: 1
          initial_quality: 1
      

      注意空格缩进及对齐。

    3. 保存文件,〔重新布署〕,测试改造结果

Reply View the author
chenyun
deepin
2024-07-22 17:28
#8
  1. z 键引导输入系列符号
    实际上系列符号用 / 引导输入就可以了,但有些从极点五笔上转换来的(比如我)习惯用 zz 引导输入系列符号,为此,将设置 z 能输入系列符号。
    原生wubi86词库中有少量用 zz 引导输入的系列符号,比如,编码 zzbd 可以显示常用标点符号,编码 zzts 可以显示常用特殊符号。
    为方便管理,我把原生词库中的系列符号与新添加的系列符号统一放在挂接词库wubi86_symbols.dict.yaml中

    1. 在~/.local/share/rime/dicts/中复制wubi86_user.dict.yaml文件,并重命名为wubi86_symbols.dict.yaml

    2. 编辑wubi86_symbols.dict.yaml

      1. 删除 ... 行以下的所有内容
      2. 找到sort: 所在行,修改成下方所示:
        sort: by_weight
        
        by_weight 表示按权重排序
      3. 保存文件
    3. 打开wubi86.dict.yaml,按前面所示挂接词库方法挂接wubi86_symbols词库如下

      import_tables:		# 此处是添加用户自定义词库的地方,可以挂接多个词库,词库放在 dicts 文件夹中
        - dicts/wubi86_user            # 个人词库
        - dicts/wubi86_symbols         # 系列符号词库
      

      其中- dicts/wubi86_user是前面已经挂接的词库

      dicts/wubi86_symbols是新挂接的。

    4. 将wubi86.dict.yaml中的系列符号整合到wubi86_user.dict.yaml中
      在wubi86.dict.yaml查找zz,并将查找到的所有行剪切粘贴到wubi86_user.dict.yaml中 ... 行下方。

    说明:系列符号词库需要依权重排序,否则符号排序会变得零乱。
    设置权重的方法:
    ① 少量的,可以逐行输入,注意数字越大,排序越在前面
    ② 将内容复制到Excel中操作添加权重列后,再复制回来。
    ③ 在vim中操作,如果原来有权重列,首先删除原来的权重列::%s/\t\([0-9]*\)$/\t/
    然后重新输入权重:
    :let i=10000|20,$g/$/s//\=i.''/| let i=i-1
    作用:从第20行开始在每行的尾部添加一个数字,数字以10000为始,每行依次递减1,直到最后一行。
    我的wubi86_symbols.dict.yaml 见文末

Reply View the author
chenyun
deepin
2024-07-22 17:31
#9
  1. 添加 z+数字 显示中文数字大小写及金额功能
    1. 在~/.local/share/rime/lua文件夹中,新建名为Number_translator.lua文本文件输入如下内容,并保存

      -- 来源 https://github.com/yanhuacuo/98wubi-tables > http://98wb.ysepan.com/
      -- 数字、金额大写 (任意大写字母引导+数字)
      -- 数字转换成公历年
      
      local function splitNumPart(str)
      	local part = {}
      	part.int, part.dot, part.dec = string.match(str, "^(%d*)(%.?)(%d*)")
      	return part
      end
      
      local function GetPreciseDecimal(nNum, n)
      	if type(nNum) ~= "number" then nNum =tonumber(nNum) end
      	n = n or 0;
      	n = math.floor(n)
      	if n < 0 then n = 0 end
      	local nDecimal = 10 ^ n
      	local nTemp = math.floor(nNum * nDecimal);
      	local nRet = nTemp / nDecimal;
      	return nRet;
      end
      
      local function decimal_func(str, posMap, valMap)
      	local dec
      	posMap = posMap or {[1]="角"; [2]="分"; [3]="厘"; [4]="毫"}
      	valMap = valMap or {[0]="零"; "壹"; "贰"; "叁" ;"肆"; "伍"; "陆"; "柒"; "捌"; "玖"}
      	if #str>4 then dec = string.sub(tostring(str), 1, 4) else dec =tostring(str) end
      	dec = string.gsub(dec, "0+$", "")
      
      	if dec == "" then return "整" end
      
      	local result = ""
      	for pos =1, #dec do
      		local val = tonumber(string.sub(dec, pos, pos))
      		if val~=0 then result = result .. valMap[val] .. posMap[pos] else result = result .. valMap[val] end
      	end
      	result=result:gsub(valMap[0]..valMap[0] ,valMap[0])
      	return result:gsub(valMap[0]..valMap[0] ,valMap[0])
      end
      
      -- 把数字串按千分位四位数分割,进行转换为中文
      local function formatNum(num,t)
      	local digitUnit,wordFigure
      	local result=""
      	num=tostring(num)
      	if tonumber(t) < 1 then digitUnit = {"", "十", "百","千"} else digitUnit = {"","拾","佰","仟"} end
      	if tonumber(t) <1 then
      		wordFigure = {"〇","一","二","三","四","五","六","七","八","九"}
      	else wordFigure = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"} end
      	if string.len(num)>4 or tonumber(num)==0 then return wordFigure[1] end
      	local lens=string.len(num)
      	for i=1,lens do
      		local n=wordFigure[tonumber(string.sub(num,-i,-i))+1]
      		if n~=wordFigure[1] then result=n .. digitUnit[i] .. result else result=n .. result end
      	end
      	result=result:gsub(wordFigure[1]..wordFigure[1] ,wordFigure[1])
      	result=result:gsub(wordFigure[1].."$","") result=result:gsub(wordFigure[1].."$","")
      
      	return result
      end
      
      -- 数值转换为中文
      function number2cnChar(num,flag,digitUnit,wordFigure)    --flag=0中文小写反之为大写
      	local st,result
      	num=tostring(num) result=""
      	local num1,num2=math.modf(num)
      	if tonumber(num2)==0 then
      		if tonumber(flag) < 1 then
      			digitUnit = digitUnit or {[1]="万";[2]="亿"}  wordFigure = wordFigure or {[1]="〇"; [2]="一"; [3]="十"; [4]="元"}
      		else
      			digitUnit = digitUnit or {[1]="万";[2]="亿"}  wordFigure = wordFigure or {[1]="零"; [2]="壹"; [3]="拾"; [4]="元"}
      		end
      		local lens=string.len(num1)
      		if lens<5 then result=formatNum(num1,flag) elseif lens<9 then result=formatNum(string.sub(num1,1,-5),flag) .. digitUnit[1].. formatNum(string.sub(num1,-4,-1),flag)
      		elseif lens<13 then result=formatNum(string.sub(num1,1,-9),flag) .. digitUnit[2] .. formatNum(string.sub(num1,-8,-5),flag) .. digitUnit[1] .. formatNum(string.sub(num1,-4,-1),flag) else result="" 
      		end
      		result=result:gsub("^" .. wordFigure[1],"") result=result:gsub(wordFigure[1] .. digitUnit[1],"") result=result:gsub(wordFigure[1] .. digitUnit[2],"")
      		result=result:gsub(wordFigure[1] .. wordFigure[1],wordFigure[1]) result=result:gsub(wordFigure[1] .. "$","")
      		if lens>4 then 
      			result=result:gsub("^"..wordFigure[2].. wordFigure[3],wordFigure[3]) 
      		end
      		if result~="" then 
      			result=result .. wordFigure[4] else result="数值超限!" 
      		end
      	else 
      		return "数值超限!" 
      	end
      
      	return result
      end
      
      local function number2zh(num,t)
      	local result,wordFigure
      	result="" 
      	if tonumber(t) <1 then
      		wordFigure = {"〇","一","二","三","四","五","六","七","八","九"}
      	else wordFigure = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"} end
      	if tostring(num)==nil then return "" end
      	for pos=1,string.len(num) do
      		result=result..wordFigure[tonumber(string.sub(num, pos, pos)+1)]
      	end
      	result=result:gsub(wordFigure[1] .. wordFigure[1],wordFigure[1])
      	return result:gsub(wordFigure[1] .. wordFigure[1],wordFigure[1])
      end
      
      local function number_translatorFunc(num)
      	local numberPart=splitNumPart(num)
      	local result={}
      	if numberPart.dot~="" then
      		table.insert(result,{number2cnChar(numberPart.int,0,{"万", "亿"},{"〇","一","十","点"})..number2zh(numberPart.dec,0),"〔数字小写〕"})
      		table.insert(result,{number2cnChar(numberPart.int,1,{"萬", "億"},{"〇","一","十","点"})..number2zh(numberPart.dec,1),"〔数字大写〕"})
      	else
      		table.insert(result,{number2cnChar(numberPart.int,0,{"万", "亿"},{"〇","一","十",""}),"〔数字小写〕"})
      		table.insert(result,{number2cnChar(numberPart.int,1,{"萬", "億"},{"零","壹","拾",""}),"〔数字大写〕"})
      	end
      	table.insert(result,{number2cnChar(numberPart.int,0)..decimal_func(numberPart.dec,{[1]="角"; [2]="分"; [3]="厘"; [4]="毫"},{[0]="〇"; "一"; "二"; "三" ;"四"; "五"; "六"; "七"; "八"; "九"}),"〔金额小写〕"})
      	table.insert(result,{number2cnChar(numberPart.int,1)..decimal_func(numberPart.dec,{[1]="角"; [2]="分"; [3]="厘"; [4]="毫"},{[0]="零"; "壹"; "贰"; "叁" ;"肆"; "伍"; "陆"; "柒"; "捌"; "玖"}),"〔金额大写〕"})
      	return result
      end
      
      -- 触发模式为任意大写字母(除了 U,U 用在 Unicode 了)开头,可在 recognizer/patterns 中自定义
      local function number_translator(input, seg, env)
      	-- 获取 recognizer/patterns/number 的第 2 个字符作为触发前缀
      	env.number_keyword = env.number_keyword or env.engine.schema.config:get_string('recognizer/patterns/rmb'):sub(2, 2)
          local str, num, numberPart
          if env.number_keyword ~= '' and input:sub(1, 1) == env.number_keyword then
              str = string.gsub(input, "^(%a+)", "")
              numberPart = number_translatorFunc(str)
              if str and #str > 0 and #numberPart > 0 then
                  for i = 1, #numberPart do
                      yield(Candidate(input, seg.start, seg._end, numberPart[i][1], numberPart[i][2]))
                  end
              end
          end
      end
      
      -- print(#number_translatorFunc(3355.433))
      return number_translator
      
      
    2. 编辑wubi86.custom.yaml文件,找到engine:下方translators:段在其下方添加

      • lua_translator@*Number_translator 格式如下方所示:
       engine:
          translators:
            - lua_translator@*Number_translator
      

      注意空格缩进对齐,其它原有条目不要修改,@* 后的字符串,必须与.lua文件的文件名一样

    3. 编辑wubi86.custom.yaml文件,找到recognizer:下的patterns:,在其下添加rmb: "^z[0-9]+[.]?[0-9]*",如下方所示:

        recognizer:                             # 编码栏正则表达式,当编码匹配到相应正则表达式时,不生成正常候选项,而是采取设定的行为
          import_preset: default                # 引用default,即default.yaml中的 recognizer 段设置
          patterns:
            punct: '^/([0-9]0?|[A-Za-z]+)$'     # 当首编码是 / ,后跟字母或数字,执行 punctuator 段设置
            reverse_lookup: "^z[a-z]*'?$"       # 当首编码是 z ,后跟字母,执行 reverse_lookup 段设置
            rmb: "^z[0-9]+[.]?[0-9]*"           # 当首编码是 z ,后跟数字,响应 lua_translator@*Number_translator
      
    4. 保存文件,〔重新布署〕,测试改造结果

Reply View the author
chenyun
deepin
2024-07-22 17:43
#10

最后成果:https://www.jianguoyun.com/p/DUFQVSgQmaDGDBjkps4FIAA

可下载全部文件到 ~/.local/share/fcitx5/rime/中,〔重新布署〕

Reply View the author
jjcui8595
deepin
2024-07-22 20:00
#11

like

Reply View the author
阿尼樱奈奈
Moderator
2024-07-22 20:30
#12

like

Reply View the author
新手来啦~
deepin
2024-07-23 12:55
#13

like

Reply View the author
s36376149
deepin
2024-07-23 17:41
#14
目前使用极点也好用,虽然它不更新了,不过使用起来挺顺心的
Reply View the author