trime.yaml詳解

xiaoqun edited this page Apr 23, 2018 · 42 revisions

(基于同文V3.01 20180404版修订)

必知必会

您可能需要先了解 YAML 的基本语法。这篇定制指南里有一些实例可以帮助您理解 Rime 的配置方式。另外 Rime 在 YAML 语法的基础上新增了编译指令,想要更灵活地制作同文主题的同学可以参考一下。

一、style

界面样式及特色功能

1. 功能

  • auto_caps: 自动句首大写(true:打开;false:关闭;ascii:仅英文模式句首大写)
  • candidate_use_cursor: 候选焦点高亮(true:打开;false:关闭)
  • comment_on_top: 候选项注释在上方或右侧 (true:在上方;false:在右侧)
  • horizontal: 水平模式。改变方向键的功能 (true:方向键适配横排候选;false:方向键适配竖排候选)
  • keyboards: 键盘配置。除主键盘外,其它需要用到的键盘都要在这里声明。
  • proximity_correction: 将按键之间的空白区域分配给相邻的按键,避免空按(true:打开;false:关闭)
  • reset_ascii_mode: 不同进程中显示键盘时重置为中文状态(true:重置为中文;false:记忆中英状态)
  • latin_locale: 在英文状态(ascii_mode)下,朗读按键时所用的语言。
  • locale: 在中文状态下,朗读上屏文本和按键时所用的语言。
    ※ 需要先在同文设置界面开启朗读功能。朗读功能还需要手机的TTS引擎支持。可使用系统默认引擎,也可安装讯飞语记等第三方引擎。latin_locallocal可以设置的语言也取决于 TTS 引擎。常见的语言:zh_TW, zh_CN, zh_HK, en_US, ja_JP, ko_KR,……
  • speech_opencc_config: 语音输入简繁转换(默认值s2t.json: 将语音识别的结果转换成繁体再上屏)
    需要配合OpenCC组件来使用。转换的选项有:
    • s2t.json #简体→繁体
    • t2s.json #繁体→简体
    • s2hk.json #简体→香港繁体
    • hk2s.json #香港繁体→简体
    • s2tw.json #简体→台湾繁体
    • s2twp.json #简体→台湾繁体,并转换常用词汇(网络→網路)
    • tw2s.json #台湾繁体→简体
    • tw2sp.json #台湾繁体→简体,并转换常用词汇(作業系統→操作系统)
    • t2hk.json #OpenCC标准繁体→香港繁体
    • t2tw.json #OpenCC标准繁体→台湾繁体
    • 如果不需要转换,想让语音引擎按原样输出,可设为none。(2017-9-13开始,也可以直接注释掉)
      ⚠ 同文输入法的语音输入依赖的是手机的「语音识别服务」,而且必须安装「讯飞语记」或者「讯飞语音+」才能使用。

示例:开启英文模式句首自动大写

# trime.custom.yaml  
patch:  
  "style/auto_caps": ascii  

示例:在预设26键键盘上添加语音输入键

# trime.custom.yaml  
patch:
  "preset_keyboards/qwerty/keys/@31/click": VOICE_ASSIST  #将原来的符号键替换为语音键

※ 对于默认主题trime.yaml,修改的时候需要打补丁。对于自制的主题,一般不需要打补丁。
上例若直接修改主题文件,是这样做的:
查找按键布局qwerty
将按键{click: Keyboard_symbols, long_click: Keyboard_number} 修改成{click: VOICE_ASSIST, long_click: Keyboard_number}

2. 字体

字体分布图
  • text_font: 编码字体
  • label_font: 悬浮窗候选项序号字体
  • candidate_font: 候选字体
  • comment_font: 候选注释字体
  • hanb_font: 后备字体。用于补充候选字体(candidate_font)。
    ※ 某些特殊符号,或者很多生僻字(比如Unicode Ext-B~Ext-F的字符)在大多数手机上通常都会显示成方框或空白。hanb_font可以使这些字符在同文输入法里正常显示(推荐使用花园明朝B字体:HanaMinB.ttf)。您也可以直接在系统中设置fallback字体(全局生效,但需要root)。
  • latin_font: 候选及候选注释拉丁字体(暂时对悬浮窗候选无效)
    ※ 当latin_font生效时,拉丁字符(< 0x2e80)就不再由comment_fontcandidate_font控制
  • key_font: 按键字体(click)
  • symbol_font: 符号字体(long_click和hint)
  • preview_font: 按键气泡字体

3. 尺寸

  • text_size: 编码大小
  • label_text_size: 悬浮窗候选项序号大小
  • candidate_padding: 候选项内边距(影响候选项的间距)
  • candidate_spacing: 候选分割线宽度
  • candidate_text_size: 候选字大小
  • candidate_view_height: 候选区高度
  • comment_text_size: 候选注释大小
  • comment_height: 候选注释区高度
  • key_height: 键高*
  • key_width: 键宽*,占屏幕宽的百分比
    ⚠ 当按键布局中的heightwidth省略不写时,此处设置的key_heightkey_width才会生效。
  • key_text_size: 按键文本大小(click)
  • key_long_text_size: 按键长文本大小(字数≥2)
  • symbol_text_size: 符号大小(long_click和hint)
  • round_corner: 按键圆角半径
  • preview_height: 按键气泡高度
  • preview_offset: 按键气泡纵向偏移(默认值-12,向下偏移为正,向上偏移为负)
  • preview_text_size: 按键气泡字体大小
  • shadow_radius: 键盘字体阴影大小(数值不宜过大,可能会造成卡顿)
  • horizontal_gap: 键水平间距
  • vertical_gap: 键盘行距
    ⚠ 若关闭了proximity_correction,过大的horizontal_gapvertical_gap会引起空按漏按
  • vertical_correction: 触摸位置校正(竖直方向)。
    ※ 为了提升打字手感,可将按键的实际触摸位置相对其显示位置上下偏移一点点(默认值-10,上偏为正,下偏为负,为0则不偏移)。

示例:更改字体

①在rime文件夹内新建fonts文件夹
⚠ fonts文件夹建在共享文件夹与用户文件夹皆可(若共享文件夹存在fonts,则字体放在用户文件夹内无效)

②将字体文件复制到fonts文件夹
 本例用到了两个字体文件:
  :page_facing_up: gunplay.ttf
  :page_facing_up: 方正行楷简体.ttf

③配置字体参数:

# trime.custom.yaml  
patch:  
  "style/candidate_font": 方正行楷简体.ttf #候选字体  
  "style/key_font": 方正行楷简体.ttf  #按键字体  
  "style/text_font": gunplay.ttf  #编码字体  
  "style/comment_font": gunplay.ttf #候选注释字体  
  "style/symbol_font": gunplay.ttf #符号字体  
  "style/candidate_text_size": 28  #候选字体大小  
  "style/candidate_view_height": 32 #候选区高度  
  "style/comment_height": 16 #候选注释区高度  
  "style/comment_text_size": 13 #候选注释字体大小  
  "style/key_text_size": 24 #按键字体大小  
  "style/round_corner": 0.0 #按键圆角大小  
  "style/symbol_text_size": 9 #符号字体大小  
#  "style/text_height": 24 #编码区高度(新版已经取消此参数)  
  "style/text_size": 18 #编码字体大小  

效果图:
更换字体效果图

示例:局部尺寸微调

style里的尺寸是全局生效的。实际上我们也可以对某些局部的尺寸做微调。

可以在键盘布局里微调的尺寸:
horizontal_gap: 键水平间距
vertical_gap: 键盘行距
round_corner: 按键圆角(对整个键盘生效)

可以在按键里微调的尺寸:
key_text_size: 按键文本(对长标签也生效,不区分按键文本的长短)
symbol_text_size: 符号(long_click和hint)
round_corner: 按键圆角(对单个按键生效)

另外,按键字符的偏移量也是可以局部微调的,详见后面 preset_keyboards。

例1:调整预设26键键盘布局的水平间距和圆角

# trime.custom.yaml  
patch:
  "preset_keyboards/qwerty/horizontal_gap": 0  #水平间距改为0
  "preset_keyboards/qwerty/round_corner": 0    #按键圆角改为0
  #以上更改仅对布局ID为qwerty的26键键盘生效

例2:单独修改预设26键键盘布局中的空格键

# trime.custom.yaml  
patch:
  "preset_keyboards/qwerty/keys/@33/key_text_size": 12  #空格键字体改小
  "preset_keyboards/qwerty/keys/@33/round_corner": 32  #圆角增大

※上例若直接修改主题文件,是这样写的:
{click: space, key_text_size: 12, round_corner: 32, width: 30}

4.悬浮窗口

  • layout: 悬浮窗口设置
    • position: 悬浮窗位置
      • left|right|left_up|right_up 这几种都可以让悬浮窗口动态跟随光标(需要≥Android5.0)
      • fixed|bottom_left|bottom_right|top_left|top_right 这几种是固定在屏幕的边角上
    • min_length: 悬浮窗最小词长(候选词长大于等于min_length才会进入悬浮窗)
    • max_length: 连续排列的多个候选项总字数(包括候选项注释)超过max_length时,把超出的候选项移到下一行显示(单个候选项若超长,或者max_length数值过大,则由max_width决定是否换行)
    • sticky_lines: 固顶行数(不与其它候选同排,单独一行显示的候选项个数)
    • max_entries: 最大词条数(允许进入悬浮窗的最大词条数)
    • all_phrases: 显示所有长词。所有满足min_length的词条都显示在悬浮窗(一般只用于table translator,有可能会改变候选项的显示顺序)
    • border: 边框宽度(增大边框则向内加粗,也会对悬浮窗圆角产生一点影响)
    • max_width: 窗口最大宽度(候选超长则自动换行)
    • min_width: 最小宽度(悬浮窗的初始宽度)
    • margin_x: 水平边距(左右留白大小)
    • margin_y: 竖直边距(上下留白大小)
    • line_spacing: 候选词的行间距(px)
    • line_spacing_multiplier: 候选词的行间距倍数
    • spacing: 悬浮窗位置上下偏移量(一般上移为正,下移为负,但当position设为top_xxx时,方向是相反的)
    • round_corner: 窗口圆角(同时也会使候选栏的高亮候选边框产生圆角)
    • alpha: 悬浮窗透明度*(0x00~0xff。0x00为全透明)
    • background: 悬浮窗背景*(颜色或图片二选一。比如颜色:0xFFD3FF83;图片:xxx.jpg。图片格式jpg与png皆可,相应的图片需放置在用户文件夹的backgrounds目录下,放在共享文件夹无效)
      ※ 当background设为颜色值时,alphabackground的透明度是叠加的
    • elevation: 悬浮窗阴影(≥Android5.0)
    • movable: 是否可移动窗口,或仅移动一次 true|false|once
  • window: #悬浮窗口组件
    • - {start: "", move: 'ㄓ ', end: ""}
      #窗口移动图标。当movable设为可移动时,拖动这个图标即可调整悬浮窗的位置。move可改为任意符号,start end为左右修饰符号,若不需要修饰可简化为{move: 'ㄓ '}
    • - {start: "", composition: "%s", end: "", letter_spacing: 0}
      #这个组件用来显示输入的编码。composition若去掉则不显示编码区。letter_spacing为字符间距,需要≥Android5.0。
    • - {start: "\n", label: "%s.", candidate: "%s", comment: " %s", end: "", sep: " "}
      #这个组件用来显示候选项。start: "\n"表示这个组件另起一行,label候选项序号,candidate候选项,comment候选项注释,sep候选项分隔符。(除candidate外,其它都是可选的。比如删掉label则不显示候选项序号)
    • #~~~~~~~~
      ※ 另外还可以在悬浮窗内放置普通按键,比如地球拼音的声调键:
    • - {start: "\n", click: ";", label: " ˉ ", align: center, end: " "}
      #click: ";" label: " ˉ "作用与键盘按键相同。align对齐方式,left左对齐|right右对齐|center居中,默认为左对齐可省略不写(align每行组件只需写一个,也可用于上面的编码与候选)
    • - {click: "/", label: " ˊ ", end: " "}
      #end: " "的作用是在按键间形成间隙
    • - {click: ",", label: " ˇ ", end: " "}
    • - {click: "\\", label: " ˋ "}

示例:自定义悬浮窗

配置几种在平板电脑上的悬浮窗样式:

  • 1、横排
# trime.custom.yaml  
patch:  
  "style/horizontal": true
  "style/layout/position": left
  "style/layout/min_length": 1
  "style/layout/max_length": 36
  "style/layout/max_entries": 5
  "style/layout/sticky_lines": 0
  "style/layout/max_width": 930
  "style/layout/margin_x": 0
  "style/layout/margin_y": 0
  "style/layout/border": 0
  "style/layout/round_corner": 3
  "style/layout/elevation": 8
  "style/layout/alpha": 0xff
  "style/layout/line_spacing_multiplier": 1
  "style/window":
    - {label: " %s. ", candidate: "%s "}

横排效果

  • 2、竖排
    把上面补丁的sticky_lines改成5,水平模式horizontal改成false
    竖排效果

  • 3、横竖混排
    只需要把上面补丁的sticky_lines改成1即可。
    混排效果

※ 以上示例中去掉了悬浮窗的composition组件,因此需要开启嵌入模式才能在文本框中显示编码。另外,开启悬浮窗后,也可以把底下多余的候选栏关掉(参考附录中的示例)。

5. 其它

备用参数,暂无功能

  • background_dim_amount
  • max_height
  • min_height

二、fallback_colors

后备颜色:配色方案中未定义的颜色,自动从这里推导。

candidate_text_color: text_color
comment_text_color: candidate_text_color
border_color: back_color
candidate_separator_color: border_color
hilited_text_color: text_color
hilited_back_color: back_color
hilited_candidate_text_color: hilited_text_color
hilited_candidate_back_color: hilited_back_color
hilited_comment_text_color: comment_text_color
text_back_color: back_color
hilited_key_back_color: hilited_candidate_back_color
hilited_key_text_color: hilited_candidate_text_color
hilited_key_symbol_color: hilited_comment_text_color
hilited_off_key_back_color: hilited_key_back_color
hilited_on_key_back_color: hilited_key_back_color
hilited_off_key_text_color: hilited_key_text_color
hilited_on_key_text_color: hilited_key_text_color
key_back_color: back_color
key_border_color: border_color
key_text_color: candidate_text_color
key_symbol_color: comment_text_color
keyboard_back_color: border_color
label_color: candidate_text_color
off_key_back_color: key_back_color
off_key_text_color: key_text_color
on_key_back_color: hilited_key_back_color
on_key_text_color: hilited_key_text_color
preview_back_color: key_back_color
preview_text_color: key_text_color
shadow_color: border_color

三、preset_color_schemes

预置的配色方案

颜色值

同文支持以下几种写法:

  • 0xaarrggbb
  • "#aarrggbb" (引号不能省略,否则会与注释冲突)
  • 0xrrggbb (省略了aa,表示完全不透明)
  • "#rrggbb" (同上)
  • 0xaa
  • redgreenblue……

其中aa透明度,rr红,gg绿, bb蓝,都是十六进制数值,取值范围00~ff。

配色方案

一个主题中可以有多个配色方案。

  • default: 配色方案ID,不可重复

    • name: 配色方案名称
    • author: 作者信息
      ▼悬浮窗口
    • border_color: 悬浮窗边框
    • label_color: 悬浮窗候选项序号
      ※ 悬浮窗高亮候选项序号与hilited_candidate_text_color相同
    • hilited_text_color: 高亮编码(一般是位于光标插入点左边的编码)
    • text_color: 编码(位于光标插入点右边的编码,或者是拼音类方案中无法正常解析的空码,比如全拼时输入hau,u就属于这种)
    • hilited_back_color: 高亮编码背景
      ※ 非高亮的编码背景与back_color相同
    • text_back_color: 编码区背景*(编码四周的空白区域,也是悬浮窗的主背景)
      ※ 仅当style/layout/background设置失效时才会起作用(当background生效时,text_back_color就会失效)
      ▼候选项
    • back_color: 候选区背景*
    • hilited_candidate_back_color: 高亮候选背景(候选项被选中时)
    • candidate_separator_color: 候选分割线
    • candidate_text_color: 候选文本(包括悬浮窗候选,下同)
    • hilited_candidate_text_color: 高亮候选文本
    • comment_text_color: 候选项注释
    • hilited_comment_text_color: 高亮候选项注释
      ▼键盘
    • key_back_color: 按键背景
    • hilited_key_back_color: 高亮按键背景(按下按键时)
    • key_text_color: 按键文本(click)
    • hilited_key_text_color: 高亮按键文本
    • key_symbol_color: 按键符号(long_click和hint)
    • hilited_key_symbol_color: 高亮按键符号
    • preview_back_color: 按键气泡背景
    • preview_text_color: 按键气泡文本
    • shadow_color: 按键文字阴影(阴影半径在shadow_radius中设定)
    • keyboard_back_color: 键盘背景
    • key_border_color: 按键边框*(暂无)
      ▼功能键(functional: true)
    • off_key_back_color: 功能键背景
    • hilited_off_key_back_color: 功能键高亮背景(按下时)
    • off_key_text_color: 功能键文本
    • hilited_off_key_text_color: 功能键高亮文本
      ※ 在没有特别指定的时候,功能键的long_click和hint颜色与普通按键一样
    • on_key_back_color: shift键锁定时背景
    • hilited_on_key_back_color: shift键锁定时的高亮背景(按下时)
    • on_key_text_color: shift键锁定时文本
    • hilited_on_key_text_color: shift键锁定时的高亮文本
      ※ shift键锁定时的这四种颜色不会因为functional: false而失效

    ※ 以上标记为☆的都可以使用图片作背景(与悬浮窗背景图做法相同)。

示例:制作一个配色方案

有了fallback_colors,最少只需要back_colortext_color就可以做出一个配色方案。

# trime.custom.yaml  
patch:  
  "preset_color_schemes/xxx":  #配色方案ID  
    name: xxx极简          #配色名称  
    back_color: 0xEEF1E7  #背景  
    text_color: 0x000000  #文字  

这是一个用色最少的配色方案。效果是这样:
简单配色
※ 部署完成后,需要从配色菜单中选取刚才添加的配色方案「xxx极简」,才能看到效果。

试试再加两个颜色:

# trime.custom.yaml  
patch:  
  "preset_color_schemes/xxx":  #配色方案ID  
    name: xxx极简          #配色名称  
    back_color: 0xEEF1E7  #背景  
    text_color: 0x000000  #文字  
    key_back_color: 0xDEEDB1   #按键背景  
    hilited_candidate_back_color: 0xD4ED89  #候选高亮背景  

好像变得更难看了😜:
改进效果

再加个背景图看看:

# trime.custom.yaml  
patch:  
  "preset_color_schemes/xxx":  #配色方案ID  
    name: xxx极简          #配色名称  
    back_color: 0xEEF1E7  #背景  
    text_color: 0x000000  #文字  
    key_back_color: 0x60DEEDB1   #按键背景加了透明度,不然会挡住图片  
    hilited_candidate_back_color: 0x80D4ED89  #候选高亮背景,这个也加了透明度,使颜色减淡一些  
    keyboard_back_color: xxx.jpg  #图片需放在rime/backgrounds文件夹内  

最后变成这样:
改进效果

……
在每个按键上加图片背景会怎样?您若感兴趣可以试试。

⚠ 图片不需要太大,上例用到的背景图只有32KB。

示例:局部颜色微调

preset_color_schemes里的颜色是全局生效的。同文也提供了一些方法可以对某些局部的颜色做微调。

可以在键盘布局里微调的颜色:
• ☆keyboard_back_color: 键盘背景

可以在按键里微调的颜色:
• ☆key_back_color: 按键背景(对功能键也有效,下同)
• ☆hilited_key_back_color: 高亮按键背景(按下按键时)
key_text_color: 按键文本(click)
hilited_key_text_color: 高亮按键文本
key_symbol_color: 按键符号(long_click和hint)
hilited_key_symbol_color: 高亮按键符号
※ 除了颜色值和图片,在按键里还可以使用分组颜色标签,详见下面例2、例3。
※ 若在键盘里调整功能键颜色,则不区分是否锁定。

例1:修改预设26键键盘回车键的颜色

# trime.custom.yaml  
patch:  
  "preset_keyboards/qwerty/keys/@36/key_back_color": 0xFFAE00 

※ 上例中,我们给预设26键键盘的回车键分配了一个颜色值。这样的话,不管您切换到哪个配色方案,回车键的颜色都固定是0xFFAE00
若您想更灵活地更改一个按键的颜色,就需要用到分组颜色标签。

例2:使用分组标签定义按键颜色

先来看一个简单的例子:

# trime.custom.yaml  
patch:  
  "preset_keyboards/qwerty/keys/@15/key_back_color": off_key_back_color
  "preset_keyboards/qwerty/keys/@15/hilited_key_back_color": hilited_off_key_back_color

off_key_back_colorhilited_off_key_back_color是同文默认的功能键颜色标签。在这个补丁中,我们给qwerty键盘的g键添加了功能键的颜色标签。这样不管切换到什么配色方案,g键的颜色总会跟功能键保持一致。

除了使用默认的标签,我们还可以定义自己的颜色标签。

例3: 自定义分组标签

现在我们要改变数字键盘的数字键颜色,以便快速地与普通按键作区分。

# trime.custom.yaml  
patch:  
  #步骤一,在数字键盘的数字键中添加分组颜色标签
  "preset_keyboards/number":
    name: 預設數字
    author: "osfans <waxaca@163.com>"
    width: 20
    height: 44
    keys:
    - {click: '+'}
    - {click: '1', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b} 
    #k_n_b是自定义的标签名,你可以理解成是key_num_back_color的缩写...
    - {click: '2', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '3', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '#'}
    - {click: '-'}
    - {click: '4', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '5', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '6', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '%'}
    - {click: '*'}
    - {click: '7', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '8', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '9', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: ':'}
    - {click: '/'}
    - {click: '±'}
    - {click: '0', key_back_color: k_n_b, hilited_key_back_color: h_k_n_b}
    - {click: '.'}
    - {click: ','}
    - {click: '='}
    - {click: Keyboard_default, long_click: Keyboard_symbols}
    - {click: space}
    - {click: BackSpace}
    - {click: Return}
  #步骤二,在配色方案中定义k_n_b和h_k_n_b的颜色  
  "preset_color_schemes/xxx": #配色方案,直接利用了上一节示例做的配色
    name: xxx极简 
    back_color: 0xEEF1E7
    text_color: 0x000000 
    key_back_color: 0x60DEEDB1 
    hilited_candidate_back_color: 0x80D4ED89 
    keyboard_back_color: xxx.jpg  
    k_n_b: 0x80D4ED89  #数字键背景色
    h_k_n_b: 0x60DEEDB1 #高亮数字键背景色

好了,看看效果:
数字键颜色分组

※自定义的分组标签可以在当前主题的所有配色方案中使用。只需要在相应的配色方案中给k_n_bh_k_n_b设定颜色值即可。这样每个配色方案中的数字键都可以独立设置颜色,自由度更高。(若某个配色方案中的k_n_b省略不写,则数字键的背景色会默认使用普通按键背景色,不用担心会出错。)

分组标签的使用还可以更灵活。

例4: 分组标签与fallback_colors配合

细心的你可能会发现,例3中的数字键颜色,只是把普通按键的背景与高亮背景翻转过来而已。像这样很有规律的对应关系,使用fallback_colors会更简单。

#将这两句添加到例3的补丁中(在fallback_colors中建立自定义分组与普通按键的对应关系)

  "fallback_colors/k_n_b": hilited_key_back_color #使数字键的背景色=普通按键的高亮色
  "fallback_colors/h_k_n_b": key_back_color       #使数字键的高亮色=普通按键的背景色

#再删掉配色方案中的这两句(配色方案中的k_n_bh_k_n_b可有可无,若存在则优先使用)

    k_n_b: 0x80D4ED89  #数字键背景色
    h_k_n_b: 0x60DEEDB1 #高亮数字键背景色

这样就进一步简化了配色方案。

咦,怎么感觉绕来绕去的,为什么不直接在键盘上写{click: '1', key_back_color: hilited_key_back_color, hilited_key_back_color: key_back_color}呢?其实这样写也可以,例2就是这样做的。
例4是综合了例2、例3的优点。在fallback_colors中建立对应关系,可以简化配色方案,另外还给配色方案单独控制数字键颜色预留了一个通道,可以实现更多的可能。

(若您的主题中只有一个配色方案,那基本上不需要这些复杂的方法)

四、android_keys

这一部分列出了所有已知的按键以及各种可用的条件、功能。目前的主要作用是供我们查阅,在后面定义preset_keyspreset_keyboards时会用到这些。

  • name: 罗列了已知按键的名称,每个名称都代表一种按键功能。

  • when: 按键功能的各种触发条件

    • ascii: 西文标签(处于英文状态时)
    • paging: 翻页标签(翻页时)
    • has_menu: 菜单标签(出现候选项时——非空码时)
    • composing: 输入状态标签(处于输入过程中)
    • #always: 始终
    • #hover: 滑过
    • click: 单击
    • long_click: 长按
    • combo: 并击
    • #double_click: 双击
    • swipe_left: 左滑
    • swipe_right: 右滑
    • swipe_up: 上滑
    • swipe_down: 下滑
      ※️标注#的暂未实现。
  • property: 各种属性

    • width: 宽度
    • height: 高度
    • #gap: 间隔
    • preview: 按键气泡提示
    • hint: 按键助记(用于显示双拼的韵母等)
    • label: 按键标签
    • text: 组合键 (用于输出各种组合键)
    • states: 状态标签
    • repeatable: 长按重复
    • functional: 功能键
    • shift_lock: Shift键锁定方式(click:单击锁定,可用于「选择」键;long:长按锁定;ascii_long:仅英文状态长按锁定)
  • action: 执行的动作

    • command: 执行命令(输出时间等)
    • option: 命令参数
    • select: 选择(键盘布局)
    • toggle: 切换状态
    • send: 发送按键

    when name的用法可参考表1 按键功能组合示例
    ※其它参数的用法可参考默认的trime.yaml

android_keys极少需要改动,用户自定义的主题可直接导入默认主题的对应节点:

#xxx.trime.yaml
android_keys:
  __include: trime:/android_keys  #导入trime.yaml中的android_keys
  

以后默认主题若变更了android_keys,自制的主题会自动跟进。这样可以节省维护主题的时间。

五、preset_keys

按键预定义。在这里对功能键进行添加、删除、重定义等操作。

※️默认trime.yamlpreset_keys预置了很多功能键(比如语音输入、撤销&重做、切换键盘、运行程序、搜索字符串等等),在定制键盘布局时需要到这里查阅(回厂后的trime.yaml内有详细的注释,这里不再赘述)。

示例:调整按键属性

例1:更改回车键标签

trime.yaml中,回车键默认是这样定义的:

  Return: {label: Enter, send: Return}  

展开来是这样:

  Return:  
    label: Enter  
    send: Return  

label: Enter可知:回车键默认显示的标签是Enter

如果要把回车键显示成回车,可以这样:

# trime.custom.yaml  
patch:  
  "preset_keys/Return":  
    label: "回车"  
    send: Return  

例2:更改空格键的按键气泡提示

如果输入方案的名字很长,空格键的按键气泡也会非常长。可以通过定义空格键的preview属性来解决这个问题。

对于一般的按键:

  • 如果没有设置preview,那么同文会以按键的标签label来做按键气泡提示。
  • 如果也没有设置label,那么会以按键所执行的命令及其相关的状态来做气泡提示。(对于空格键来说,会使用输入方案的名字)。

默认的空格键是这样:

  space: {repeatable: true, functional: false, send: space}  

我们给它添加一个preview属性

# trime.custom.yaml  
patch:  
  "preset_keys/space":  
    repeatable: true  
    functional: false  
    preview: " "  #把空格键的气泡提示设为空格  
    send: space  

例3:一键输出「日期+时间」

以预设26键键盘为例:

# trime.custom.yaml  
patch:  
# 参考trime.yaml内置的date键,新建一个按键date_time  
  "preset_keys/date_time":  
    command: date  
    label: time  
    option: "yyyy-MM-dd  HH:mm:ss"  #通过`option`参数控制输出的日期和时间格式  
    send: function  
    
# 用data_time替换原预设26键键盘中的time
  "preset_keyboards/qwerty/keys/@26/long_click": date_time  
  

※ 常用的时间选项:y年,M月,d日,h时(12小时制),H时(24小时制),m分,s秒,S毫秒,E星期,D一年中的第几天,w一年中第几个星期,a上午/下午,z时区

例4:关闭功能键属性

preset_keys里面定义的按键,默认会打开functional属性。这些按键在键盘上会显示出功能键特有的颜色(比如回车键和退格键)。
假设要让回车键也变为普通按键的颜色,可以关闭它的functional属性(关闭后只会改变功能键的颜色,其它功能不会有变化)

# trime.custom.yaml  
patch:  
  "preset_keys/Return":  
    functional: false  #不使用功能键颜色  
    label: Enter
    send: Return

例5: 自定义组合键

使用text可以实现一些比较复杂的操作
比如:

    overwrite: {text: "{Control+a}{Control+v}", label: 覆盖}

这个组合键把全选和粘贴合并起来了。按下它就可以用剪贴板中的内容覆盖当前文档。

text的格式:text: "{send|key}{send|key}……" (功能键必须用大括号{}括起来,其它的文本或符号可以省略括号)

text的其它用例:

  • text: "{Escape}{/fh}":清空前面的输入码并输入/fh (配合symbols.yaml可以输入符号)
  • text: "「」{Left}{Keyboard_default}":输出成对符号「」并把光标移到符号中间再返回主键盘
  • text: "{Control+Left}":逐词移动。(单个组合键也可以直接用send: Control+Lefttext可以看作是组合键的组合)
  • ...

可以自由发挥想象力,看看你造出来的组合键同文能不能支持。

六、preset_keyboards

预置的键盘布局。

键盘布局

一个主题里可以有多个键盘布局。

default 键盘布局ID,不可重复

  • name: 布局名称
  • author: 作者信息
  • ascii_mode: 键盘的默认状态(0:中文;1:英文)
  • ascii_keyboard: 非标准键盘(比如注音、仓颉、双键等),在切换到英文模式时,自动跳转到这里设定的英文键盘(试验功能,有待完善)
  • label_transform: 中文模式下按键字母标签自动大写(uppercase:自动大写,仅对单个字母生效,长标签请直接更改lable;none:无,可省略不写)
  • lock: 在不同程序中切换时锁住当前键盘,不返回默认的主键盘。用于单手键盘等。(true:锁住;false:不锁,可省略不写)
  • columns: 键盘最大列数,超过则自动换行,默认30列。
  • width: 按键默认宽度(也可以在按键里面单独定义某个按键的宽度)
  • height: 每行的高度(要想改变单独一行的高度,可以直接在那一行行首的按键里设height
  • key_hint_offset_x: 助记符号x方向偏移量(向右为正,下同)
  • key_hint_offset_y: 助记符号y方向偏移量(向下为正,下同)
  • key_symbol_offset_x: 长按符号x方向偏移量
  • key_symbol_offset_y: 长按符号y方向偏移量
  • key_text_offset_x: 按键文本x方向偏移量
  • key_text_offset_y: 按键文本y方向偏移量
  • key_press_offset_x:按键按下时所有文本x方向偏移量
  • key_press_offset_y:按键按下时所有文本y方向偏移量
    ※以上这几个offset也可以直接写在按键中,仅对该按键生效。
  • keys: 按键排列顺序
    键盘中每对{}括号代表一个按键,按从左到右、从上到下的顺序排列。每行的宽度排满100或虽然不足100但无法再容纳一个按键又或者每行按键数量达到columns的设定值时,转到下一行继续排列。

布局调用

trime.yaml已经内置了很多种键盘布局,一般常用的输入方案都可以自动匹配到合适的预置键盘。
※️style/keyboards中的.default,就是用来自动匹配键盘布局的。

自动匹配的过程:

  • 如果输入方案的schema_id可以找到对应的键盘布局ID,则直接使用这个布局
    比如仓颉五代的schema_idcangjie5,在trime.yaml中刚好有IDcangjie5的键盘布局,那就直接使用它。
  • 如果匹配不了ID,那根据输入方案的speller/alphabet所用的字符,匹配最合适的布局方案
    比如朙月拼音的speller/alphabetzyxwvutsrqponmlkjihgfedcba,恰好使用了26个英文字母。那就自动套用预设26键键盘。
  • 如果IDspeller/alphabet都匹配不到,就用默认的预设26键键盘。

如果自动匹配的布局不理想,还可以手动设置。如下面的示例。

示例:指定朙月拼音使用36键键盘布局

(36键键盘比26键的多了一排数字键,可以快捷输入数字)

# trime.custom.yaml  
patch:  
  "preset_keyboards/luna_pinyin/import_preset": qwerty0   #预设36键布局的ID是qwerty0  

如是即可。

再看看,重新部署后,补丁融入trime.yaml之中,就被展开成这种格式:

  luna_pinyin:  
    import_preset: qwerty0  

可以理解成:新建了一个IDluna_pinyin的布局,这个布局导入了qwerty0的全部设置。

⚠ 如果这里指定的键盘出错了,就会自动调用default键盘。

布局调整

键盘布局就像积木一样,是由各种功能组合&排列而成。

先来看看按键是怎么由一个个功能组合而成的:

表1 按键功能组合示例

No. 按键 功能
1 {click: g} 单击时输出g,没有其它功能。
2 {width: 5} 这是一个宽度为5的空白间隙。
3 {click: space, width: 28} 单击输出空格,按键加宽(到28)。
4 {click: h, long_click: "'"} 单击输出h,长按输出撇号。
5 {click: e, label: '水', long_click: '+'} 单击输出e,在中文状态时按键标签是,英文时标签恢复成e,长按输出+。用于仓颉键盘。
6 {click: v, long_click: ~, swipe_left: Date, swipe_right: Time} 单击输出v,长按输出~,左滑输出日期,右滑输出时间 。
7 {click: Shift_L, composing: "'", width: 15} 平时单击切换大小写,在打字过程中变为分词键'。按键加宽到15
8 {click: '.', long_click: '>', has_menu: '次选', send_bindings: false} 单击输出.,长按输出>,打字出现候选时按键标签变为「次选」。⚠ send_bindings用来控制composinghas_menupaging时是否发送按键给后台(true:发送;false:不发送,仅改变按键标签,按键的实际功能仍是click)。send_bindings默认为true,可以省略不写。
9 {click: '.', long_click: '>', has_menu: Page_Down} 平时单击输出句点.,长按输出>,打字出现候选项时,变为向下翻页键
10 {click: ',', long_click: '<', paging: Page_Up} 平时输出,,长按输出<,翻页时变为向上翻页键
11 {click: "ㅎ" , ascii: g} 单击时输出符号“ㅎ”,在英文状态下输出g
12 {click: "h" , hint: "ang"} 单击输出h,在按键下方显示韵母ang,用于双拼等助记键盘
13 {click: "(){Left}"} 单击时输出一对括号(),且光标自动移到括号中间。※与preset_keys里面的text: "(){Left}"等效,但text不能直接用在键盘布局中,要改成clicklong_click
14 {click: "q" , height: 60} 单击时输出q,当该键位于行首时,整排按键加高到60
15 {click: ""} 这是一个空按键,按下去不会触发任何动作。空键的其它写法:click: "VoidSymbol"composing: "VoidSymbol"
16 {click: Return, combo: g} 单击时是回车键,与其它按键并击时输出g。※combo通常用于并击方案,可以复用一些功能键(比如spaceKeyboard_number),节约空间。⚠ 因comborepeatable属性有冲突,所以类似退格键这样的按键必须关掉repeatable才能使用combo
                      

我们在android_keyspreset_keys中提及的触发条件和按键,都可以按这种格式{when: name, when: name, when: name, ……}组合起来,还可以加上一部分的property(比如widthlabel)。基本上就是这样来做组合了。

※️如果指定的nameandroid_keyspreset_keys中都找不到,那就以文本形式直接输出(比如{click: 你好},单击该键时,就直接输出「你好」)。在制作特殊符号键盘时,可能需要这种效果。

按键造好了,再按一定的顺序排列起来就成了布局。

示例:给键盘添加删词功能

对于使用script_translator的拼音类输入方案,如果在打错词后,马上按退格键删除已经上屏的错词,可以使错词不被记录到用户词典中。但是如果隔的时间太长,或者使用的是table_translator形码方案,那就没办法这样删词了。这时候就需要定制键盘来辅助我们进行删词。

以明月拼音为例,键盘示意图:
添加删词功能

※ 由于用到了has_menu条件,键盘右上角的左右方向键和删词键只在正常打字的过程中出现。处于英文状态或不打字时仍然是数字键8、9、0。

# trime.custom.yaml  
patch:  
# 1、让朙月拼音使用36键键盘布局  
  "preset_keyboards/luna_pinyin/import_preset": qwerty0  
  
# 2、给36键键盘添加方向键和删词键  
  "preset_keyboards/qwerty0/keys/@7/has_menu": Left
  "preset_keyboards/qwerty0/keys/@8/has_menu": Right
  "preset_keyboards/qwerty0/keys/@9/has_menu": DeleteCandidate

⚠ 与 PC 版的 Rime 一样,只能从用户词典中删除词组,若要删除固态词典中的词组,请直接修改dict.yaml文档。

示例:新建一个副键盘

# trime.custom.yaml  
patch:  
# 1、新建一个键盘布局xkey  
  "preset_keyboards/xkey":  #布局ID  
    author: "xq"   #作者  
    name: "数字+操作键"  #方便自己辨识的名字  
    ascii_mode: 1 #默认进入英文状态  
    height: 44   #每行高度  
    width: 11   #按键默认宽度(取所有按键中用得较多的宽度值,接下来就可以少写一些width了)  
    keys:   #按键排列  
      # 第一行  
      - {click: "#", long_click: cut}  
      - {click: "%", long_click: copy}  
      - {click: "@", long_click: paste}  
      - {click: "+", width: 13}  
      - {click: 7, width: 18}  
      - {click: 8, width: 18}  
      - {click: 9, width: 18}  
      # 第二行  
      - {click: Page_Up}  
      - {click: Up}  
      - {click: Page_Down}  
      - {click: "-", width: 13}  
      - {click: 4, width: 18}  
      - {click: 5, width: 18}  
      - {click: 6, width: 18}  
      # 第三行  
      - {click: Left}  
      - {click: Tab}  
      - {click: Right}  
      - {click: "×", width: 13}  
      - {click: 1, width: 18}  
      - {click: 2, width: 18}  
      - {click: 3, width: 18}  
      # 第四行  
      - {click: Home}  
      - {click: Down}  
      - {click: End}  
      - {click: "÷", width: 13}  
      - {click: ",", width: 18}  
      - {click: 0, width: 18}  
      - {click: BackSpace, width: 18}  
      # 第五行  
      - {click: Keyboard_default, long_click: Menu, width: 18}  
      - {click: "±", width: 14.9} #如果上下的按键没有严格对齐,可以微调宽度  
      - {click: "=", width: 13}  
      - {click: space, width: 18}  
      - {click: ., width: 18}  
      - {click: Return, width: 18}  
  
# 2、要在主键盘中调用它,就得新建一个功能键,来开启这个ID为xkey的键盘  
  "preset_keys/Keyboard_xkey":   #按键ID  
    label: 123    #按键标签  
    send: Eisu_toggle  #执行切换键盘命令  
    select: xkey   #选择xkey键盘  
  
# 3、把这个切换键盘的功能键放到主键盘中(以预设26键键盘为例)  
  "preset_keyboards/qwerty/keys/@31/long_click": Keyboard_xkey  #通过长按符号键来开启这个键盘
  
# 4、最后在style/keyboards中声明一下我们要用到xkey这个键盘  
  "style/keyboards":  
    - .default  
    - default  
    - number  
    - symbols  
    - xkey  #style/keyboards不能只写xkey一个,其它用到的键盘要照原样抄过来,不然会出错  

副键盘就这样做出来了。效果图:
添加附属键盘

⚠ 如果是新建主键盘,则可以省略步骤2、3、4,因为同文可以根据键盘ID自动调用键盘。

常见问题:修改不生效?

比较常见的原因是配置文件出现语法错误了,需要检查空格缩进、引号配对、是否错用tab等等。哪怕是一个空格出错了,也有可能会使整个配置文件失效,初学者需要格外小心。

仅供参考,欢迎指正。


附录: schema.yaml中的trime

还可以针对不同输入方案设置主题参数。

1、style

schema.yaml里面设置的style参数会优先生效。

示例: 为英文输入方案设置专用的英文字体

#easy_en.schema.yaml

style:
  candidate_font: gunplay.ttf #相应的字体文件需放在rime/fonts
  comment_font: gunplay.ttf
  #也可以直接设置latin_font,但latin_font暂时对悬浮窗不起作用

当切换到easy_en方案时,候选栏的字体自动变为gunplay。(在使用其它输入方案时,仍然使用trime.yaml里面设定的字体)

2、switches

在schema里面可以给这些开关设置初始状态:

  • _hide_candidate 隐藏候选栏
  • _hide_comment 隐藏候选项注释
  • _hide_key_hint 隐藏按键助记符号

※ 这几个开关分别对应preset_keys里的功能键:Candidate_switchComment_switchHint_switch

示例: 盲打方案自动关闭候选栏

#xxx.schema.yaml

switches:
  - name: _hide_candidate  
    reset: 1 #默认开启这个开关,隐藏候选栏
    # 由于没有设置states,这个开关是隐藏的。只在切换到该方案时将_hide_candidate设为1。

当切换到这个方案时,候选栏自动关闭。
※在需要时,也可以通过快捷键或键盘按键随时打开候选栏。

也可以在状态栏上添加按键:

示例: 在状态栏放置按键(试验功能)

option格式:

  • _key_+按键 (这里的按键可以是功能键、符号、字母、任意文本)
  • _keyboard_+键盘布局ID (一些比较特殊的id:.default返回当前主键盘,.next下一个键盘,.last在最近使用的两个键盘间轮换,.last_lock返回上一个标记为lock的键盘)
#xxx.schema.yaml

switches:
  # 这个按键用来收起软键盘
  - options: [ _key_Hide ]
    states: [ "▼" ]
  #states是显示在状态栏的图标,options是实际执行的功能

  # 这个按键用来调出输入法切换菜单
  - options: [ _key_IME_switch ]
    states: [ "🌐" ]
  # 更多功能键请查阅trime.yaml/preset_keys

  # 这是一个空按键,按下去不会执行任何动作
  - options: [ _key_VoidSymbol ]
    states: [ "    " ] #空键的宽度由这里的空格决定

  # 这个按键用来输出句号
  - options: [ _key_period ] #period是句号的英文名,也可以直接写成[ _key_. ]
    states: [ "。" ]
    
  # 这个按键用来输出固定的短语
  - options: [ _key_吃饭了吗? ]
    states: [ "🍚" ]
    
  # 这个按键用来切换键盘布局(在主键盘、数字键盘、英文键盘之间轮换)
  - options: [ _keyboard_.default, _keyboard_number, _keyboard_letter]
    states: [ 默认, 123, abc ]
  #多个键盘轮换的功能还有一些问题,有待完善
  
  # 也可以只切换到一个特定的键盘
  - options: [ _keyboard_number ]
    states: [ 123 ]
    
  #...
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.