Text Marker Plus:一个更适合日常使用的 VS Code 文本高亮插件
平时阅读代码、日志、配置文件或者一些比较长的文本时,我经常会遇到一个很简单但很实际的需求:
把当前比较关注的内容临时标出来。
例如分析一份比较长的日志时,我可能希望同时标记 ERROR、某个 Thread ID,以及几个关键函数名;阅读代码时,也可能希望给几个变量、状态或者调用路径分别加上不同颜色。
相比反复使用搜索框,这种持续存在的彩色高亮更容易帮助我建立视觉上的对应关系。
VS Code 本身当然提供了搜索和语法高亮,但如果想自由地给任意文本增加多组高亮,并且让这些高亮在重新打开项目后仍然保留,体验并没有那么直接。
因此最近我把自己维护的一版文本高亮插件整理了一下,并正式发布到了 Visual Studio Marketplace:
Text Marker Plus
Marketplace:
Text Marker Plus — Visual Studio Marketplace
Extension ID:
Williamslay.text-marker-Plus
Text Marker Plus 基于开源项目 ryu1kn/vscode-text-marker 继续维护。
它并不是对原项目进行完全重写,而是在保留原有使用方式的基础上,针对我自己在日常使用中遇到的一些问题进行了补充和改进,包括:
- 更方便的高亮保存机制
- Workspace / Global 两种保存范围
- Toggle 后自动保存
- 多个可见编辑器同步刷新
- 大文件匹配时的异步处理
- 匹配结果缓存
- 更丰富的默认配色
- 用户自定义颜色扩展
为什么需要一个 Text Marker?
VS Code 已经有搜索:
Ctrl + F
Ctrl + Shift + F
也有完善的语法高亮。
但它们和 Text Marker 解决的问题其实不太一样。
搜索更偏向:
“帮我找到这个东西在哪里。”
而 Text Marker 更偏向:
“接下来的一段时间里,我希望这些东西一直显眼。”
比如阅读一个复杂函数时,我可能想分别高亮:
buffer_
async_read_in_progress_
ReadAsync
Prefetch
然后在接下来的代码阅读过程中不断观察它们之间的关系。
这时候我并不希望不停地:
Ctrl + F
→ 输入关键字
→ 看搜索结果
→ 再换另一个关键字
而是希望这些关注点能够同时存在于编辑器里。
这也是 Text Marker 这类工具比较有价值的地方。
基本使用
最常见的用法很简单。
选中一段文本,然后执行:
Toggle Highlight
插件会将对应文本高亮显示。
除了普通文本匹配之外,也可以根据具体规则使用:
- 普通字符串匹配
- 正则表达式
- 大小写敏感 / 不敏感
- 整词匹配 / 部分匹配
同时也可以在不同的匹配结果之间进行跳转。
因此它既可以用于:
ERROR
WARNING
这样的日志关键字,也可以用于:
async_read_in_progress_
这样的代码变量,还可以通过正则表达式标记更加复杂的文本模式。
高亮可以保存下来
这是我比较在意的一项功能。
如果高亮只能存在于当前 VS Code Session,那么关闭编辑器之后,之前花时间建立的一组视觉标记就全部消失了。对于临时搜索来说这没有问题。但如果正在阅读一个持续数天的代码模块,这种行为就会比较麻烦。
Text Marker Plus 支持将当前高亮规则保存下来,并增加了默认保存目标的配置:
{
"textmarker.defaultSaveTarget": "workspace"
}
目前可以选择:
workspace
global
prompt
它们分别适合不同场景。
Workspace
{
"textmarker.defaultSaveTarget": "workspace"
}
高亮规则只属于当前 Workspace。
这也是我自己最常使用的模式。
例如:
RocksDB project
├── buffer_
├── ReadAsync
└── async_read_in_progress_
另一个 project
├── request
├── token
└── cache
两个项目可以维护完全不同的关注点。
重新打开 Workspace 后,对应的高亮规则仍然可以恢复。
Global
如果某些规则希望在所有项目中使用,则可以保存为全局规则。
例如:
TODO
FIXME
ERROR
WARNING
这类规则可能并不属于某个特定 Workspace。
Prompt
如果不希望固定默认行为,也可以设置为:
{
"textmarker.defaultSaveTarget": "prompt"
}
这样保存时再决定放到 Workspace 还是 Global。
Toggle 后自动保存
另一个我自己比较喜欢的配置是:
{
"textmarker.autoSaveOnToggle": true
}
开启以后,每次通过 Toggle Highlight 添加或者删除高亮规则时,插件都会自动保存当前状态。
这时候整个使用体验就比较接近:
选中文本
↓
Toggle Highlight
↓
自动保存到当前 Workspace
↓
关闭 VS Code
↓
重新打开
↓
高亮仍然存在
这样高亮实际上就变成了项目阅读状态的一部分。
多个编辑器同步刷新
这是一个看起来很小,但实际使用中比较容易注意到的问题。
我平时经常使用 Split Editor,例如:
┌─────────────────────┬─────────────────────┐
│ block_prefetcher.cc │ block_prefetcher.h │
│ │ │
│ │ │
├─────────────────────┼─────────────────────┤
│ benchmark log │ experiment config │
│ │ │
└─────────────────────┴─────────────────────┘
假设我此时增加了一个高亮:
async_read_in_progress_
理想行为显然是:
所有当前可见的 Editor 都立即更新。
而不是只有当前获得焦点的那个 Editor 更新。
Text Marker Plus 对这一部分进行了调整。
现在修改高亮规则以后,会刷新所有当前可见的编辑器区域,包括没有 Focus 的 Split Pane。
对于已经打开但目前不可见的 Tab,则会在它重新变成可见状态时更新。
对于经常同时查看:
.cc + .h
或者:
源码 + 日志
这种场景,这个行为会自然很多。
大文件匹配与 Extension Host
文本高亮还有一个比较容易被忽略的问题:
匹配本身也是计算。
假设当前打开的是一个非常大的日志文件,并且配置了很多高亮规则。
如果插件每次更新都直接在 VS Code Extension Host 中执行整份文档扫描,那么可能出现:
修改高亮规则
↓
扫描整个 Document
↓
大量 Regex / String Matching
↓
Extension Host 被占用
↓
VS Code 操作出现延迟
问题并不是 Text Marker 本身逻辑有多复杂,而是这种工作不应该长时间阻塞 Extension Host。
因此 Text Marker Plus 目前将 full-document matching 放到了独立 Worker 中处理。
整体思路类似:
VS Code Extension Host
│
│ matching request
▼
Worker
│
│ scan document
│ regex/string match
▼
matching result
│
▼
Extension Host
│
▼
Apply Decorations
这样可以减少大文件匹配直接阻塞 Extension Host 的情况。
匹配结果缓存
除了把匹配过程移出主要执行路径之外,插件还会对已经完成的匹配结果进行缓存。
缓存会考虑类似:
Document
Document Version
Highlight Rule
这样的信息。
如果:
文档没有发生变化
+
高亮规则没有发生变化
那么没有必要重新做完全相同的全文扫描。
同时,因为匹配是异步执行的,还存在另一个问题:
开始扫描 version 10
↓
用户继续编辑
↓
Document 已经变成 version 11
↓
version 10 的匹配结果才返回
这种情况下,旧结果已经失效。
因此当异步结果返回时,如果发现 Document Version 已经发生变化,旧结果会被丢弃,而不是重新应用到编辑器。
这部分也是我比较关注的一个方向:
文本高亮应该是一种辅助功能,它不应该反过来成为编辑器卡顿的来源。
默认配色
Text Marker Plus 对默认配色也做了一些调整。
当前配色主要沿着 One Half Dark 的 Accent Color 风格扩展。
我希望这些颜色在 Dark Theme 下:
- 有足够明显的区分度
- 不至于特别刺眼
- 多组颜色同时出现时仍然比较协调
相比于非常高饱和度的 Marker Color,我更倾向于让它保持接近编辑器本身的配色语言。

自定义颜色
当然,默认颜色不可能满足所有 Theme。
因此也可以通过配置增加自己的颜色,例如:
{
"textmarker.useUserColor": true,
"textmarker.userColor": [
"#E06C75",
"#E5C07B",
"#98C379",
"#56B6C2",
"#61AFEF",
"#C678DD"
]
}
用户颜色会加入可以使用的颜色序列。
因此如果自己的 VS Code Theme 有一套固定 Palette,也可以让 Text Marker 尽可能保持一致。
例如:
One Half Dark
Nord
Dracula
Tokyo Night
Catppuccin
都可以自己配置更适合的 Marker Color。
安装
目前 Text Marker Plus 1.0 已经发布到 Visual Studio Marketplace。
可以直接在 VS Code Extensions 中搜索:

Marketplace:
https://marketplace.visualstudio.com/items?itemName=Williamslay.text-marker-Plus
关于项目
Text Marker Plus 基于原有的 vscode-text-marker 项目继续维护。
当前版本仍然保持比较克制的方向:不重新设计整个工作流,而是在原有 Text Marker 使用方式上解决一些我自己确实遇到的问题。包括:
Persistence
Workspace scope
Auto Save
Multi-editor refresh
Async matching
Caching
Color palette
项目继续采用 MIT License,并保留原项目对应的版权与许可证信息。
如果在使用过程中发现 Bug,或者有一些比较自然的改进想法,也欢迎反馈。
浙公网安备 33010602011771号