尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SerenityOS 命令行剪贴板工具 copy 使用指南:从 stdin 与参数向系统剪贴板写入数据

SerenityOS 命令行剪贴板工具 copy 使用指南:从 stdin 与参数向系统剪贴板写入数据 SerenityOS 命令行剪贴板工具 copy 使用指南从 stdin 与参数向系统剪贴板写入数据【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity导读copy是 SerenityOS 内置的命令行剪贴板工具负责把来自标准输入stdin或命令行参数的文本乃至任意 MIME 类型数据如 PNG 图片写入系统剪贴板。它底层经由LibGUI::Clipboard与系统剪贴板服务通信是所有需要命令行产出 → GUI 粘贴场景的桥梁例如把图片文件内容塞进剪贴板供画图或文本编辑器粘贴。读完本文你将掌握copy的全部参数用法、其底层剪贴板数据模型以及常见的 MIME 类型与元数据约定。命令概览名称与用法copy的命令行手册位于 Base/usr/share/man/man1/copy.md其完整用法如下$ copy [options...] [text...]一句话概括copy把来自标准输入或**命令行参数text**的文本复制到系统剪贴板剪贴板内容由系统剪贴板服务统一维护。从源码 Userland/Utilities/copy.cpp 可以看到copy是一个标准的 GUI 命令行程序先创建GUI::Application解析参数后通过单例GUI::Clipboard::the()完成写入最后返回 0ErrorOrint serenity_main(Main::Arguments arguments) { auto app TRY(GUI::Application::create(arguments)); Options options TRY(parse_options(arguments)); auto clipboard GUI::Clipboard::the(); if (options.clear) clipboard.clear(); else clipboard.set_data(options.data.bytes(), options.type); return 0; }参数解析两个选项与一个位置参数copy的参数解析在parse_options中实现Userland/Utilities/copy.cpp核心是Core::ArgsParser选项长选项含义默认值-t type--type type写入剪贴板数据的 MIME 类型text/plain-c--clear清空剪贴板而非复制新内容关闭text位置参数—要复制的文本可多个以空格连接无缺省时读 stdin选项解析逻辑的关键分支Userland/Utilities/copy.cpp-c/--clear优先一旦指定清空就不再复制任何内容直接跳过数据采集。无位置参数 → 读 stdin通过Core::File::standard_input()读取直到 EOF把整个输入流作为剪贴板数据同时通过dbgln输出读取大小与内容便于调试。有位置参数 → 拼接参数多个参数用空格join成一条字符串写入剪贴板。} else if (text.is_empty()) { // Copy our stdin. auto c_stdin TRY(Core::File::standard_input()); auto buffer TRY(c_stdin-read_until_eof()); options.data TRY(String::from_utf8(StringView(buffer.bytes()))); } else { // Copy the rest of our command-line args. StringBuilder builder; builder.join( , text); options.data TRY(builder.to_string()); }剪贴板数据的底层流转从 copy 到系统服务手册中描述剪贴板由 WindowServer 管理而从当前仓库源码看剪贴板数据实际由独立的 Clipboard 服务Userland/Services/Clipboard统一存储WindowServer 负责的是拖放等界面事件。copy的数据流转链路如下copy调用GUI::Clipboard::set_data(data, mime_type, metadata)Userland/Libraries/LibGUI/Clipboard.cpp数据被封装进Core::AnonymousBuffer匿名内存文件数据为空时跳过 buffer 创建通过 IPC 发送到剪贴板服务的 portal 连接点/tmp/session/%sid/portal/clipboardUserland/Libraries/LibGUI/Clipboard.cpp服务端ConnectionFromClient::set_clipboard_data将数据交给全局单例Clipboard::StorageUserland/Services/Clipboard/ConnectionFromClient.cpp。服务端的存储模型Userland/Services/Clipboard/Storage.cpp表明剪贴板保存的是三元组MIME 类型一段ByteString说明数据语义默认text/plain数据块一块可能相当大的匿名文件共享的内存元数据一个HashMapByteString, ByteString不同 MIME 类型可附加任意键值信息例如图片的宽高。void Storage::set_data(Core::AnonymousBuffer data, ByteString const mime_type, HashMapByteString, ByteString const metadata) { m_buffer move(data); m_data_size data.size(); m_mime_type mime_type; m_metadata metadata; if (on_content_change) on_content_change(); }剪贴板内容一旦变化服务端会通过async_clipboard_data_changed广播给所有客户端Userland/Services/Clipboard/ConnectionFromClient.cpp因此 GUI 应用可以实时感知剪贴板变化并刷新粘贴菜单。常用 MIME 类型与剪贴板数据格式约定copy -t的取值直接决定剪贴板数据的解释方式。系统对若干 MIME 类型有专门约定详见配套文档 Base/usr/share/man/man5/clipboard.mdtext/uri-list剪贴板与拖放通用以换行分隔的 URI 列表文件管理器、FileSystemModel和终端都使用该格式例如复制多个桌面图标后的剪贴板内容file:///home/anon/Desktop/Browser file:///home/anon/Desktop/Help file:///home/anon/Desktop/Homeimage/x-serenityos仅剪贴板SerenityOS 原生位图格式要求元数据字段width、height、scale、format见Gfx::BitmapFormat与pitch均以十进制字符串编码。数据按Gfx::determine_storage_format(BitmapFormat)编码可能为BGRx8888、BGRA8888、RGBA8888或 8 位调色板索引注意调色板本身不随数据传送。其读写分别实现于 Clipboard::set_bitmap 与 DataAndType::as_bitmap。glyph/x-fonteditor仅剪贴板字体编辑器复制字形时使用的格式要求元数据count复制的字形数与first_glyph最小码点数据包含主机端序u32码点、u8宽度/高度及width × height字节的位图0 为空像素、1 为实像素。实现在 Userland/Applications/FontEditor/MainWidget.cpp 的copy_selected_glyphs与paste_glyphs。实操示例手册给出的两个典型用法Base/usr/share/man/man1/copy.md# 把图片文件内容以 image/png 类型写入剪贴板 $ cat image.png | copy -t image/png # 把文本 foo 放入剪贴板 $ copy foo在此基础上结合参数解析逻辑可扩展出更多场景# 把命令输出整体复制无参数时读取 stdin $ ls -la | copy # 多个参数会用空格拼接写入 Hello Serenity $ copy Hello Serenity # 从文件读取并以指定 MIME 类型写入 $ copy -t application/json config.json # 清空剪贴板 $ copy -c # 组合清空等价于不提供任何数据 $ copy --clear需要说明的边界行为输入为空copy读取 stdin 到 EOF若输入为空字符串Clipboard::set_data会走空数据分支Userland/Libraries/LibGUI/Clipboard.cpp仅更新类型与元数据而不创建匿名缓冲。-c与文本互斥指定--clear时位置参数被忽略源码中if (clear)分支直接跳过数据采集。读取方GUI 应用通过GUI::Clipboard::fetch_data_and_type()取回DataAndType含数据、MIME 类型、元数据再依据类型决定如何解释文本类应用一般直接按 UTF-8 处理text/plain。小结copy用最简的命令行界面一个位置参数 两个选项封装了 SerenityOS 剪贴板的核心写入能力默认text/plain文本、-t指定任意 MIME 类型、-c清空剪贴板。其背后是LibGUI::Clipboard→ IPC portal →Clipboard::Storage的三层架构以及围绕 MIME 类型建立的元数据约定。配合系统剪贴板的手册文档 Base/usr/share/man/man5/clipboard.md 阅读即可完整理解命令行写入 → 服务端存储 → GUI 应用粘贴的整条数据链路。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表