16 个版本 (6 个破坏性更新)
0.10.5 | 2024 年 4 月 27 日 |
---|---|
0.10.3 | 2024 年 1 月 29 日 |
0.10.2 | 2023 年 11 月 1 日 |
在 文本处理 中排名 226
每月下载 217 次
在 3 个 Crates 中使用(直接使用 2 个)
486MB
15M SLoC
Inkjet
基于 tree-sitter
的 Rust 语法高亮库,包含所有功能。
功能
- 语言语法作为 C 函数链接到可执行文件中 - 不需要在运行时加载任何东西!
- 可插拔的格式化程序。Inkjet 包含 HTML 格式化程序,编写自己的也很容易。
- 根据您的用例,将高亮显示到新的
String
或std::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 | vimscript ,vim |
WAST (WebAssembly Script) | wast |
WAT (WebAssembly Text) | wat ,wasm |
x86 汇编 | x86asm ,x86 |
WGSL | wgsl |
YAML | yaml |
Zig | zig |
除了这些语言,Inkjet 还提供了 Runtime
和 Plaintext
语言。
Runtime
包含一个指向fn() -> &'static HighlightConfiguration
指针,该指针用于在运行时解析语言。Plaintext
允许廉价的空操作高亮。它在底层加载diff
语法,但提供没有高亮查询。它别名为none
和nolang
。
Cargo 功能
- (默认)
html
- 启用捆绑的 HTML 格式化工具,它依赖于v_htmlescape
。 - (默认)
theme
- 启用主题 API,它依赖于ahash
、toml
和serde
。 - (默认)
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 上有效。您需要安装
git
、sed
和wget
。(Git 克隆语法存储库,而sed
和wget
被用于一些语言的微型设置脚本。)
- 目前,这仅在 *nix 上有效。您需要安装
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