Rime输入法配置

Rime 配置文件

RIME输入法的定制就是通过编辑配置文件实现需要的功能,配置文件是yaml格式的文件,该文件均采用UTF-8 编码的YAML文本,这是以一种可读性高的数据描述语言—— YAML 写成。想了解YAML文档格式请访问The Official YAML Web Site

不同平台的输入法

用户配置文件夹

# ~/.config/ibus/rime	(Linux)
# ~/.config/fcitx/rime	(Linux)
# ~/.local/share/fcitx5/rime	(Linux)
# ~/Library/Rime	(Mac OS)   # 可以通过「系统输入法菜单/鼠须管/用户设定…」打开
# %APPDATA%\Rime	(Windows)  # 可以通过「开始菜单\小狼毫输入法\用户文件夹」打开

用户配置文件夹用于存放 Rime 输入法所有配置文件,其中 build 文件夹内的内容不要修改,其他文件是配置文件。

不要直接修改默认生成的重要配置文件,在软件升级时,这些文档会被覆写为更高版本,导致自定义的数据丢失。为了保障数据不丢失,通过创建一个次级扩展名为 .custom 的定制文档,如:配置文件 default.yaml ,通过新建 defarlt.custom.yaml 进行自定义配置,配置后点击重新部署即可。

鉴于一些文本编辑器会为 UTF-8 编码的文件添加 BOM 标记,为防止误将该字符混入文中, 莫要从文件的第一行开始正文,而请在该行行首以 # 起一行注释,如 :

# Rime default settings

# Rime schema: My First Cool Schema

# Rime dictionary: Lingua Latina

文件作用

编译输入方案所产生的二进制文件

记录用户写作习惯的文件

<方案标识>.userdb/ : 保存用户的输入习惯的用户词典

用户自己设定的

粗体字的内容,在清理文件时注意备份。

入门

定制指南(初级)

方案设计(中级)

程序开发(高级)

常见问题

Schema.yaml 详解

主题方案

新建 weasel.custom.yaml 配置一个主题方案

patch:
  "app_options/cmd.exe":
    ascii_mode: true
  "style/color_scheme": me_weasel     # 选择配色方案
  "style/horizontal": true         # 候选横排
  "style/inline_preedit": true     # 嵌入式候选窗单行显示


# 自定义配色方案
  "preset_color_schemes/me_weasel":
    name: me_weasel                # 方案名
    author: "eonun"                   # 作者
    back_color: 0xefefef           # 背景颜色
    border_color: 0xefefef         # 边框颜色,与背景相同则为无边框的效果
    text_color: 0x575759           # 内选区域文字颜色
    hilited_text_color: 0xed9564   # 内选区域字母颜色
    hilited_back_color: 0xefefef   # 内选区域字母底色
    hilited_candidate_text_color: 0xffffff  # 激活候选项的文字颜色
    hilited_candidate_back_color: 0xed9564  # 激活候选项的文字底色
    candidate_text_color: 0x575759 # 其他候选项文字颜色
    comment_text_color: 0xcac9c8   # 拼音等提示文字颜色
    label_color: 0xcac9c8   # 序号颜色
    

主题配置颜色如下

学习笔记/assets/Pasted image 20230111112359.png

定制方案

patch: # 定义一组补丁,以源文件中的设定为底本,写入新的设定项、或以新的设定值取代旧有的值
  "一级设定项/二级设定项/三级设定项": 新的设定值
  "另一个设定项": 新的设定值
  "再一个设定项": 新的设定值
  "含列表的设定项/@n": 列表第n个元素新的设定值,从0开始计数
  "含列表的设定项/@last": 列表最后一个元素新的设定值
  "含列表的设定项/@before 0": 在列表第一个元素之前插入新的设定值(不建议在补靪中使用)
  "含列表的设定项/@after last": 在列表最后一个元素之后插入新的设定值(不建议在补靪中使用)
  "含列表的设定项/@next": 在列表最后一个元素之后插入新的设定值(不建议在补靪中使用)
  "含列表的设定项/+": 与列表合并的设定值(必须为列表)
  "含字典的设定项/+": 与字典合并的设定值(必须为字典,注意YAML字典的无序性)

词库

基础

词库文件格式

在用户配置文件夹下,.dict.yaml结尾的文件。

调用规则

Rime 可以扩充很多词库,为了防止卡顿通过递归调用对方式调取词库内容,定义一个总的词库,总词库的名称格式也为 *.dict.yaml(如: myDict.dict.yaml),假设扩充词库有 A.dict.yamlB.dict.yamlC.dict.yamlD.dict.yamlE.dict.yaml

总词库对内容如下 :

 # 注意这里以 --- ... 分别标记出 YAML 文档的起始与结束位置
# 在 ... 标记之后的部份就不会作 YAML 文档来解读
 --- 
name: myDict          # 必须与文件名相同,不加文件后缀 
version: "2023.01.11" # 管理词典的版本,规则同输入方案定义文件的版本号
sort: by_weight       # 词条初始排序方式,可选填 by_weight(按词频高低排序)或 original(保持原码表中的顺序)
use_preset_vocabulary: true    # 填 true 或 false,选择是否导入预设词汇表【八股文】
...

import_tables:        # 导入词库,不用加扩展名
   - A
   - B
   - C
   - D
   #- E                # 屏蔽词库E,需要使用时去掉 # 即可

Rime 调用总的词库,总的词库再调用各个词库,各个词库之间也不互相影响,此时设置 Rime 调用总词库 myDict 即可

在自定义输入方案 .custom.yaml (如 : luna_pinyin_simp.schema.custom.yaml) 加入以下语句:

   'translator/dictionary': myDict

简体繁体转换

使用 opencc 转换简体和繁体字。
学习笔记/assets/Pasted image 20230113110016.png

搜狗合QQ输入法的词库

搜狗的词库文件为 .scel , QQ 的词库文件为 .qpyd,需要使用深蓝词库转换工具将其转换为 Rime 能使用对 yaml 词库

学习笔记/assets/Pasted image 20230111105115.png

新建 .dict.yaml 的自定义词库文件,加入以下内容,然后添加转换出对词库内容

# Rime dictionary
# encoding: utf-8
# 
# 这是一个词库例子
---
name: dict_name    # 词库名,需与文件名一致
version: "2023.01.11"
sort: by_weight
use_preset_vocabulary: true
...

# 以制表符(Tab)分隔的第一个字段是所定义的文字,可以是单字或词组;
# 第二个字段是与文字对应的编码;若该编码由多个「音节」组成,音节之间以空格分开;
# 可选地、第三个字段是设定该字词权重的频度值(非负整数),或相对于预设权值的百分比(浮点数%)。 在拼音输入法中,往往多音字的若干种读音使用的场合不同,于是指定不同百分比来修正每个读音的使用频度。

# 词组如果满足以下条件,则可以省去编码字段:
# 词组中每个单字均有编码定义词组中不包含多音字(例:你我),或多音字在该词组中读音的权值超过该多音字全部读音权值的5%(例:我的)这种条件下,词组的编码可由单字编码的组合推导出来。
# 反之,则有必要给出词组的编码以消除自动注音的不确定性(例:天地)。
# 当含有多音字的词组缺少编码字段时,自动注音程序会利用权重百分比高于5%的读音进行组合、生成全部可能的注音,如:
#「好好地」在编译时自动注音为「hao hao de」、「hao hao di」

# 词库内容
一一行行	yi yi xing hang	1
一七令	yi qi ling	1
一万日	yi wan ri	1
一丈五尺	yi zhang wu chi	1
好好地	hao hao de hao hao di	1

函数词库

通过 lua 函数可实现一些使用功能

参考librime-lua

FullTime 全时间

创建函数脚本 lua/fulltime.lua

-- 获取当前全时间×年×月×日×时×分×秒   输入:fulltime
-------------------------------------------------
local function translator(input, seg)
   if (input == "allt"or input == "time") then
-------------------------------------------------
-- 星期      day_w1="星期日"  day_w2="Sunday" day_w3="Sun." 
    local day_w=os.date("%w")
    local day_w1=""
    local day_w2=""
    local day_w3=""
    if day_w=="0" then 
      day_w1="星期日" 
      day_w2="Sunday" 
      day_w3="Sun." 
    end
    if day_w=="1" then
      day_w1="星期一" 
      day_w2="Monday" 
      day_w3="Mon." 
    end
    if day_w=="2" then
      day_w1="星期二" 
      day_w2="Tuesday" 
      day_w3="Tues." 
    end
    if day_w=="3" then 
      day_w1="星期三" 
      day_w2="Wednesday" 
      day_w3="Wed." 
    end
    if day_w=="4" then 
      day_w1="星期四" 
      day_w2="Thursday" 
      day_w3="Thur." 
    end
    if day_w=="5" then 
      day_w1="星期五"  
      day_w2="Friday" 
      day_w3="Fri." 
    end
    if day_w=="6" then 
      day_w1="星期六" 
      day_w2="Saturday" 
      day_w3="Sat." 
    end
-------------------------------------------------
-- 普通日期1,类似2020年02月04日
date_00=os.date("%Y%m%d")
date_0=os.date("%Y/%m/%d")
date_1=os.date("%Y-%m-%d")
date_y0=os.date("%Y") --取年
date_m0=os.date("%m") --取月
date_d0=os.date("%d") --取日

-- 去零日和月tostring(num_m1)   tostring(num_d1)
num_m=os.date("%m")+0
num_m1=math.modf(num_m)
num_d=os.date("%d")+0
num_d1=math.modf(num_d)

date_y2=os.date("%Y") --取年
date_m2=tostring(num_m1) --取月
date_d2=tostring(num_d1) --取日
date_2=os.date("%Y年")..tostring(num_m1).."月"..tostring(num_d1).."日"
-------------------------------------------------
-- 英文日期          date_m1="Jan." date_m2="January"       symbal
    local date_d=os.date("%d")
    local date_m=os.date("%m")
    local date_y=os.date("%Y")
    local date_m1=""
    local date_m2=""

    if date_m=="01" then 
       date_m1="Jan."
       date_m2="January"
    end
    if date_m=="02" then 
       date_m1="Feb."
       date_m2="February"
    end
    if date_m=="03" then 
       date_m1="Mar."
       date_m2="March"
    end
    if date_m=="04" then 
       date_m1="Apr."
       date_m2="April"
    end
    if date_m=="05" then 
       date_m1="May."
       date_m2="May"
    end
    if date_m=="06" then 
       date_m1="Jun."
       date_m2="June"
    end
    if date_m=="07" then 
       date_m1="Jul."
       date_m2="July"
    end
    if date_m=="08" then 
       date_m1="Aug."
       date_m2="August"
    end
    if date_m=="09" then 
       date_m1="Sept."
       date_m2="September"
    end
    if date_m=="10" then 
       date_m1="Oct."
       date_m2="October"
    end
    if date_m=="11" then 
       date_m1="Nov."
       date_m2="November"
    end
    if date_m=="12" then 
       date_m1="Dec."
       date_m2="December"
    end

     if date_d=="0" then 
       symbal="st" 
     elseif date_d=="1" then
       symbal="nd" 
     elseif date_d=="2" then 
       symbal="rd" 
     else
       symbal="th"
     end

date_4=date_m1..""..date_d..symbal..","..date_y
date_5=date_m2.." "..date_d..symbal..","..date_y
-------------------------------------------------
-- 时间
date_t0=os.date("%H%M")
date_t1=os.date("%H:%M")
date_t2=os.date("%H点%M分")
date_t3=os.date("%H:%M:%S")
date_t4=os.date("%H点%M分%S秒")
-------------------------------------------------
date0=date_00..date_t0
date1=day_w3.." "..date_m1.." "..date_d..symbal..", "..date_t3..", "..date_y
date2=date_1.." "..date_t3
date3=date_2.." "..day_w1.." "..date_t4

yield(Candidate("date", seg.start, seg._end, date0, " "))
yield(Candidate("date", seg.start, seg._end, date1, " "))
yield(Candidate("date", seg.start, seg._end, date2, " "))
yield(Candidate("date", seg.start, seg._end, date3, " "))
   end
end
-------------------------------------------------
return translator

rime.lua 中定义函数,配置调用 lua/fulltime.lua 脚本

fulltime_translator = require("fulltime")

.custom.yaml 文件中 engine/translators 下启用配置

# 函数调用
  'engine/translators':
    - lua_translator@fulltime_translator

DATA 日期

创建函数脚本 lua/date.lua

-- 日期
-- 获取当前日期×年×月×日  &  ×月×日   输入:date
-------------------------------------------------
local function translator(input, seg)
   if (input == "date") then
-------------------------------------------------
-- 日期1,例:2020年02月04日
date1=os.date("%Y年%m月%d日")
date_y=os.date("%Y") --取年
date_m=os.date("%m") --取月
date_d=os.date("%d") --取日
--yield(Candidate("date", seg.start, seg._end, date1, " "))

-------------------------------------------------
-- 日期2,例:2020年2月4日
num_m=os.date("%m")+0
num_m1=math.modf(num_m)
num_d=os.date("%d")+0
num_d1=math.modf(num_d)
date2=os.date("%Y年")..tostring(num_m1).."月"..tostring(num_d1).."日"
yield(Candidate("date", seg.start, seg._end, date2, " "))

-------------------------------------------------
-- 日期3,例:2020年2月4日
num_m=os.date("%m")+0
num_m1=math.modf(num_m)
num_d=os.date("%d")+0
num_d1=math.modf(num_d)
date3=tostring(num_m1).."月"..tostring(num_d1).."日"
yield(Candidate("date", seg.start, seg._end, date3, " "))

-------------------------------------------------
yield(Candidate("date", seg.start, seg._end, os.date("%Y/%m/%d"), " "))
yield(Candidate("date", seg.start, seg._end, os.date("%Y-%m-%d"), " "))
-------------------------------------------------
-- 大写日期,例:二〇二〇年十一月二十六日
date_y=date_y:gsub("%d",{
["1"]="一",
["2"]="二",
["3"]="三",
["4"]="四",
["5"]="五",
["6"]="六",
["7"]="七",
["8"]="八",
["9"]="九",
["0"]="〇",
})
date_y=date_y.."年"

date_m=date_m:gsub("%d",{
["1"]="一",
["2"]="二",
["3"]="三",
["4"]="四",
["5"]="五",
["6"]="六",
["7"]="七",
["8"]="八",
["9"]="九",
["0"]="",
})
date_m=date_m.."月"
if num_m1==10 then date_m="十月" end
if num_m1==11 then date_m="十一月" end
if num_m1==12 then date_m="十二月" end

date_d=date_d:gsub("%d",{
["1"]="一",
["2"]="二",
["3"]="三",
["4"]="四",
["5"]="五",
["6"]="六",
["7"]="七",
["8"]="八",
["9"]="九",
["0"]="",
})
date_d=date_d.."日"
if num_d1>9 then
if num_d1<19 then
date_d="十"..string.sub(date_d,4,#date_d)
end
end
if num_d1>19 then date_d=string.sub(date_d,1,3).."十"..string.sub(date_d,4,#date_d) end
date4=date_y..date_m..date_d

yield(Candidate("date", seg.start, seg._end, date4, " "))

--英文日期
    local date_d=os.date("%d")
    local date_m=os.date("%m")
    local date_y=os.date("%Y")
    local date_m1=""
    local date_m2=""

    if date_m=="01" then 
       date_m1="Jan."
       date_m2="January"
    end
    if date_m=="02" then 
       date_m1="Feb."
       date_m2="February"
    end
    if date_m=="03" then 
       date_m1="Mar."
       date_m2="March"
    end
    if date_m=="04" then 
       date_m1="Apr."
       date_m2="April"
    end
    if date_m=="05" then 
       date_m1="May."
       date_m2="May"
    end
    if date_m=="06" then 
       date_m1="Jun."
       date_m2="June"
    end
    if date_m=="07" then 
       date_m1="Jul."
       date_m2="July"
    end
    if date_m=="08" then 
       date_m1="Aug."
       date_m2="August"
    end
    if date_m=="09" then 
       date_m1="Sept."
       date_m2="September"
    end
    if date_m=="10" then 
       date_m1="Oct."
       date_m2="October"
    end
    if date_m=="11" then 
       date_m1="Nov."
       date_m2="November"
    end
    if date_m=="12" then 
       date_m1="Dec."
       date_m2="December"
    end

     if date_d=="0" then 
       symbal="st" 
     elseif date_d=="1" then
       symbal="nd" 
     elseif date_d=="2" then 
       symbal="rd" 
     else
       symbal="th"
     end

   date5=date_m1.." "..date_d..symbal..", "..date_y
   date6=date_m2.." "..date_d..symbal..", "..date_y

   yield(Candidate("date", seg.start, seg._end, date5, " "))
   yield(Candidate("date", seg.start, seg._end, date6, " "))
   yield(Candidate("date", seg.start, seg._end, os.date("%Y%m%d"), " "))

   end
end
-------------------------------------------------
return translator

rime.lua 中定义函数,配置调用 lua/date.lua 脚本

date_translator = require("date")

.custom.yaml 文件中 engine/translators 下启用配置

# 函数调用
  'engine/translators':
    - lua_translator@date_translator

TIME 时间

创建函数脚本 lua/time.lua

-- 时间
-- 获取当前时间×时×分×秒             输入:time
-------------------------------------------------
local function translator(input, seg)
   if (input == "time") then
      yield(Candidate("time", seg.start, seg._end, os.date("%H:%M"), " "))
      yield(Candidate("time", seg.start, seg._end, os.date("%H点%M分"), " "))
      yield(Candidate("time", seg.start, seg._end, os.date("%H:%M:%S"), " "))
      yield(Candidate("time", seg.start, seg._end, os.date("%H点%M分%S秒"), " "))
   end
end

return translator

rime.lua 中定义函数,配置调用 lua/time.lua 脚本

time_translator = require("time")

.custom.yaml 文件中 engine/translators 下启用配置

# 函数调用
  'engine/translators':
    - lua_translator@time_translator

WEEK 星期

创建函数脚本 lua/week.lua

-- 星期
-- 获取当前星期                      输入:week
-------------------------------------------------
function translator(input, seg)
  if (input == "week") then
    local day_w=os.date("%w")
    local day_w1=""
    local day_w2=""
    local day_w3=""
    if day_w=="0" then 
      day_w1="星期日" 
      day_w2="Sunday" 
      day_w3="Sun." 
    end
    if day_w=="1" then
      day_w1="星期一" 
      day_w2="Monday" 
      day_w3="Mon." 
    end
    if day_w=="2" then
      day_w1="星期二" 
      day_w2="Tuesday" 
      day_w3="Tues." 
    end
    if day_w=="3" then 
      day_w1="星期三" 
      day_w2="Wednesday" 
      day_w3="Wed." 
    end
    if day_w=="4" then 
      day_w1="星期四" 
      day_w2="Thursday" 
      day_w3="Thur." 
    end
    if day_w=="5" then 
      day_w1="星期五"  
      day_w2="Friday" 
      day_w3="Fri." 
    end
    if day_w=="6" then 
      day_w1="星期六" 
      day_w2="Saturday" 
      day_w3="Sat." 
    end
    yield(Candidate("date", seg.start, seg._end, day_w1, " "))
    yield(Candidate("date", seg.start, seg._end, day_w2, " "))
    yield(Candidate("date", seg.start, seg._end, day_w3, " "))
    yield(Candidate("week", seg.start, seg._end, os.date("%w"),""))
  end
end
return translator

rime.lua 中定义函数,配置调用 lua/week.lua 脚本

week_translator = require("week")

.custom.yaml 文件中 engine/translators 下启用配置

# 函数调用
  'engine/translators':
    - lua_translator@week_translator

LUNAR 农历

创建函数脚本 lua/lunar.lua

-- 获取当前全农历×年×月×日 &  ×月×日   输入:lunar
-------------------------------------------------

-- 定义农历字典
-- 天干名称
local nLTianGan = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"}
-- 地支名称
local nLDiZhi = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"}
-- 属相名称
local nLShuXing = {"鼠","牛","虎","兔","龙","蛇", "马","羊","猴","鸡","狗","猪"}
-- 农历日期名
local nLDayName =
{
    "*","初一","初二","初三","初四","初五",
    "初六","初七","初八","初九","初十",
    "十一","十二","十三","十四","十五",
    "十六","十七","十八","十九","二十",
    "廿一","廿二","廿三","廿四","廿五",
    "廿六","廿七","廿八","廿九","三十"
}
-- 农历月份名
local nLMonName = {"*","正","二","三","四","五","六", "七","八","九","十","冬","腊"}
 
local DaysToMonth366={ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }
 
local DaysToMonth365= { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }
 
local DateLunarInfo= { { 0, 2, 19, 19168 }, { 0, 2, 8, 42352 }, { 5, 1, 29, 21096 }, { 0, 2, 16, 53856 }, { 0, 2, 4, 55632 }, { 4, 1, 25, 27304 },
                       { 0, 2, 13, 22176 }, { 0, 2, 2, 39632 }, { 2, 1, 22, 19176 }, { 0, 2, 10, 19168 }, { 6, 1, 30, 42200 }, { 0, 2, 18, 42192 },
                       { 0, 2, 6, 53840 }, { 5, 1, 26, 54568 }, { 0, 2, 14, 46400 }, { 0, 2, 3, 54944 }, { 2, 1, 23, 38608 }, { 0, 2, 11, 38320 },
                       { 7, 2, 1, 18872 }, { 0, 2, 20, 18800 }, { 0, 2, 8, 42160 }, { 5, 1, 28, 45656 }, { 0, 2, 16, 27216 }, { 0, 2, 5, 27968 },
                       { 4, 1, 24, 44456 }, { 0, 2, 13, 11104 }, { 0, 2, 2, 38256 }, { 2, 1, 23, 18808 }, { 0, 2, 10, 18800 }, { 6, 1, 30, 25776 },
                       { 0, 2, 17, 54432 }, { 0, 2, 6, 59984 }, { 5, 1, 26, 27976 }, { 0, 2, 14, 23248 }, { 0, 2, 4, 11104 }, { 3, 1, 24, 37744 },
                       { 0, 2, 11, 37600 }, { 7, 1, 31, 51560 }, { 0, 2, 19, 51536 }, { 0, 2, 8, 54432 }, { 6, 1, 27, 55888 }, { 0, 2, 15, 46416 },
                       { 0, 2, 5, 22176 }, { 4, 1, 25, 43736 }, { 0, 2, 13, 9680 }, { 0, 2, 2, 37584 }, { 2, 1, 22, 51544 }, { 0, 2, 10, 43344 },
                       { 7, 1, 29, 46248 }, { 0, 2, 17, 27808 }, { 0, 2, 6, 46416 }, { 5, 1, 27, 21928 }, { 0, 2, 14, 19872 }, { 0, 2, 3, 42416 },
                       { 3, 1, 24, 21176 }, { 0, 2, 12, 21168 }, { 8, 1, 31, 43344 }, { 0, 2, 18, 59728 }, { 0, 2, 8, 27296 }, { 6, 1, 28, 44368 },
                       { 0, 2, 15, 43856 }, { 0, 2, 5, 19296 }, { 4, 1, 25, 42352 }, { 0, 2, 13, 42352 }, { 0, 2, 2, 21088 }, { 3, 1, 21, 59696 },
                       { 0, 2, 9, 55632 }, { 7, 1, 30, 23208 }, { 0, 2, 17, 22176 }, { 0, 2, 6, 38608 }, { 5, 1, 27, 19176 }, { 0, 2, 15, 19152 },
                       { 0, 2, 3, 42192 }, { 4, 1, 23, 53864 }, { 0, 2, 11, 53840 }, { 8, 1, 31, 54568 }, { 0, 2, 18, 46400 }, { 0, 2, 7, 46752 },
                       { 6, 1, 28, 38608 }, { 0, 2, 16, 38320 }, { 0, 2, 5, 18864 }, { 4, 1, 25, 42168 }, { 0, 2, 13, 42160 }, { 10, 2, 2, 45656 },
                       { 0, 2, 20, 27216 }, { 0, 2, 9, 27968 }, { 6, 1, 29, 44448 }, { 0, 2, 17, 43872 }, { 0, 2, 6, 38256 }, { 5, 1, 27, 18808 },
                       { 0, 2, 15, 18800 }, { 0, 2, 4, 25776 }, { 3, 1, 23, 27216 }, { 0, 2, 10, 59984 }, { 8, 1, 31, 27432 }, { 0, 2, 19, 23232 },
                       { 0, 2, 7, 43872 }, { 5, 1, 28, 37736 }, { 0, 2, 16, 37600 }, { 0, 2, 5, 51552 }, { 4, 1, 24, 54440 }, { 0, 2, 12, 54432 },
                       { 0, 2, 1, 55888 }, { 2, 1, 22, 23208 }, { 0, 2, 9, 22176 }, { 7, 1, 29, 43736 }, { 0, 2, 18, 9680 }, { 0, 2, 7, 37584 },
                       { 5, 1, 26, 51544 }, { 0, 2, 14, 43344 }, { 0, 2, 3, 46240 }, { 4, 1, 23, 46416 }, { 0, 2, 10, 44368 }, { 9, 1, 31, 21928 },
                       { 0, 2, 19, 19360 }, { 0, 2, 8, 42416 }, { 6, 1, 28, 21176 }, { 0, 2, 16, 21168 }, { 0, 2, 5, 43312 }, { 4, 1, 25, 29864 },
                       { 0, 2, 12, 27296 }, { 0, 2, 1, 44368 }, { 2, 1, 22, 19880 }, { 0, 2, 10, 19296 }, { 6, 1, 29, 42352 }, { 0, 2, 17, 42208 },
                       { 0, 2, 6, 53856 }, { 5, 1, 26, 59696 }, { 0, 2, 13, 54576 }, { 0, 2, 3, 23200 }, { 3, 1, 23, 27472 }, { 0, 2, 11, 38608 },
                       { 11, 1, 31, 19176 }, { 0, 2, 19, 19152 }, { 0, 2, 8, 42192 }, { 6, 1, 28, 53848 }, { 0, 2, 15, 53840 }, { 0, 2, 4, 54560 },
                       { 5, 1, 24, 55968 }, { 0, 2, 12, 46496 }, { 0, 2, 1, 22224 }, { 2, 1, 22, 19160 }, { 0, 2, 10, 18864 }, { 7, 1, 30, 42168 },
                       { 0, 2, 17, 42160 }, { 0, 2, 6, 43600 }, { 5, 1, 26, 46376 }, { 0, 2, 14, 27936 }, { 0, 2, 2, 44448 }, { 3, 1, 23, 21936 },
                       { 0, 2, 11, 37744 }, { 8, 2, 1, 18808 }, { 0, 2, 19, 18800 }, { 0, 2, 8, 25776 }, { 6, 1, 28, 27216 }, { 0, 2, 15, 59984 },
                       { 0, 2, 4, 27424 }, { 4, 1, 24, 43872 }, { 0, 2, 12, 43744 }, { 0, 2, 2, 37600 }, { 3, 1, 21, 51568 }, { 0, 2, 9, 51552 },
                       { 7, 1, 29, 54440 }, { 0, 2, 17, 54432 }, { 0, 2, 5, 55888 }, { 5, 1, 26, 23208 }, { 0, 2, 14, 22176 }, { 0, 2, 3, 42704 },
                       { 4, 1, 23, 21224 }, { 0, 2, 11, 21200 }, { 8, 1, 31, 43352 }, { 0, 2, 19, 43344 }, { 0, 2, 7, 46240 }, { 6, 1, 27, 46416 },
                       { 0, 2, 15, 44368 }, { 0, 2, 5, 21920 }, { 4, 1, 24, 42448 }, { 0, 2, 12, 42416 }, { 0, 2, 2, 21168 }, { 3, 1, 22, 43320 },
                       { 0, 2, 9, 26928 }, { 7, 1, 29, 29336 }, { 0, 2, 17, 27296 }, { 0, 2, 6, 44368 }, { 5, 1, 26, 19880 }, { 0, 2, 14, 19296 },
                       { 0, 2, 3, 42352 }, { 4, 1, 24, 21104 }, { 0, 2, 10, 53856 }, { 8, 1, 30, 59696 }, { 0, 2, 18, 54560 }, { 0, 2, 7, 55968 },
                       { 6, 1, 27, 27472 }, { 0, 2, 15, 22224 }, { 0, 2, 5, 19168 }, { 4, 1, 25, 42216 }, { 0, 2, 12, 42192 }, { 0, 2, 1, 53584 },
                       { 2, 1, 21, 55592 }, { 0, 2, 9, 54560 } }
 
 
-- 转为二进制
function DecimalismToBinary(num)
    local str = ""
    local tmp = num
    while (tmp > 0) do
        if (tmp % 2 == 1) then
            str = str .. "1"
        else
            str = str .. "0"
        end
 
        tmp = math.modf(tmp / 2)
    end
    str = string.reverse(str)
    return str
end
-- 先补齐两个数字的二进制位数
function MakeSameLength(num1, num2)
    local str1 = DecimalismToBinary(num1)
    local str2 = DecimalismToBinary(num2)
 
    local len1 = string.len(str1)
    local len2 = string.len(str2)
 
    local len = 0
    local x = 0
 
    if (len1 > len2) then
        x = len1 - len2
        for i = 1, x do
            str2 = "0" .. str2
        end
        len = len1
    elseif (len2 > len1) then
        x = len2 - len1
        for i = 1, x do
            str1 = "0" .. str1
        end
        len = len2
    end
    len = len1
    return str1, str2, len
end
-- 按位与
function BitAnd(num1, num2)
    local str1, str2, len = MakeSameLength(num1, num2)
    local rtmp = ""
 
    for i = 1, len do
        local st1 = tonumber(string.sub(str1, i, i))
        local st2 = tonumber(string.sub(str2, i, i))
 
 
        if(st1 == 0) then
            rtmp = rtmp .. "0"
        else
            if (st2 ~= 0) then
                rtmp = rtmp .. "1"
            else
                rtmp = rtmp .. "0"
            end
        end
    end
    return tonumber(rtmp,2)
end
-- 阳历转阴历
function GregorianToLunar(nSYear,nSMonth,nSDate)
    local nLYear,nLMonth,nLDay
    local i=(GregorianIsLeapYear(nSYear) == 1 and DaysToMonth366[nSMonth ] or DaysToMonth365[nSMonth ])+nSDate
 
    nLYear = nSYear
    local yearInfo
    local yearInfo2
    if nLYear == 2101 then
        nLYear = nLYear -1
        i=i+(GregorianIsLeapYear(nLYear) == 1 and 366 or 365)
        yearInfo=GetYearInfo(nLYear,1)
        yearInfo2=GetYearInfo(nLYear,2)
    else
        yearInfo=GetYearInfo(nLYear,1)
        yearInfo2=GetYearInfo(nLYear,2)
        if nSMonth <yearInfo or (nSMonth == yearInfo and nSDate < yearInfo2) then
            nLYear=nLYear-1
            i=i+(GregorianIsLeapYear(nLYear) == 1 and 366 or 365)
            yearInfo=GetYearInfo(nLYear,1)
            yearInfo2=GetYearInfo(nLYear,2)
        end
    end
    i=i-DaysToMonth365[yearInfo]
    i=i-yearInfo2+1
    local num=32768
    local yearInfo3=GetYearInfo(nLYear,3)
    local num2=(BitAnd(yearInfo3,num)) ~= 0 and 30 or 29
    nLMonth=1
    while(i>num2) do
        i=i-num2
        nLMonth=nLMonth+1
        num=num /2
        num2=(BitAnd(yearInfo3,num)) ~= 0 and 30 or 29
    end
    nLDay=i
 
    -- 生成农历天干、地支、属相 ==> nongLi --

    local nLYear0=tostring(nLYear)
    local nLYear1
    nLYear1=nLYear0:gsub("%d",{
    ["1"]="一",
    ["2"]="二",
    ["3"]="三",
    ["4"]="四",
    ["5"]="五",
    ["6"]="六",
    ["7"]="七",
    ["8"]="八",
    ["9"]="九",
    ["0"]="〇",
    })

    local shuXing = nLShuXing[(((nLYear - 4) % 60) % 12) + 1]
    local nongLi1 = nLTianGan[(((nLYear - 4) % 60) % 10)+1] .. nLDiZhi[(((nLYear - 4) % 60) % 12) + 1] .. '年'
    local nongLi2 =nLYear1  .. '年'
    local nongLi3 = nLTianGan[(((nLYear - 4) % 60) % 10)+1] .. nLDiZhi[(((nLYear - 4) % 60) % 12) + 1] .. '(' .. shuXing .. ')年'
    local nongLi4 = shuXing .. '(' .. nLTianGan[(((nLYear - 4) % 60) % 10)+1] .. nLDiZhi[(((nLYear - 4) % 60) % 12) + 1] .. ')年'
    local nLDate1,nLDate2,nLDate3,nLDate4
    -- 生成农历月、日 ==> nLDate --
    if nLMonth < 1 then
        nLDate1 =  "闰" .. nLMonName[(-1 * nLMonth) + 1]
        nLDate2 =  "闰" .. nLMonName[(-1 * nLMonth) + 1]
        nLDate3 =  "闰" .. nLMonName[(-1 * nLMonth) + 1]
        nLDate4 =  "闰" .. nLMonName[(-1 * nLMonth) + 1]
    else
        nLDate1 = nLMonName[nLMonth+1]
        nLDate2 = nLMonName[nLMonth+1]
        nLDate3 = nLMonName[nLMonth+1]
        nLDate4 = nLMonName[nLMonth+1]
    end
 
    nLDate1 =  nongLi1..nLDate1 .. "月" .. nLDayName[nLDay+1]
    nLDate2 =  nongLi2..nLDate2 .. "月" .. nLDayName[nLDay+1]
    nLDate3 =  nongLi3..nLDate3 .. "月" .. nLDayName[nLDay+1]
    nLDate4 =  nongLi4..nLDate4 .. "月" .. nLDayName[nLDay+1]
    return nLYear,nLMonth,nLDay,nLDate1,nLDate2,nLDate3,nLDate4
end
 
-- 公历闰年
function GregorianIsLeapYear(year)
    if year%4 ~= 0 then
        return 0
    end
    if year%100 ~= 0 then
        return  1
    end
    if year%400 == 0 then
        return 1
    end
    return 0
end
 
function GetYearInfo(lunarYear,index)
    if lunarYear < 1901 or lunarYear > 2100 then
        return
    end
    lunarYear=lunarYear+1
    index=index+1
    return DateLunarInfo[lunarYear- 1901][index]
end

-------------------------------------------------

date_y=os.date("%Y") --取年
date_y= tonumber(date_y)
date_m=os.date("%m") --取月
date_m= tonumber(date_m)
date_d=os.date("%d") --取日
date_d= tonumber(date_d)

nLYear,nLMonth,nLDay,nLDate1,nLDate2,nLDate3,nLDate4 =GregorianToLunar(date_y,date_m,date_d)

date7=nLDate1
date8=nLDate2
date9=nLYear.."年"..nLMonth.."月"..nLDay.."日"
date10=nLDate3
date11=nLDate4
-------------------------------------------------

-- 农历
local function translator(input, seg)
   if (input == "lunar") then
      yield(Candidate("date", seg.start, seg._end, date7, " "))
      yield(Candidate("date", seg.start, seg._end, date8, " "))
      yield(Candidate("date", seg.start, seg._end, date9, " "))
      yield(Candidate("date", seg.start, seg._end, date10, " "))
      yield(Candidate("date", seg.start, seg._end, date11, " "))
   end
end

return translator

rime.lua 中定义函数,配置调用 lua/lunar.lua 脚本

lunar_translator = require("lunar")

.custom.yaml 文件中 engine/translators 下启用配置

# 函数调用
  'engine/translators':
    - lua_translator@lunar_translator

NUMBER 数字

将阿拉伯数字转换为大小写汉字

创建函数脚本 lua/number.lua

-- 翻译为大小写汉字    输入: `/` + 阿拉伯数字 
-------------------------------------------------

local confs = {
      {
      comment = " 小写",
      number = { [0] = "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" },
      suffix = { [0] = "", "十", "百", "千" },
      suffix2 = { [0] = "", "万", "亿", "万亿", "亿亿" }
   },
      {
      comment = " 序号",
      number = { [0] ="⑩", "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨" },
      suffix = { [0] = "", "拾", "佰", "仟" },
      suffix2 = { [0] = "", "万", "亿", "万亿", "亿亿" }
   },
      {
      comment = " 序号",
      number = { [0] ="⓾", "⓵", "⓶", "⓷", "⓸", "⓹", "⓺", "⓻", "⓼", "⓽" },
      suffix = { [0] = "", "拾", "佰", "仟" },
      suffix2 = { [0] = "", "万", "亿", "万亿", "亿亿" }
   },
   {
      comment = " 大写",
      number = { [0] = "〇", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" },
      suffix = { [0] = "", "拾", "佰", "仟" },
      suffix2 = { [0] = "", "万", "亿", "万亿", "亿亿" }
   },


   {
      comment = " 小寫",
      number = { [0] = "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" },
      suffix = { [0] = "", "十", "百", "千" },
      suffix2 = { [0] = "", "萬", "億", "萬億", "億億" }
   },
   {
      comment = " 大寫",
      number = { [0] = "零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖" },
      suffix = { [0] = "", "拾", "佰", "仟" },
      suffix2 = { [0] = "", "萬", "億", "萬億", "億億" }
   },

}

local function read_seg(conf, n)
   local s = ""
   local i = 0
   local zf = true

   while string.len(n) > 0 do
      local d = tonumber(string.sub(n, -1, -1))
      if d ~= 0 then
	 s = conf.number[d] .. conf.suffix[i] .. s
	 zf = false
      else
	 if not zf then
	    s = conf.number[0] .. s
	 end
	 zf = true
      end
      i = i + 1
      n = string.sub(n, 1, -2)
   end

   return i < 4, s
end

local function read_number(conf, n)
   local s = ""
   local i = 0
   local zf = false

   n = string.gsub(n, "^0+", "")

   if n == "" then
      return conf.number[0]
   end

   while string.len(n) > 0 do
      local zf2, r = read_seg(conf, string.sub(n, -4, -1))
      if r ~= "" then
	 if zf and s ~= "" then
	    s = r .. conf.suffix2[i] .. conf.number[0] .. s
	 else
	    s = r .. conf.suffix2[i] .. s
	 end
      end
      zf = zf2
      i = i + 1
      n = string.sub(n, 1, -5)
   end
   return s
end

local function translator(input, seg)
   if string.sub(input, 1, 1) == "/" then
      local n = string.sub(input, 2)
      if tonumber(n) ~= nil then
	 for _, conf in ipairs(confs) do
	    local r = read_number(conf, n)
	    yield(Candidate("number", seg.start, seg._end, r, ""))
--	    yield(Candidate("number", seg.start, seg._end, r, conf.comment))
	 end
      end
   end
end

return translator

rime.lua 中定义函数,配置调用 lua/number.lua 脚本

number_translator = require("number")

.custom.yaml 文件中 engine/translators 下启用配置

# 函数调用
  'engine/translators':
    - lua_translator@number_translator

重排序

创建函数脚本 lua/single_char.lua

-- single_char_filter: 将候选项重排序,使单字优先

local function filter(input)
   local l = {}
   for cand in input:iter() do
      if (utf8.len(cand.text) == 1) then
	 yield(cand)
      else
	 table.insert(l, cand)
      end
   end
   for i, cand in ipairs(l) do
      yield(cand)
   end
end

return filter

rime.lua 中定义函数,配置调用 lua/single_char.lua 脚本

-- single_char_filter: 候选项重排序,使单字优先
single_char_filter = require("single_char")

注意事项