ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Rofi dmenu 模式完全指南:从 dmenu 替代到脚本级选择对话框

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),仅供参考
返回列表