Rofi dmenu 模式完全指南:从 dmenu 替代到脚本级选择对话框
CLI【免费下载链接】rofiRofi: A window switcher, application launcher and dmenu replacement项目地址https://gitcode.com/gh_mirrors/ro/rofi点击查看免费下载导读rofi-dmenu(5)描述了 rofi 内建的dmenu 仿真模式它以命令行管道为接口从标准输入读取条目、以选择菜单呈现、再把用户选择写回标准输出从而把 rofi 强大的模糊匹配、主题渲染与多选能力无缝嵌入任意 Shell 脚本。读完本文你将掌握rofi -dmenu的全部命令行参数、返回值约定、与 Script 模式的边界并能借助 dmenu 模式实现 的源码剖析理解其异步读取、格式串输出与行标记的底层原理。dmenu 模式是什么基本概念dmenu 模式的设计目标非常朴素把 rofi 变成脚本里的选择对话框。其工作流为从标准输入读取数据按分隔符拆分为独立的条目在 rofi 窗口中展示这些条目供用户过滤、浏览、选择用户选中的行被打印到标准输出供上游脚本继续处理。默认情况下条目以换行符分隔这使它可以轻松融入管道链前一个应用的标准输出|进 rofirofi 的标准输出再|给下一个命令。需要明确的是rofi 官方并不追求与 dmenu 100% 兼容——there are simply too many flavors of dmenu。其设计取舍是遵守 dmenu 的基本用法命令行参数不理会 dmenu 的主题类参数同时提供 dmenu 所没有的扩展能力多选、高亮、消息栏、额外按键绑定。这一定位决定了本文后续所有参数的行为边界。快速上手最简单的 dmenu 模式用法是在启动时加上-dmenu标志ls | rofi -dmenu此时 rofi 读取ls的输出每个文件名一行显示为可过滤的列表选中的文件名被打印到标准输出。作为 dmenu 的 drop-in 替代如果启动 rofi 时的argv[0]即调用命令名是dmenurofi 会自动进入 dmenu 模式。这意味着你只需把 rofi 复制或软链接为$PATH中的dmenu即可无缝替换系统里的 dmenuln -s /usr/bin/rofi /usr/bin/dmenu此后脚本中任何dmenu调用都会实际运行 rofi 的 dmenu 模式无需改写脚本。dmenu 模式 vs Script 模式两者容易混淆官方给出了精辟的区分Script 模式用于扩展 rofi为 rofi 增加新模式dmenu 模式用于扩展脚本为脚本提供选择 UI。二者共享大部分输入格式——dmenu 模式下也支持通过特殊输入为单行附加图标、meta 信息、非可选等属性详见 rofi-script.5在源码中这一共享体现在include/modes/dmenuscriptshared.h定义的DmenuScriptEntry结构体含entry、display、icon_name、meta、info、nonselectable、permanent、urgent、active字段以及dmenuscript_parse_entry_extras()对行内附加信息的解析。dmenu 模式专属命令行参数详解以下参数均为 dmenu 模式专用其中不少选项也可由脚本通过特殊输入在运行时修改语法同样见 rofi-script.5。输入与条目分隔-sepseparator设置 dmenu 的条目分隔符单个字符。例如以|分隔、展示a到eecho a|b|c|d|e | rofi -sep | -dmenu源码中该参数通过find_arg_char(-sep, (pd-separator))读取dmenu.c默认值为\n换行。同步读取路径read_input_sync()使用getdelim()按该字符切分输入dmenu.c异步路径则在读线程中逐字节扫描分隔符dmenu.c。-inputfile从file读取输入而非标准输入。实现上异步模式下以O_RDONLY | O_NONBLOCK | O_CLOEXEC打开文件dmenu.c同步模式下使用fopen()dmenu.c打开失败会弹出错误对话框并返回。界面、提示与消息-pprompt指定 dmenu 模式下输入框左侧显示的提示文字echo a|b|c|d|e | rofi -sep | -dmenu -p monkey默认值dmenu。源码中该值直接赋给dmenu_mode.display_namedmenu.c。-lnumber of lines to show菜单滚动前最多显示的行数rofi -dmenu -l 25默认值15。实现上它不是简单存储而是把该值转换为名为lines的整数主题属性注入到listview部件dmenu.c因此对显示行数的最终影响会与当前主题的listview.lines相互作用。-mesgstring在过滤输入框下方增加一条消息行支持 Pango markup如需完整掌握 markup 语法可查阅 GTK Pango 标记语言文档。实现上它被存入pd-message并经dmenu_get_message()返回给视图层渲染dmenu.c。-window-titletitle设置窗口标题最终显示为Rofi - *title*。源码中同样赋值给dmenu_mode.display_namedmenu.c。-wwindowid将 rofi 窗口定位到给定 X11 窗口 ID 之上用于替代某个已有窗口时保持上下文位置。-keep-right将省略号ellipsize模式设为start即保留字符串结尾可见——适合文件名以扩展名结尾、而开头被截断无所谓的场景。对应rofi_view_ellipsize_listview(state, PANGO_ELLIPSIZE_START)dmenu.c。-ellipsize-mode(start|middle|end)直接指定列表视图的省略号模式默认end。实现上对start/middle/end分别映射到PANGO_ELLIPSIZE_START/MIDDLE/END未知值会发出警告dmenu.c。匹配与选择行为-i使 dmenu 搜索不区分大小写。默认是大小写敏感的——源码显式设置config.case_sensitive TRUE遇到-i再置为FALSEdmenu.c。-selectstring预选第一行匹配给定字符串的条目。实现上用helper_tokenize()把字符串分词后对每个条目调用helper_token_match()命中即设为当前选中行dmenu.c。-only-match只允许返回已列出的条目禁止自定义输入本模式总是返回一个条目——若没有匹配的条目被选中则直接不返回。从源码看-only-match与-no-custom都会置位pd-only_selected且若输入列表为空会提前返回dmenu.c取消操作MENU_CANCEL下是否重启窗口由该参数决定dmenu.c。-no-custom同样只允许选择已有条目、不允许自定义输入但与-only-match的区别在于没有给出任何条目时直接返回相当于空列表即取消。源码中二者对only_selected与空列表的处理逻辑相同dmenu.c行为差异体现在最终返回码上。-dump把过滤后的列表打印到标准输出后退出。结合-filter使用可以预览rofi 会怎么过滤这批数据适合调试。实现上它会对每个条目执行分词匹配命中即按-format输出然后直接清理退出dmenu.c因此-dump也会自动关闭异步读取模式。行标记active 与 urgent-aX与-uX分别把指定行标记为active活动与urgent紧急在主题渲染中对应state:active/state:urgent高亮。X是逗号分隔的 Python 风格索引与区间列表索引从 0 开始-1指最后一行、-2指倒数第二行区间左开右闭。可用的写法单行5末 3 行的区间-3:从第 7 行起的 4 行7:11旧式记法7-10一组行2,0,-9任意组合5,-3:,7:11,2,0,-9实现上通过parse_ranges()解析为rofi_range_pair列表dmenu.c渲染时由get_display_data()用get_index()把负数索引换算为实际位置越界返回UINT_MAX并置位ACTIVE/URGENT状态位dmenu.c。输出定制-format-formatformat自定义 dmenu 模式写入标准输出的内容N为输入条目总数各占位符含义占位符含义s选中的字符串i索引0 ~ N-1d索引1 ~ Nq引号包裹的字符串shell 安全引号p去除 Pango markup 后的选中字符串要求是合法字符串否则输出invalid stringf过滤字符串用户输入F引号包裹的过滤字符串默认值s。底层实现在 helper.c 的rofi_output_formatted_line()按字符遍历格式串i/d输出行号、s输出原文、p用pango_parse_markup()剥除标记、q/F用g_shell_quote()加引号其余字符原样输出末尾统一补\n并fflush。例如只输出行号rofi -dmenu -format i或输出行号制表符内容rofi -dmenu -format i\ts。多选-multi-select允许选择多行每行左侧出现一个小选择指示符。源码在dmenu_finalize()中用位图selected_list记录选中状态bitget/bittoggle每 32 个条目一个uint32_t选中/取消后显示选中数/总数浮层并重启视图继续选择dmenu.c。配合-format可让输出体现选择状态。-ballot-selected-strstring/-ballot-unselected-strstring多选模式下分别定义条目被选中/未选中时的前缀字符串。默认值选中☑ 、未选中☐ 源码见 dmenu.c。输出时该前缀与-format结合在dmenu_format_output_string()中拼入结果dmenu.c。安全与渲染-password隐藏用户输入内容输入显示为*。官方文档明确警告这不应被视为安全的密码输入方案。实现上为视图设置MENU_PASSWORD标志dmenu.c。-markup-rows声明输入数据是 Pango markup 编码并按其渲染匹配时会把 markup 剥除后再比对避免用户被标记语法干扰dmenu_token_match()中的pango_parse_markup()处理见 dmenu.c。读取时机同步与异步-sync强制 rofi 先完整读取标准输入、再显示选择窗口——这是原始 dmenu 的行为。而默认的异步模式会在读取输入的同时就弹出窗口、边读边刷新适用于输入流很大或产生缓慢的场景。从源码看以下情形会自动禁用异步模式、退回同步读取dmenu.c显式给出-sync-dump需要完整列表一次性输出-select需要完整列表做预选-no-custom/-only-match全局启用auto-select时给出-selected-row-async-pre-readnumber阻塞式读取前number个条目后再切换为异步模式让窗口秒开且前几屏数据立即可用。默认值25。异步实现的细节颇具参考价值dmenu.c专用读线程用select()同时监听输入 fd 与主线程的中止管道输入按分隔符切块后放入GAsyncQueue每 0.1 秒或攒满BLOCK_LINES_SIZE2048条就通过另一对管道唤醒 UI 线程的dmenu_async_read_proc()批量合并到条目列表并调用rofi_view_reload()刷新读线程退出时发送q通知清掉 Loading.. 浮层。列显示多列数据的精简展示-display-columns与-display-column-separator默认\t把每行按正则表达式分隔符切分为多列只展示指定的列。分隔符是正则表达式默认匹配制表符列号列表以逗号分隔展示时按列号取第 N 列并以制表符拼接。源码用g_regex_split_simple()切分、g_ascii_strtoull()解析列号dmenu.c。典型场景日志或 CSV 数据只关心其中几列例如-display-columns 1,3。返回值脚本如何判断结果dmenu 模式结束时通过进程退出码向脚本汇报结果退出码含义0行已被用户选中并接受1用户取消了选择10~28行通过自定义按键绑定接受后者的机制在dmenu_finalize()中可见普通按键返回EXIT_SUCCESS、取消返回EXIT_FAILURE而自定义命令MENU_CUSTOM_COMMAND把低 4 位掩码叠加到10上作为返回码dmenu.c。脚本据此可区分正常选中 / 取消 / 快捷操作三类结果例如ls | rofi -dmenu case $? in 0) echo selected: $(ls | rofi -dmenu -format i /dev/null);; 1) echo cancelled;; *) echo custom key: $?;; esac底层实现要点速览模式注册dmenu_mode是一个标准的Mode对象dmenu.c名称为dmenu类型为MODE_TYPE_DMENU实现了_init、_get_num_entries、_token_match、_get_display_value、_get_icon、_get_message等回调。兼容性细节-b放在屏幕底部被映射为config.location 6dmenu.c对应 rofi 主题的位置语义-l注入listview主题属性见上文。行附加信息DmenuScriptEntrydmenuscriptshared.h支持display展示与输出分离、meta隐藏的匹配关键词、nonselectable不可选行确认时会被拒绝见 dmenu.c、permanent始终匹配见dmenu_token_match()dmenu.c等行级属性使脚本能构建远比纯文本列表更丰富的选择界面。参考文档rofi(1) 主手册rofi-script(5) 脚本模式与特殊输入语法rofi-theme(5) 主题与状态渲染rofi-sensible-terminal(1)rofi-theme-selector(1)项目作者完整列表见 AUTHORSdmenu 模式原始代码基于 Sean Pringle 的工作赞分享CLI【免费下载链接】rofiRofi: A window switcher, application launcher and dmenu replacement项目地址https://gitcode.com/gh_mirrors/ro/rofi点击查看免费下载相关推荐Anthropic-Cybersecurity-Skills 仓库 Office 宏恶意软件分析工具 API 参考与实战指南Anthropic Cybersecurity Skills 仓库 Office 宏恶意软件分析工具 API 参考与实战指南 本篇指南围绕 AnthropicCLIRofi dmenu 模式完全指南从 dmenu 无缝迁移到脚本化选择对话框Rofi dmenu 模式完全指南从 dmenu 无缝迁移到脚本化选择对话框 Rofi 内置的 dmenu 模式dmenu mode让脚本作者能够用一条管CLIRofi dmenu 模式完全指南把 rofi 变成脚本的交互式选择器Rofi dmenu 模式完全指南把 rofi 变成脚本的交互式选择器 本篇技术指南围绕 Rofi 的 dmenu 模拟模式dmenu mode 展开讲CLI上一篇DejaVu字体如何选择最适合你的免费开源字体家族下一篇拯救你的透明任务栏TranslucentTB亚克力效果失效深度修复指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

BQ76952电池管理芯片实战:从硬件设计到寄存器配置

BQ76952电池管理芯片实战:从硬件设计到寄存器配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 7:24:37 阅读更多 →
SAP财务期初上线避坑指南:LSMW数据导入实操与典型错误排查

SAP财务期初上线避坑指南:LSMW数据导入实操与典型错误排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 7:24:37 阅读更多 →
FFmpeg合并ts文件转MP4:五种方法、流拷贝原理与避坑实战

FFmpeg合并ts文件转MP4:五种方法、流拷贝原理与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 7:24:37 阅读更多 →

最新新闻

工厂考勤系统避坑指南:3个致命Bug让你少加班

工厂考勤系统避坑指南:3个致命Bug让你少加班

工厂考勤系统避坑指南:3个致命Bug让你少加班 刚接手工厂考勤模块,控制台全是红字,StackTrace 长得像天书,连哪一行代码报的错都找不到。别慌,这种“报错一堆看不懂…

2026/9/22 9:57:04 阅读更多 →
3天搞定企业公示信息查询系统避坑指南

3天搞定企业公示信息查询系统避坑指南

3天搞定企业公示信息查询系统避坑指南 你是不是也经历过这种绝望:教程刷了几十遍,LeetCode题也刷了几道,真让你独立从零手搓一个项目,脑子一片空白,连数据库表怎么建都犹豫不决?别慌,这正是绝大多数初级开发者的通病。今天这篇避坑指南,不灌…

2026/9/22 9:57:04 阅读更多 →
3个实战项目搞定vipl选型与避坑

3个实战项目搞定vipl选型与避坑

3个实战项目搞定vipl选型与避坑 看了一堆教程还是不会写项目?别急,这怪不了你。很多人卡在“vipl”这个概念上,觉得它高深莫测,其实只要拆解成 实战项目…

2026/9/22 9:57:04 阅读更多 →
小俊面试突击:搞定配置难题,从入门到精通

小俊面试突击:搞定配置难题,从入门到精通

小俊面试突击:搞定配置难题,从入门到精通 刚接手新项目,配置环境就卡半天?这是很多开发者,包括我们团队里的“小俊”,都遇到过的噩梦。依赖冲突、版本不对、环境变量丢失,光看报错信息就能让人头秃。…

2026/9/22 9:56:04 阅读更多 →
别被第二次考试吓退 源码解析助你一次通关

别被第二次考试吓退 源码解析助你一次通关

别被第二次考试吓退 源码解析助你一次通关 看了一堆教程还是不会写项目?这是无数开发者的噩梦。很多人对着文档发呆,觉得理论懂了就等于会了,结果一动手就崩。其实,问题往往出在你对底层逻辑的模糊认知上。今天咱们不聊虚的,直接拆解【第二次考试】背后…

2026/9/22 9:56:04 阅读更多 →
cmd切换目录总报错?3个最佳实践让你告别路径噩梦

cmd切换目录总报错?3个最佳实践让你告别路径噩梦

cmd切换目录总报错?3个最佳实践让你告别路径噩梦 复制来的代码跑不通,报错信息里全是“找不到路径”或“拒绝访问”,你是不是也盯着屏幕发呆,不知道从哪下手调试?别急,这其实是 cmd 切换目录时最典型的坑,尤其是新手在 Windows…

2026/9/22 9:56:04 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →