#语法高亮 #tree-sitter #高亮 #高亮 #语法 #io写入

inkjet

基于 tree-sitter 的 Rust 语法高亮库,包含所有功能

16 个版本 (6 个破坏性更新)

0.10.5 2024 年 4 月 27 日
0.10.3 2024 年 1 月 29 日
0.10.2 2023 年 11 月 1 日

文本处理 中排名 226

Download history 112/week @ 2024-04-29 3/week @ 2024-05-06 19/week @ 2024-05-13 41/week @ 2024-05-20 15/week @ 2024-05-27 11/week @ 2024-06-03 30/week @ 2024-06-10 154/week @ 2024-06-17 25/week @ 2024-06-24 30/week @ 2024-07-01 37/week @ 2024-07-08 24/week @ 2024-07-15 22/week @ 2024-07-22 90/week @ 2024-07-29 44/week @ 2024-08-05 60/week @ 2024-08-12

每月下载 217
3 Crates 中使用(直接使用 2 个)

MIT/Apache

486MB
15M SLoC

C 15M SLoC // 0.0% comments Scheme 9K SLoC // 0.1% comments Rust 5.5K SLoC // 0.0% comments C++ 2K SLoC // 0.1% comments

Inkjet

基于 tree-sitter 的 Rust 语法高亮库,包含所有功能。

功能

  • 语言语法作为 C 函数链接到可执行文件中 - 不需要在运行时加载任何东西!
  • 可插拔的格式化程序。Inkjet 包含 HTML 格式化程序,编写自己的也很容易。
  • 根据您的用例,将高亮显示到新的 Stringstd::io::Write/std::fmt::Write 中。
  • 明确指定语言(来自 枚举)或使用类似 "rs""rust" 的标记进行查找。
  • 极其糟糕的 build.rs

包含的语言

Inkjet 随附了对七十多种语言的内置支持,并且很容易添加更多 - 请参阅常见问题解答部分。

点击展开...
名称 识别的标记
Ada ada
汇编(通用) asm
Astro astro
Awk awk
Bash bash
BibTeX bibtex, bib
Bicep bicep
Blueprint blueprint, blp
C c, h
Cap'N Proto capnp
Clojure clojure, clj, cljc
C# c_sharp, c#, csharp, cs
常用Lisp commonlisp, common-lisp, cl, lisp
C++ c++, cpp, hpp, h++, cc, hh
CSS css
Cue cue
D d, dlang
Dart dart
Diff diff
Dockerfile dockerfile, docker
EEx eex
Emacs Lisp elisp, emacs-lisp, el
Elixir ex, exs, leex
Elm elm
Erlang erl, hrl, es, escript
Forth forth, fth
Fortran fortran, for
GDScript gdscript, gd
Gleam gleam
GLSL glsl
Go go, golang
Haskell haskell, hs
HCL hcl, terraform
HEEx heex
HTML html, htm
IEx iex
INI ini
JavaScript javascript, js
JSON json
JSX jsx
Kotlin kotlin, kt, kts
LaTeX latex, tex
LLVM llvm
Lua lua
GNU Make make, makefile, mk
MatLab matlab, m
Meson meson
Nim nim
Nix nix
Objective C objective_c, objc
OCaml ocaml, ml
OCaml Interface ocaml_interface, mli
OpenSCAD openscad, scad
Pascal pascal
PHP php
ProtoBuf protobuf, proto
Python python, py
R r
Racket racket, rkt
Regex regex
Ruby ruby, rb
Rust rust, rs
Scala scala
Scheme scheme, scm, ss
SCSS scss
SQL (Generic) sql
Swift swift
TOML toml
TypeScript typescript, ts
TSX tsx
Vimscript vimscriptvim
WAST (WebAssembly Script) wast
WAT (WebAssembly Text) watwasm
x86 汇编 x86asmx86
WGSL wgsl
YAML yaml
Zig zig

除了这些语言,Inkjet 还提供了 RuntimePlaintext 语言。

  • Runtime 包含一个指向 fn() -> &'static HighlightConfiguration 指针,该指针用于在运行时解析语言。
  • Plaintext 允许廉价的空操作高亮。它在底层加载 diff 语法,但提供没有高亮查询。它别名为 nonenolang

Cargo 功能

  • (默认) html - 启用捆绑的 HTML 格式化工具,它依赖于 v_htmlescape
  • (默认) theme - 启用主题 API,它依赖于 ahashtomlserde
  • (默认) all-languages - 启用所有语言。
  • language-{name} - 启用指定的语言。
    • 如果您只想启用包含语言的一个子集,您必须设置 default-features=false 并手动重新添加您想要使用的每个语言。

常见问题解答

"为什么 Inkjet 那么大?"

tree-sitter 生成的解析器源代码可以非常大,有些大小可达数十兆字节。Inkjet 必须为它支持的所有语言捆绑这些源代码,因此它会累积。 (根据 loc,有超过 2300 万行 C 代码!)

如果您需要最小化二进制大小,请考虑禁用您不需要的语言。链接时间优化也可以节省几兆字节。

"为什么 Inkjet 构建需要这么长时间?"

因为它必须编译和链接数十个 C/C++ 程序(Inkjet 捆绑的每个语言的解析器和扫描器)。

然而,在第一次构建之后,这些工件将被缓存,后续构建应该会更快。

"为什么高亮需要对高亮器的可变引用?"

在底层,Inkjet 创建了一个 tree-sitter 高亮器/解析器对象,该对象反过来动态分配一块工作内存。因此,如果使用相同的高亮器执行多个同时作业,就会导致各种讨厌的不确定行为。

如果您想要并行高亮,您必须为每个线程创建高亮器的副本。如果您需要一个快速且简单的解决方案,我推荐使用 thread_local!RefCell

"我想高亮的语言没有捆绑在 Inkjet 中!"

假设您或其他人已经为要高亮的语言实现了准备好高亮的 tree-sitter 语法,将其添加到 Inkjet 中很容易!只需打开一个请求添加该语言的 issue,链接到该语言的语法仓库。

或者,您可以使用 Language::Runtime,这将允许您使用 Inkjet 捆绑之外的语言的语法。

其他注意事项

  • 喷墨打印目前仅支持检查由 tree-sitter 生成的解析器的语法存储库(以避免在构建时依赖 node/npm。)
  • Inkjet 要求语法至少包含一个针对基本 tree-sitter 库的 highlights.scm 查询。扩展查询(如来自 nvim-treesitter 的查询)将不起作用。
  • 我不会支持类似 Solidity 的区块链/智能合约语言。请将您的骗局支持者转移到其他地方。

构建

对于常规使用,Inkjet 将像任何其他 crate 一样自动编译。

但是,如果您已分叉了存储库并希望更新捆绑的语言,您需要设置一些环境变量

  • INKJET_REDOWNLOAD_LANGS 将清除 languages/ 目录并从头开始重新下载一切。
    • 目前,这仅在 *nix 上有效。您需要安装 gitsedwget。(Git 克隆语法存储库,而 sedwget 被用于一些语言的微型设置脚本。)
  • INKJET_REBUILD_LANGS_MODULE 将清除 src/languages.rs 并从头开始重新生成它。
  • INKJET_REBUILD_FEATURES 将在 crate 根目录中生成一个名为 features 的文件,其中包含所有单个语言功能(可粘贴到 Cargo.toml。)

这些变量的值无关紧要 - 只需设置即可。

此外

  • 您需要传递 --all-features 标志到 cargo 以使其工作 - 默认情况下,构建脚本的开发部分不会被编译。
  • 我建议在重新下载语言时运行 cargo build -vv,以便脚本进度可见。

致谢

  • Inkjet 的实现离不开 tree-sitter 和其周围的语法生态系统。
  • 许多语言的支持归功于 Helix 项目创建的突出显示查询。

依赖关系

~3.5–5.5MB
~102K SLoC