news 2026/9/12 17:16:21

WezTerm 配置详解:使用 `strikethrough_position` 精确控制删除线位置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WezTerm 配置详解:使用 `strikethrough_position` 精确控制删除线位置

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_positionunderline_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_positionunderline_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_positionunderline_thicknesscursor_thickness)一致,strikethrough_position接受数字与带单位字符串两种写法,且不同单位具有略微不同的语义。官方文档给出的完整取值规则如下:

配置写法含义
22.0"2px"位置为 2 像素(像素为无后缀数字的默认单位)
"2pt"位置为 2 点(point),会随窗口 DPI 缩放
"200%"取字体自带的underline_position值并乘以 2
"0.5cell"取单元格(cell)高度,乘以0.5作为位置

这些单位解析逻辑集中在 config/src/units.rs 中:配置值先被规范化为Dimension枚举的四种变体PixelsPointsPercentCells,随后在需要像素值时通过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_maxdescender_row / 2),"200%"即取其两倍,适合按比例微调而不是指定绝对位置;
  • cell:以当前字体度量算出的单元格高度为基准,乘以系数后得到位置,适合按行内比例定位。

单位解析与校验细节

值得注意的一点是,DimensionPercent变体在内部以1.0 == 100%存储(见 units.rs),因此解析器在读取"200%"时会执行v / 100.的换算(见 units.rs)。同时,如果传入无法识别的字符串,解析器会报错,提示合法的单位只能是'px''%''pt''cell'之一(见 units.rs)。

在 utilsprites.rs 中,strikethrough_position的换算上下文被设定为:

  • dpi:取当前字体配置的实际 DPI(影响pt单位);
  • pixel_maxdescender_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, ); } };

从这段代码可以看出删除线渲染的两个关键点:

  1. 横线:删除线是一条从单元格左边界到右边界的水平线,跨越整个单元格宽度;
  2. 线宽:删除线的粗细不归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_positionunderline_positionunderline_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 17:12:21

DLA植物生长模拟:基于扩散凝聚的分形生成方法

简介&#xff1a;本资源是一套基于DLA&#xff08;扩散限制聚集&#xff09;算法的植物生长模拟程序&#xff0c;面向计算机图形学初学者、分形算法研究者及生物建模爱好者&#xff0c;用于理解分形几何与自然形态生成的内在关联。压缩包共22个文件&#xff0c;含5个C源码文件&…

作者头像 李华
网站建设 2026/9/12 17:10:03

SurrealML 如何本地构建 Rust 二进制、训练模型并运行 core 库测试

SurrealML 如何本地构建 Rust 二进制、训练模型并运行 core 库测试 【免费下载链接】surrealdb A scalable, distributed, collaborative, document-graph database, for the realtime web 项目地址: https://gitcode.com/GitHub_Trending/su/surrealdb 要在 SurrealDB …

作者头像 李华
网站建设 2026/9/12 17:04:12

南昌壁挂炉上门维修 本地靠谱师傅 不点火、故障码、漏水维修

南昌壁挂炉上门维修 本地靠谱师傅 不点火、故障码、漏水维修家里壁挂炉突发故障&#xff1f;不点火、无热水、采暖不热、屏幕跳故障码、漏水异响、水压异常&#xff0c;不用盲目找维修。壁挂炉集成燃气、水路、电控、采暖多套系统&#xff0c;维修需精准检测故障根源&#xff0…

作者头像 李华
网站建设 2026/9/12 17:03:50

Agentic RAG:智能体增强的检索生成技术解析

1. Agentic RAG&#xff1a;当检索增强生成遇上AI智能体 如果你最近关注AI领域的发展&#xff0c;一定对RAG&#xff08;检索增强生成&#xff09;技术不陌生。但传统的RAG就像是一个只会照本宣科的考生——给它一本书&#xff0c;它就能在考试中表现得不错&#xff1b;但如果问…

作者头像 李华