文章摘要
作者Leo Robinovitch开发了一个名为"lore"的终端分页器工具,基于他自研的Go语言可复用组件"viewport"。该工具支持交互式浏览多页文本,现已作为日常工具使用。文章分享了开发过程中的功能设计思路和经验总结。
文章总结
我开发了一款终端分页工具
作者Leo Robinovitch在个人博客The Leo Zone分享了他开发的终端分页工具lore及其核心技术viewport组件的开发历程。
终端分页工具简介
终端分页工具(如less、more)允许用户交互式浏览多页文本内容。作者基于自研的viewport组件开发了lore分页工具,现已作为日常工具使用。
终端应用开发
作者开发过多款终端用户界面(TUI)应用,如用于查看Kubernetes日志的kl和管理Nomad的wander。这些应用的核心功能都涉及大段文本的浏览与交互。
viewport组件设计
该Go语言组件具有以下核心功能: - 灵活调整显示区域大小 - 支持文本滚动和位置百分比显示 - 提供横向平移和文本换行选项 - 实现搜索和高亮匹配功能 - 支持ANSI转义码和Unicode字符 - 保持高性能处理大量文本
组件由三个模块组成:
1. item:处理字符串显示,考虑终端宽度和换行状态
2. viewport:实现文本导航功能
3. filterableviewport:增加搜索功能
Unicode处理方案
组件通过Item接口处理Unicode字符的终端显示宽度问题,包括:
- 构建代码点到字节偏移的映射
- 计算累计终端单元格宽度
- 支持组合字符(如带重音符号的字母)
- 实现MultiItem和MultiLineItem处理前缀和多行内容
搜索与选择功能
提供三种搜索模式: - 精确匹配(/键) - 正则表达式(r键) - 不区分大小写(i键)
支持项目选择功能,可通过泛型实现不同类型对象的选取。
lore分页工具特点
相比传统less工具,lore:
- 提供更符合作者使用习惯的操作方式
- 集成到日常工作流(通过设置PAGER环境变量)
- 保持代码透明度和可改进性
作者表示将继续优化viewport核心功能和相关TUI应用开发。
评论总结
总结评论内容如下:
对项目实用性的质疑
有评论认为该项目相比现有工具(如less)优势不明显,更像是一个学习项目。
引用:
"lore supports only a subset of what less does, but in a more intuitive and useful manner"
"What was the main limitation in existing pagers like less that pushed you to build a new one?"对技术解释的赞赏
部分用户赞赏文章对UTF-8字符串特性的清晰解释。
引用:
"I think it's the clearest explanation I've seen of the different characteristics of utf-8 strings"幽默调侃
有用户对项目名称进行趣味联想,或调侃界面元素不足。
引用:
"From the title I thought it’s about a dead man’s switch"
"For a bubbletea application I'd expect more bubbles and tea"现有工具推荐
多位用户推荐bat等现有分页工具,并讨论其功能优势。
引用:
"bat is the king of pagers"
"I've been using bat as a pager...it covers most of what I need"功能需求建议
用户提出期待现代分页工具应具备刷新等新特性。
引用:
"I think the killer feature for me would be refresh"
"fzf supports both refresh and piped input"相关项目分享
有开发者分享自己开发的类似工具并寻求反馈。
引用:
"I made a typescript library to wrap pickers recently"
"Would love if anyone has thoughts or suggestions"