WezTerm 配置详解:使用strikethrough_position精确控制删除线位置
【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm
strikethrough_position是 WezTerm 提供的字体渲染微调配置项,用于覆盖终端中删除线(strikethrough)的纵向绘制位置。本文基于官方配置文档并结合仓库源码,完整讲解该配置项的取值单位、默认行为、底层实现原理,以及它与underline_position、underline_thickness等字体指标配置的关系,帮助你针对特定字体或视觉偏好精确调整删除线的渲染效果。
配置项概览
strikethrough_position是 WezTerm 字体类配置项中的一个可选参数,自版本20221119-145034-49b9839f起引入。它在配置中的定义位于 config/src/config.rs:
#[dynamic(try_from = "crate::units::OptPixelUnit", default)] pub underline_position: Option<Dimension>, #[dynamic(try_from = "crate::units::OptPixelUnit", default)] pub strikethrough_position: Option<Dimension>,可以看到,strikethrough_position与underline_position(下划线位置)是相邻的两个可选字段,二者均通过OptPixelUnit类型从配置值解析为内部统一的Dimension(尺寸)枚举。它支持在用户配置目录下的wezterm.lua文件中进行设置(配置文件的具体加载规则参见 files.md)。
默认行为:继承字体的下划线位置指标
当未显式配置strikethrough_position时,WezTerm 会使用主字体设计者(font designer)通过字体度量指定的underline_position(下划线位置)指标来推导删除线的位置。也就是说,删除线并非独立于字体设计,而是与下划线共用同一套基础定位逻辑。
这一默认推导逻辑在 wezterm-gui/src/utilsprites.rs 中有清晰体现:
let strike_row = match &config.strikethrough_position { None => { ((cell_height as f64 + (metrics.descender.get() - underline_position)) / 2.) as isize } Some(d) => d .evaluate_as_pixels(DimensionContext { dpi: fonts.get_dpi() as f32, pixel_max: descender_row as f32 / 2., pixel_cell: cell_height as f32, }) .round() as isize, };其中underline_position的取值同样遵循"优先使用配置、否则回退到字体度量"的原则(见同文件第 100-107 行)。而用于双倍行距等场景的简化默认路径with_font_metrics中,删除线行号被简单定义为descender_row / 2(见 utilsprites.rs)。
支持的单位与取值方式
与 WezTerm 中绝大多数尺寸类配置(如underline_position、underline_thickness、cursor_thickness)一致,strikethrough_position接受数字与带单位字符串两种写法,且不同单位具有略微不同的语义。官方文档给出的完整取值规则如下:
| 配置写法 | 含义 |
|---|---|
2、2.0或"2px" | 位置为 2 像素(像素为无后缀数字的默认单位) |
"2pt" | 位置为 2 点(point),会随窗口 DPI 缩放 |
"200%" | 取字体自带的underline_position值并乘以 2 |
"0.5cell" | 取单元格(cell)高度,乘以0.5作为位置 |
这些单位解析逻辑集中在 config/src/units.rs 中:配置值先被规范化为Dimension枚举的四种变体Pixels、Points、Percent、Cells,随后在需要像素值时通过evaluate_as_pixels换算:
pub fn evaluate_as_pixels(&self, context: DimensionContext) -> f32 { match self { Self::Pixels(n) => n.floor(), Self::Points(pt) => (pt * context.dpi / 72.0).floor(), Self::Percent(p) => (p * context.pixel_max).floor(), Self::Cells(c) => (c * context.pixel_cell).floor(), } }换算关系可概括为:
- px / 裸数字:直接按像素原样使用,是最直观、最常见的写法;
- pt:按公式
点数值 × dpi / 72换算成像素,因此在高 DPI 屏幕上会自动变大,保证物理尺寸一致; - %(百分比):以字体自带
underline_position为基准(即pixel_max取descender_row / 2),"200%"即取其两倍,适合按比例微调而不是指定绝对位置; - cell:以当前字体度量算出的单元格高度为基准,乘以系数后得到位置,适合按行内比例定位。
单位解析与校验细节
值得注意的一点是,Dimension的Percent变体在内部以1.0 == 100%存储(见 units.rs),因此解析器在读取"200%"时会执行v / 100.的换算(见 units.rs)。同时,如果传入无法识别的字符串,解析器会报错,提示合法的单位只能是'px'、'%'、'pt'或'cell'之一(见 units.rs)。
在 utilsprites.rs 中,strikethrough_position的换算上下文被设定为:
dpi:取当前字体配置的实际 DPI(影响pt单位);pixel_max:descender_row / 2(影响%单位,即字体下划线位置指标的一半);pixel_cell:单元格高度(影响cell单位)。
最终计算出的strike_row会被四舍五入为整数像素行号。
删除线是如何被绘制的
strike_row最终作为RenderMetrics的一个字段(见 utilsprites.rs)随渲染度量一起传播。实际绘制发生在字形缓存相关的 wezterm-gui/src/glyphcache.rs 中:
let draw_strike = |buffer: &mut Image| { for row in 0..metrics.underline_height { buffer.draw_line( Point::new( cell_rect.origin.x, cell_rect.origin.y + metrics.strike_row + row, ), Point::new( cell_rect.origin.x + metrics.cell_size.width, cell_rect.origin.y + metrics.strike_row + row, ), white, ); } };从这段代码可以看出删除线渲染的两个关键点:
- 横线:删除线是一条从单元格左边界到右边界的水平线,跨越整个单元格宽度;
- 线宽:删除线的粗细不归
strikethrough_position管,而是复用underline_height(即由underline_thickness决定,最小为 1 像素)。也就是说,strikethrough_position只决定"画在哪一行",线的粗细由下划线厚度配置间接控制。
配置示例
下面给出几种常见配置场景。将以下内容写入你的 WezTerm 配置文件(如~/.wezterm.lua)即可生效:
local wezterm = require 'wezterm' local config = {} -- 示例 1:将删除线固定画在距单元格顶部 3 像素处 config.strikethrough_position = 3 -- 示例 2:等价的字符串写法,显式声明单位为像素 -- config.strikethrough_position = "3px" -- 示例 3:使用点单位,让删除线位置随窗口 DPI 缩放 -- config.strikethrough_position = "2pt" -- 示例 4:以字体自带 underline_position 的 200% 作为位置 -- config.strikethrough_position = "200%" -- 示例 5:将删除线放在单元格高度一半的位置 -- config.strikethrough_position = "0.5cell" return config与其他字体指标配置的关系
strikethrough_position并非孤立存在,它与以下两个配置项紧密相关,建议一并了解(相关文档位于同一目录下):
- underline_position:覆盖下划线位置。文档特别提醒,字体自带的
underline_position往往是一个小的负数(如-2、-4),表示相对字体基线的偏移。删除线默认正是以它为基准推导的,因此修改underline_position会连带影响默认情况下的删除线位置。 - underline_thickness:覆盖下划线基础粗细。它同时被用于渲染分屏分隔线以及诸多自定义字形中的线条,也决定了删除线的线宽(绘制时逐行以
underline_height为高度叠加)。
三者的实现位置相邻(见 config/src/config.rs),在渲染管线上则统一由RenderMetrics::new计算、由glyphcache.rs中的draw_underline/draw_strike等闭包消费,构成了一套完整的"下划线族"视觉定制能力。
使用建议与注意事项
- 何时需要配置:多数情况下字体自带度量已足够美观;当使用某些下划线位置异常或删除线贴近/越过文字主体的字体时,可用
strikethrough_position单独微调,而不必影响下划线本身。 - 单位选择策略:追求像素级精确时用
px或裸数字;希望跨 DPI 保持一致观感时用pt;希望跟随字体设计比例时用%;希望与单元格尺寸挂钩时用cell。 - 负值:
underline_position常为负值(相对基线向上),strikethrough_position同样可接受负数,可借此将删除线抬高到期望位置。 - 线宽独立:若要同时调整删除线的粗细,需要借助
underline_thickness,因为strikethrough_position本身不包含线宽语义。
通过合理组合strikethrough_position、underline_position与underline_thickness,你可以在 WezTerm 中对文本装饰线进行完整的像素级定制,获得与设计稿一致或更符合个人偏好的终端显示效果。
【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考