首页 >后端开发 >C++ >Wombat - 使用从 Crystal 调用的 Rust 的 Bat 进行语法高亮显示

Wombat - 使用从 Crystal 调用的 Rust 的 Bat 进行语法高亮显示

Barbara Streisand
Barbara Streisand原创
2025-01-16 14:04:58301浏览

Wombat - Syntax Highlighting with Rust

简介

本文探讨了使用基于 Rust 的命令行工具 bat 作为 Crystal 中的库,Crystal 是一种目前缺乏强大的语法突出显示库的语言。 batcat 类似,显示文件内容,但提供行号、语法突出显示和分页等增强功能。

<code>bat hello.rb</code>

利用 bat 作为库可以解决此 Crystal 限制。

bat 作为 Rust 库

batPrettyPrinter 结构使其可以用作 Rust 库。 然而,bat 对复杂 Syntect 库的语法突出显示的依赖最初提出了一个挑战。 为了简化这一点,在 print_with_writer 中添加了 PrettyPrinter 函数,允许直接字符串语法突出显示。此添加是通过拉取请求贡献的,可从 bat 版本 0.25.0 开始使用。

<code class="language-rust">use bat::PrettyPrinter;

// ... code utilizing print_with_writer ...</code>

创建 C 包装器:bat-c

由于 Rust 库无法直接从 Crystal 调用,因此创建了一个轻量级 C 包装库 bat-c。这允许从 Crystal 和其他具有 C 互操作性的语言访问 bat。 由于作者的 Rust 和 C 专业知识有限,bat-c 的开发大量使用了 ChatGPT 和 Copilot。 bat-c 存储库位于:https://www.php.cn/link/065982e894fcde21153454b2ea4b2a8a

构建bat-c的关键考虑因素包括:

  • 内存管理:仔细处理字符串内存分配和释放以防止泄漏。 Rust 分配的内存需要相应的 Rust 端释放函数。
  • Cargo.toml 配置: 配置 Cargo.toml 生成动态 (cdylib) 和静态 (staticlib) 库,从而实现使用的灵活性。 rpath = true 允许相对路径库位置。 使用 LTO 和 codegen-units = 1 发布配置文件优化。
  • 版本控制:添加了版本函数(bat_c_version),将版本存储在静态内存中以便于访问。
  • Renovate 集成: Renovate 已实现自动库版本更新。
  • GitHub 操作: 创建 Git 标签时自动发布触发器。 cargo publish 被避免,因为 bat-c 是一个纯 C 库。

从水晶呼叫bat-cwombat

水晶库 wombat 是为了简化与 bat-c 的交互而开发的。 主要挑战是管理 bat-c 库的下载和放置。 由于 bat-c 尚未广泛分发,因此选择直接从 GitHub Releases 下载。 静态库因其与 Crystal 的无缝集成而受到青睐。 下载过程通过 shards post_install 挂钩处理,使用 curl (类 Unix)或批处理脚本 (Windows)。

使用示例

wombat 库提供以下功能:

  • pretty_print_file:突出显示文件的语法。
  • pretty_print:语法突出显示字符串。
  • pretty_string:返回突出显示的字符串。
<code>bat hello.rb</code>

GitHub Actions 工作流程

Wombat - Syntax Highlighting with Rust

需要改进的地方

  • 库大小:生成的库比较大。
  • API 设计: API 可以受益于更精致的设计,最好考虑到最初 Rust 开发的 C 兼容性。
  • Rust/C 专业知识:改进 Rust 和 C 知识将带来更高效、更完善的库。

尽管存在这些需要改进的地方,该项目还是成功实现了其主要目标:在 Crystal 中实现 bat 的轻松且可维护的使用。 作者欢迎贡献并发表报告。

(Qiita 上的原始日文帖子:Wombat - RustのBatをCrystalから呼び出しシンタkksuハairaイティングする。ChatGPT 的英文翻译。)

以上是Wombat - 使用从 Crystal 调用的 Rust 的 Bat 进行语法高亮显示的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn