Rime输入法配置
Rime 配置文件
RIME输入法的定制就是通过编辑配置文件实现需要的功能,配置文件是yaml格式的文件,该文件均采用UTF-8 编码的YAML文本,这是以一种可读性高的数据描述语言—— YAML 写成。想了解YAML文档格式请访问The Official YAML Web Site。
不同平台的输入法
- 【中州韻】 ibus-rime → Linux
- 【小狼毫】 Weasel → Windows
- 【鼠鬚管】 Squirrel → Mac OS X
用户配置文件夹
# ~/.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
文件作用
default.yaml
: 全局配置weasel.yaml
: 小狼毫发行版的设定,配置主题方案<方案标识>.schema.yaml
: 输入方案配置installation.yaml
: 安装信息,输入法程序在首次运行及升级后写入安装、升级时间、程序版本等user.yaml
: 用户状态信息,包括选取的输入方案、输入法选项状态如「中/西」「简/繁」等<词库名>.dict.yaml
: 词库<词典名>.txt
: 文本格式的词典,如预设词汇表、用户自定义词组等opencc/*
: OpenCC 字形转换配置及字典文件build/*
: 存放在部署过程中将配置、词库等编译为二进制格式的文件,提高运行效率trash/*
: 失效的文件,Rime 升级时不再使用的旧文件会自动移入这个文件夹,确认不再需要后可以删除
编译输入方案所产生的二进制文件
<方案标识>.prism.bin
: Rime 棱镜<词典名>.table.bin
: Rime 固态词典<词典名>.reverse.bin
: Rime 反查词典
记录用户写作习惯的文件
<方案标识>.userdb/
: 保存用户的输入习惯的用户词典
<词典名>.userdb.kct
: 用户词典<词典名>.userdb.txt
、<词典名>.userdb.kct.snapshot
: 用户词典快照
用户自己设定的
default.custom.yaml
: 用户对全局设定的定制信息<方案标识>.custom.yaml
: 用户对预设输入方案的定制信息,<配置代號>.custom.yaml
应用于配置文件<配置代号>.schema.yaml
或<配置代号>.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 # 序号颜色
主题配置颜色如下
定制方案
patch: # 定义一组补丁,以源文件中的设定为底本,写入新的设定项、或以新的设定值取代旧有的值
"一级设定项/二级设定项/三级设定项": 新的设定值
"另一个设定项": 新的设定值
"再一个设定项": 新的设定值
"含列表的设定项/@n": 列表第n个元素新的设定值,从0开始计数
"含列表的设定项/@last": 列表最后一个元素新的设定值
"含列表的设定项/@before 0": 在列表第一个元素之前插入新的设定值(不建议在补靪中使用)
"含列表的设定项/@after last": 在列表最后一个元素之后插入新的设定值(不建议在补靪中使用)
"含列表的设定项/@next": 在列表最后一个元素之后插入新的设定值(不建议在补靪中使用)
"含列表的设定项/+": 与列表合并的设定值(必须为列表)
"含字典的设定项/+": 与字典合并的设定值(必须为字典,注意YAML字典的无序性)
词库
基础
词库文件格式
在用户配置文件夹下,.dict.yaml
结尾的文件。
调用规则
Rime 可以扩充很多词库,为了防止卡顿通过递归调用对方式调取词库内容,定义一个总的词库,总词库的名称格式也为 *.dict.yaml
(如: myDict.dict.yaml
),假设扩充词库有 A.dict.yaml
,B.dict.yaml
,C.dict.yaml
,D.dict.yaml
,E.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 转换简体和繁体字。
搜狗合QQ输入法的词库
- 搜狗输入法词库: https://pinyin.sogou.com/dict/
- QQ输入法词库 : http://cdict.qq.pinyin.cn/v1/
搜狗的词库文件为 .scel
, QQ 的词库文件为 .qpyd
,需要使用深蓝词库转换工具将其转换为 Rime 能使用对 yaml
词库
新建 .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 函数可实现一些使用功能
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")
注意事项
- rime 配置文件尽量用
'
而避免使用"
,防止识别错导致配置不成功 '
和"
在作为字符自定义时互换包裹即可