字体选择协议

Silkie 扩展了 kitty,可为终端文本选择字体族、字重和倾斜角度。滚动、调整大小、屏幕复制和 ANSI 导出时,这些属性会随字符单元保留。文本仍可选择和搜索,终端网格、字符宽度和光标前进距离保持不变。

Silkie 默认使用 Iosevka,serif 角色使用 Iosevka Slab。请从 Iosevka 发布页 安装所需字体族。字体从本地系统中选择,协议不传输字体文件。字体族缺失时,使用平台的正常字体替代机制。

继承的配置、字体特性和可变轴见 kitty 字体手册。文本大小使用 kitty 文本尺寸协议,独立于此扩展。

能力探测

扩展能力协议 列出 font.1。程序通过共用的 OSC 777 扩展封装 查询其能力::

<OSC>777;font;v=1:op=query:id=42<ST>

回复列出已配置的角色和接受的数值范围::

<OSC>777;font;v=1:op=cap:id=42:caps=1:roles=default,sans,serif:weight_min=100:weight_max=900:slant_min=-1500:slant_max=1500:synthetic_slant=1<ST>

caps=1 表示支持字体选择。范围描述终端接受的请求;已安装字体可能提供更少的字重,此时使用最接近的可用字重。synthetic_slant=1 表示倾斜由渲染器合成。用户重新加载配置时,角色列表可能变化。

选择字体

选择应用于后续文本::

<OSC>777;font;v=1:op=select:role=serif:weight=300:slant=0:italic=1<ST>

省略的属性保留当前值。各属性如下:

role

default 选择 font_family。其他名称选择用户配置的 font_role 条目。名称以 ASCII 字母开头,可包含 ASCII 字母、数字、下划线、句点或连字符。未知角色回退到 default。角色名称长度和角色数量没有固定上限。

weight

取值 100 至 900 的整数;100 的倍数分别对应 Thin、Extra Light、Light、Regular、Medium、Semibold、Bold、Extra Bold 和 Heavy。中间值优先使用可变字体的字重轴,否则使用最接近的静态字重。0 恢复通过配置字体和普通 SGR 粗体属性选择字重。明确指定的非零字重优先于 SGR 粗体,直到重置。

slant

-1500 至 1500 的整数,单位为百分之一度,使用 OpenType 的符号约定。负值向右倾,正值向左倾,0 为直立。auto 恢复所选字体原生的倾斜角度。合成倾斜保留正体或意大利体字形;设置 italic=1:slant=0 会得到直立的意大利体。倾斜不改变字符单元的前进距离。与普通斜体一样,超出字符单元或窗口边界的部分可能被裁剪。

italic

1 选择意大利体字形,0 选择正体字形。这与 SGR 3 和 SGR 23 控制的是同一属性,但独立于明确选择的倾斜角度。

恢复默认角色、字重和原生倾斜角度::

<OSC>777;font;v=1:op=reset<ST>

普通 SGR 属性(包括意大利体)保持不变。SGR 0 和 RIS 会重置全部字体选择属性。光标保存/恢复及备用屏幕光标恢复均包含所选样式。这些是文本属性,而非报告模式,因此 caps;op=reset 不会重置它们。

op=state:id=42 通过回复中的 op=state 读回请求的角色、字重、倾斜角度和 italic。请求按原子方式验证。未知字段会被忽略;重复键、格式错误的字段、不支持的版本和越界数值会导致整条请求被拒绝。存储随输入增长;OSC 序列仍受配置的 escape_limit 约束。

旧式字体槽位

SGR 10 选择默认角色。SGR 11 至 19 按配置顺序选择前九个配置角色。未分配的槽位选择默认角色。这些别名保留字重和倾斜角度,不限制通过 OSC 777 可选的角色数量。

中日韩文本

中日韩字形使用 cjk_font,保持其正常字符单元宽度。设置为 auto 时,Silkie 优先选择对应地区的 Sarasa Term (将 Iosevka 与思源黑体组合),然后选择 Noto Sans CJK 和 Noto Sans Mono CJK,最后使用可用的地区系统字体和平台字形回退。Sarasa 和 Noto 的字重覆盖可能与 Iosevka 不同;请求会使用它们可用的字重。同样的带符号倾斜变换也适用于首选中日韩字体。

cjk_font_locale 选择日文(jp)、韩文(kr)、简体中文(sc)、繁体中文(tc)或香港(hk)字形。auto 使用进程区域设置,未指定时默认 sc。假名自动优先使用日文字体,谚文自动优先使用韩文字体。无法仅从统一汉字的码点推断语言;进程区域设置不够明确时,请手动配置地区。用户的 symbol_map 条目优先;表情符号呈现及终端几何制表绘图保持继承的行为。

配置示例::

font_family Iosevka
font_role sans Iosevka
font_role serif Iosevka Slab
cjk_font auto
cjk_font_locale jp

明确选择已安装的中日韩字体族::

cjk_font family="Noto Sans CJK JP"

中继与多路复用器

透传字节的中继可以转发此扩展。重建屏幕的多路复用器必须保留并重放字体属性,且仅在具备这一能力时公布 font.1。应用应查询支持情况,并保留普通文本渲染作为回退方案。