rime 输入法自定义配置教程
文章目录
安装
首先,从Debian8(Debian Jessie)开始,官方apt源内就已经有ibus-rime
的软件包;所以,我们这里直接进行安装即可:
sudo apt install ibus-rime
安装好以后,注销用户并重新登录(你也可以选择重启设备);之后,就可以在设置内激活我们的ibus-rime
了:
到此,rime就安装完成了:
它的配置文件地址为: ~/.config/ibus/rime/
自定义配置
基础配置
打开我们的Rime,使用过程中。你会发现,它应该是这样的:
初始状态
乍一看,有一些问题: - 样式复古,有点像以前上世界的界面? - 没有词库,操作一般
为了进一步现代化。我们这里对其进行配置。
默认情况下的配置文件(配置文件存放在配置目录下;如果不存在,可以手动创建):
文件 | 注释 |
---|---|
default.custom.yaml | 核心配置、全局配置 |
squirrel.custom.yaml / weasel.custom.yaml / ibus_rime.yaml | 平台相关配置。样式皮肤,不同软件默认输入法状态等。 |
<方案标识>.custom.yaml | 输入方案的定制配置 |
<名称>.dict.yaml | 词典 |
custom_phrase.txt | 自定义短语 |
Windows上创建全局配置文件
优先级上:
输入方案的定制配置 > 核心配置、全局配置 > 系统自带的default.yaml
举个例子,你使用明月拼音
,那么输入方案的定制配置就是:lua_pinyin.custom.yaml
部署编译
首先,Rime是如何运用个性化配置呢?很简单,用户在修改配置目录内的文件,这个只是临时修改,而真正要生效,就需要Rime重新进行部署操作。
在执行部署操作后,Rime会进行编译,将用户的自定义内容(包括词典),编译到配置目录内的build
文件夹内。
部署编译,基本上三大系统是一样的:
macOS上的重新部署
Linux上的重新部署
Windows上的重新部署
需要注意,Windows上,选择方案,可以可视化操作部分default.custom.yaml
选项。右键小狼毫图标就可以选择了:
Windows上的选择
方案选择
在学习配置前。我们看看如何选择方案。
我们可以使用热键进行方案切换,热键默认是Ctrl + ~
或F4
:
macOS上的方案选择
Windows上的方案选择
其中F4
比较容易冲突,那么可以进行修改. 直接配置default.custom.yaml
里的hotkeys
"switcher/hotkeys":
- "Control+grave"
而可以激活的方案,一是default.custom.yaml
里的schema_list
比如上图内,macOS的配置:
schema_list:
- {schema: terra_pinyin}
- {schema: luna_pinyin_simp}
还有一部分,就是输入法的配置文件,比如:
switches:
- name: ascii_mode
reset: 0
states: [ 中文, 英文 ]
- name: emoji_suggestion
reset: 0
states: [ " ️"," ️"]
- name: full_shape
states: [ 半角, 全角 ]
- name: simplification
reset: 1
states: [ 繁体, 简体 ]
- name: ascii_punct
states: [ 。,, ., ]
如果你需要更改上述文件,记得更改之后,重新部署。
样式文件
样式上面,我们需要进入rime的配置文件地址内。上文其实已经提及,需要注意的是,Windows用户可以直接右键打开:
Windows直接打开配置文件夹
macOS其实也一样可以:
macOS直接打开配置文件夹
Linux可能还是要比较辛苦一下,直接编辑~/.config/ibus/rime
内的文件。
而配置样式,就是配置配置文件目录下的样式配置文件即可。不过,发行版本的rime,样式配置文件是不一样的:
- 鼠鬚管 Squirrel: 配置文件夹下
squirrel.custom.yaml
文件; - 小狼毫 Weasel: 配置文件夹下
weasel.custom.yaml
文件; - ibus-rime: 配置文件夹下
ibus_rime.yaml
文件。
为什么文件里都带个
custom
呢?实际上,带custom
的配置文件,会在rime重新编译部署后,替换系统自带的不带custom
的配置文件内容,如:squirrel.custom.yaml
替换squirrel.yaml
。
横排显示
首先我们看看如何横排显示。squirrel.custom.yaml
和weasel.custom.yaml
只需要添加
patch
"style/horizontal": true # 横向展示
需要注意,这里使用的是
Yaml
格式,根节点是patch
,标记为追加内容;style
为一级节点,horizontal
为二级节点。
另外,需要注意;Rime的缩进敏感。在没设置好编辑器缩进情况下,不建议用Tab
键直接进行缩进。(比如:Vscode的缩进,Tab
有时候是四个空格,有时候为两个。)
比如:Windows上编辑weasel.custom.yaml
文件:
编辑weasel文件
之后的效果:
横向显示
而Linux上的ibus_rime.yaml
文件,因为系统本身并没有ibus_rime.yaml
与之对应。所以就不用加上custom
;在文件内,也不需要加上patch
根节点:
style:
horizontal: true # 横向展示
网上有小伙伴说,直接建立
ibus_rime.custom.yaml
并在其中加上根节点patch
也会覆盖。但是我这个版本并没有用……
编辑
之后,重新部署。一般就可以看到效果了:
重新部署
重新部署后,build
内就会有新的配置文件被创建了:
创建的文件
横向显示
配色样式
当然,我们还可以设置Rime的输入法配色。不过需要注意:Linux上受限于ibus框架,所以Linux上的ibus-rime无法更改配色;但是,如果你Linux可以更改ibus的配色,那么可以尝试更改ibus框架样式,比如: ibus Tweaker
以下介绍小狼毫和鼠须管如何配置。
打开配置文件(squirrel.custom.yaml
/weasel.custom.yaml
),在patch
节点下增加内容:
"preset_color_schemes/MyStyleMi":
name: MyStyleMi
author: Mintimate <"Mintimate's Blog">
text_color: 0x6495ed #拼音串
candidate_text_color: 0x424242 # 非第一候选项
back_color: 0xefefef # 背景
border_color: 0xefefef # 边框
hilited_text_color: 0xed9564 # 拼音串高亮
hilited_back_color: 0xefefef # 拼音串高亮背景
hilited_candidate_back_color: 0xed9564 # 第一候选项背景
hilited_candidate_text_color: 0xefefef # 第一候选项
hilited_comment_text_color: 0xefefef # 注解文字高亮
comment_text_color: 0xcac9c8 # 注解文字
label_color: 0xcac9c8 # 预选栏编号颜色
其中,颜色部分,使用16进制进行表示;和#
开头的16进制比,如果颜色为#ed9564
,那么转为0x
开头就是ed和64互换:0x6495ed
。
添加"style/color_scheme"
选项(macOS还可以设置"style/color_scheme_dark"
用于暗色模式)激活:
"style/color_scheme": MyStyleMi
# macOS下暗色模式(MyStyleMiDark需要另外配置)
"style/color_scheme_dark": MyStyleMiDark
同时,可以设置候选词的大小、窗口半径等等:
"us_keyboard_layout": true
"style/display_tray_icon": true
"style/font_face": "PingFang"
"style/font_point": 16
"style/label_font_point": 12 # 候选词数字大小
"style/horizontal": true # 横向展示
"style/inline_preedit": false # 内嵌预编辑
"style/corner_radius": 15 # 窗口圆角半径
"style/layout/border": 0 # 窗口边界高度,大于圆角半径才有效果
"style/layout/border_width": 0 # 窗口边界宽度,大于圆角半径才有效果
"style/layout/candidate_spacing": 12
"style/layout/hilite_padding": 8
"style/layout/hilite_spacing": 3
"style/layout/margin_x": 8
"style/layout/margin_y": 8
"style/layout/round_corner": 7
"style/layout/spacing": 10
之后,重新部署。即可看到效果:
macOS上暗色效果
Windows上亮色效果
输入配置
接下来,我们看看输入的基础配置。比如:候选词有几个、激活什么组件等。
首先是候选词,这次可不再是squirrel.custom.yaml
/weasel.custom.yaml
/ibus_rime.yaml
了。它们是样式的。这次我们配置输入的。
以全局输入配置为例,我们在patch
节点下添加:
"menu/page_size": 9 # 候选词个数
之后,重新部署即可看到效果:
效果
与此同时,rime默认切换输入法是``Shift`,原因是默认配置是这样的:
patch:
ascii_composer/good_old_caps_lock: true
ascii_composer/switch_key:
Caps_Lock: commit_code
Control_L: noop
Control_R: noop
Shift_L: commit_code
Shift_R: commit_code
解释一下:
选项 | 注释 |
---|---|
commit_text | 提交候选区的文字,然后切换到英文模式。 |
commit_code | 提交已输入的编码(拼音字母),然后切换到英文模式。 |
inline_ascii | 仅样式配置内存在 inline_preedit=true 时有效。在输入法的编辑区临时切换到英文,提交后恢复中文。 |
noop | 不执行任何操作。 |
clear | 清除已输入的编码,然后切换到英文模式。 |
你也可以自己设置,比如我设置的:
patch
"ascii_composer/good_old_caps_lock": true
"ascii_composer/switch_key":
Caps_Lock: commit_code
Control_L: noop # 不做任何操作
Control_R: noop # 不做任何操作
Shift_L: commit_code
Shift_R: inline_ascii
所以,我的配置就是这样的:
追加配置效果
到此,基础配置完毕。以上部分出现的一些配置没讲解,将在后文拆解(当然,不可能拆解透彻,建议多配合官方文档:https://github.com/rime/home/wiki)
进阶配置
接下来,我们看看进阶部分的配置。本章节默认大家已经入门rime了,部分步骤不再详细演示。
字典配置
我们的输入法,还没有完全“认识”我们。不知道我们先输入什么词汇?
所以,我们需要给他词汇表,让它背下来~
引入词汇,首先是在default.custom.yaml
引入配置:
# 开启用户词典功能
"translator/enable_user_dict": true
之后,创建当前输入法的定制文件。比如我使用的是明月拼音-简s s化字
,所以创建:luna_pinyin_simp.custom.yaml
。
在其中添加内容:
# encoding: utf-8
patch:
'translator/dictionary': custom_dict.all
其中: - custom_dict.all
: 为字典总表文件。对应就是配置文件目录内custom_dict.all.dict.yaml
。这个可以直接自定义。
接下来,我们再创建它,并添加内容:
---
name: custom_dict.all ##注意name和文件名一致
version: "2020.6.7"
sort: by_weight
use_preset_vocabulary: true
# 此处为 输入法所用到的词库,既补充拓展词库的地方
import_tables:
- luna_pinyin # 系统基础字库
- dicts/luna_pinyin.chaizi # 拆字词库
- dicts/custom_simple # 自定义
- dicts/luna_pinyin.sougou # 搜狗词库
- dicts/luna_pinyin.xiandaihanyu # 现代汉语词典
- dicts/se_words # 互联网网络词汇
- dicts/luna_pinyin.biaoqing # 表情
- dicts/luna_pinyin.emoji # emoji Ext
...
import_tables
下,除了luna_pinyin
文件,都在dicts
对应配置文件目录dicts
(也是自己创建),举个例子:dicts/luna_pinyin.chaizi
就对应配置文件夹dicts/luna_pinyin.chaizi.dict.yaml
比如我的:
我的目录结构
至于词库字典内容,就需要你直接添加到dicts
文件,并追加到custom_dict.all.dict.yaml
文件内了。相当于custom_dict.all.dict.yaml
文件是总管,输入法的定制文件考虑是否要启动这个班组。
字典获取
我们的字典文件应该是长这样:
搜狗字典
其中,表头为解析声明。name
需要与文件截取掉.dict.yaml
后一样,否则无法扫描到:
---
name: luna_pinyin.sougou
version: "2023.01.08"
sort: by_weight
use_preset_vocabulary: true
...
而下面文件就是txt
的文本格式了。获取可以使用:
颜文字
借助上述的字典操作,我们可以扩展出颜文字。绑定键盘vv
键,呼出颜文字:
效果
参考至rime-settings获得的颜文字字典:
输入符号
如何输入符号呢?比如这样的:
箭头效果
亦或者这样:
注音效果
在或者这样的:
数字效果
其实,也是十分简单。我们只需添加symbol选项即可(反查),在输入法的选项内,添加:
patch:
punctuator/import_preset: symbols
recognizer/patterns/punct: '^/([0-9]0?|[A-Za-z]+)$'
具体支持的内容,可以查看:
模糊拼音
哈哈,有时候经常分不清翘舌。所以总是需要模糊拼音一下。其实添加的方法,官方也写的很详细: - 官方方案教程
简单来说,就是打开输入法的.custom.yaml
文件,在patch
根节点下,添加'speller/algebra'
节点。
比如:
'speller/algebra':
- erase/^xx$/
- derive/^([zcs])h/$1/ # zh, ch, sh => z, c, s
- derive/^([zcs])([^h])/$1h$2/ # z, c, s => zh, ch, sh
- derive/([aei])n$/$1ng/ # en => eng, in => ing
- derive/([aei])ng$/$1n/ # eng => en, ing => in
- derive/([iu])an$/$lang/ # ian => iang, uan => uang
- derive/([iu])ang$/$lan/ # iang => ian, uang => uan
- derive/([aeiou])ng$/$1gn/ # dagn => dang
- derive/([dtngkhrzcs])o(u|ng)$/$1o/ # zho => zhong|zhou
- derive/ong$/on/ # zhonguo => zhong guo
- derive/ao$/oa/ # hoa => hao
- derive/([iu])a(o|ng?)$/a$1$2/ # tain => tian
- abbrev/^([a-z]).+$/$1/ #简拼(首字母)
- abbrev/^([zcs]h).+$/$1/ #简拼(zh, ch, sh)
模糊拼音配置
需要注意,简拼
配置,一定要在最后。否则会出现意想不到的效果哦,<( ̄︶ ̄)↗
# 这两个要在最后
- abbrev/^([a-z]).+$/$1/ #简拼(首字母)
- abbrev/^([zcs]h).+$/$1/ #简拼(zh, ch, sh)
高级配置
本章节更进一步,谈谈Rime的高级配置。
时间组件
时间组件,其实就是用Lua
的脚本。如果之前有看过我Lvim的教程的小伙伴,应该会比较熟悉。
Rime也是支持Lua的脚本插件。最终实现的效果:
time效果
date效果
rime的Lua的适配,可以参考:
这里直接说一下现成的使用,首先是在配置目录内创建rime.lua
文件,类似与我们之前创建的custom_dict.all.dict.yaml
。并在其中写入:
time_translator = require("time")
date_translator = require("date")
紧接着,我们创建在配置文件目录创建Lua
文件夹,并在其中创建与上文对应的time.lua
和date.lua
文件:
创建文件夹与文件
date.lua
写入信息:
--lua语言中的注释用“--”
local function translator(input, seg)
if (input == "date") then
------------------------------------------------------------------------------------
--普通日期1,类似2022年01月02日
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,类似2022年1月1日
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,类似1月1日
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
time.lua
写入信息:
--lua语言中的注释用“--”
local function translator(input, seg)
if (input == "time") then --关键字更改,你也可以用or语句定义多个关键字
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
最后,在配置文件内。激活插件:
engine/translators:
- lua_translator@date_translator
- lua_translator@time_translator
激活插件
Emoji
Emoji之前是挺麻烦的。现在官方出来Emoji opencc,就简单很多了。
参考:https://github.com/rime/rime-emoji
首先是下载其中的opencc
文件到本地配置文件夹目录内:
下载Opencc
之后,我们对单个输入发进行配置:
patch:
# 设置切换
switches:
- name: ascii_mode
reset: 0
states: [ 中文, 英文 ]
- name: emoji_suggestion
reset: 0
states: [ " ️"," ️"]
- name: full_shape
states: [ 半角, 全角 ]
- name: simplification
reset: 1
states: [ 繁体, 简体 ]
- name: ascii_punct
states: [ 。,, ., ]
# 激活设置
engine/filters:
- simplifier@emoji_suggestion
- simplifier@zh_simp # 简体过滤
- simplifier # 简体
- uniquifier # rime基础驱动
# 定义
emoji_suggestion:
opencc_config: emoji.json
option_name: emoji_suggestion
英文输入的支持
用明月拼音,你会发现?怎么无法中英输入?
其实,是可以通过补丁的方式,支持我们的英文单词输入。参考:
我们需要做的,是把easy-en
作为明月输入发的扩展,扩展到明月拼音等输入法内。
只需要将easy_en.schema.yaml
、easy_en.dict.yaml
、easy_en.yaml
和lua/easy_en.lua
复制到 rime 配置目录。
最后,在输入法的配置项内激活即可,比如:明月拼音-简化版
(luna_pinyin_simp.custom.yaml):
patch:
__include: easy_en:/patch
某些特殊方案需要指定方案名称,如微软双拼:
patch:
__include: easy_en:/patch_double_pinyin_mspy
最后,重新部署,即可看到效果:
最终效果
最终效果Mirror
定制组件
其实,你还可以基于模版,开发自己的输入法模版样式。
当然,定制前…… 可以看看官方自带的是怎么写的:
在配置目录内创建一个名字以.schema.yaml
结尾的配置文件。之后,在其中按照官方的模版配置即可。其中的内容包括: - 方案定义、描述 - 引擎(输入法的核心,用什么引擎去书写,比如控制是空格选定还是分隔等)
其中的描述部分:
schema:
schema_id: luna_pinyin
name: 明月拼音-定制版
version: "9.0"
author:
- Mintimate <mintimate215@gmail.com>
description: |
基于Rime预设的拼音方案。
之后的引擎参考:
engine: # 输入引擎设定,即挂接组件的“处方”
processors: # 一、这批组件处理各类按键消息
- ascii_composer # ※ 处理西文模式及中西文切换
- recognizer # ※ 与 matcher 搭配,处理符合特定规则的输入码,如网址、反查等
- key_binder # ※ 在特定条件下将按键绑定到其他按键,如重定义逗号、句号爲候选翻页键
- speller # ※ 拼写处理器,接受字符按键,编辑输入码
- punctuator # ※ 句读处理器,将单个字符按键直接映射爲文字符号
- selector # ※ 选字处理器,处理数字选字键、上、下候选定位、换页键
- navigator # ※ 处理输入栏内的光标移动键
- express_editor # ※ 编辑器,处理空格、回车上屏、回退键等
segmentors: # 二、这批组件识别不同内容类型,将输入码分段
- ascii_segmentor # ※ 标识西文段落
- matcher # ※ 标识符合特定规则的段落,如网址、反查等
- abc_segmentor # ※ 标识常规的文字段落
- punct_segmentor # ※ 标识句读段落
- fallback_segmentor # ※ 标识其他未标识段落
translators: # 三、这批组件翻译特定类型的编码段爲一组候选文字
- echo_translator # ※ 没有其他候选字时,回显输入码
- punct_translator # ※ 转换标点符号
- script_translator # ※ 脚本翻译器,用于拼音等基于音节表的输入方案
- reverse_lookup_translator # ※ 反查翻译器,用另一种编码方案查码
filters: # 四、这批组件过滤翻译的结果
- simplifier # ※ 繁简转换
- uniquifier # ※ 过滤重複的候选字,有可能来自繁简转换
具体定制,可以参考官方的Demo:
我的配置
or # ※ 编辑器,处理空格、回车上屏、回退键等
segmentors: # 二、这批组件识别不同内容类型,将输入码分段
- ascii_segmentor # ※ 标识西文段落
- matcher # ※ 标识符合特定规则的段落,如网址、反查等
- abc_segmentor # ※ 标识常规的文字段落
- punct_segmentor # ※ 标识句读段落
- fallback_segmentor # ※ 标识其他未标识段落
translators: # 三、这批组件翻译特定类型的编码段爲一组候选文字
- echo_translator # ※ 没有其他候选字时,回显输入码
- punct_translator # ※ 转换标点符号
- script_translator # ※ 脚本翻译器,用于拼音等基于音节表的输入方案
- reverse_lookup_translator # ※ 反查翻译器,用另一种编码方案查码
filters: # 四、这批组件过滤翻译的结果
- simplifier # ※ 繁简转换
- uniquifier # ※ 过滤重複的候选字,有可能来自繁简转换
具体定制,可以参考官方的Demo:
- [https://github.com/rime/home/wi](https://link.zhihu.com/?target=https%3A//github.com/rime/home/wiki/RimeWithSchemata%23rime-with-schemata)
### 我的配置
[Ding-yixia/oh-my-rime: The Simple Config Template Of Rime By Mintimate. QQ Chat-Group: 703260572 (github.com)](https://github.com/Ding-yixia/oh-my-rime)