8 个不稳定版本 (3 个破坏性更新)

0.4.0 2024 年 7 月 27 日
0.3.0 2024 年 7 月 16 日
0.2.1 2024 年 7 月 1 日
0.1.3 2024 年 6 月 29 日

#42图形 API

Download history 96/week @ 2024-06-21 527/week @ 2024-06-28 26/week @ 2024-07-05 95/week @ 2024-07-12 22/week @ 2024-07-19 141/week @ 2024-07-26 7/week @ 2024-08-02

每月 265 次下载

MIT/Apache

75KB
1.5K SLoC

Termsnap 📸

从终端输出创建 SVG 图像

MIT/Apache 2.0 Crates.io Build status

Termsnap 将终端输出转换为矢量图形。它使用内存中的 Alacritty 实例以兼容许多终端控制序列。

用法

请参阅 $ termsnap --help 以获取 CLI 用法文档。例如,要运行 ls 命令并将输出存储在 SVG 文件中,请运行

$ termsnap -- ls -l > ./out.svg

示例

这些示例由 ./scripts/examples.sh 生成。注意,其中一些示例会向交互式 bash 会话发送自动输入。

Cowsay

$ termsnap --lines 9 --columns 28 -- cowsay Hello, world

Termsnap output of the cowsay command saying "hello world"

Neovim

# On exit, for some terminals, Neovim clears the terminal screen by swapping
# back to the main terminal screen buffer. The `--render-before-clear` argument
# renders the terminal screen as it was just prior to that swap occurring.
$ termsnap --lines 12 --columns 60 --term xterm-256color --render-before-clear -- nvim --clean ./scripts/example.py <<EOF
:set number
:syntax enable
:q
EOF

Termsnap output of example Python code viewed in Neovim

ANSI 颜色

$ (
    # `sleep` gives bash time to be ready for the command, if this is omitted
    # the appearance of prompts can get messed up.
    sleep 0.05
    echo -ne "for x in {16..231}; do printf \"\\\e[48;5;\${x}m%03d\\\e[0m \" \$x; done\r"
    sleep 0.05
) | termsnap --lines 16 --columns 72 -- bash --noprofile --rcfile "$PWD/scripts/inputrc"

Termsnap output of a dump of indexed terminal colors

TTY 信息

$ (
    sleep 0.05
    printf "echo \$-\r"
    sleep 0.05
    printf "tty\r"
    sleep 0.05
) | termsnap --lines 12 --columns 60 -- bash --noprofile --rcfile "$PWD/scripts/inputrc"

Termsnap output of some tty commands

Tokei

$ termsnap --lines 22 --columns 80 -- tokei

Termsnap output of the Tokei lines of code counter

安装

使用 Cargo 安装

$ cargo install termsnap

# Run ls
$ termsnap --columns 80 --lines 36 -- ls --color=always -l

# Run an interactive bash session
$ termsnap --interactive --out ./interactive-bash.svg -- bash

使用 Nix flakes 运行

# Run ls
$ nix run nixpkgs#termsnap -- --columns 80 --lines 36 -- ls --color=always -l

# Run an interactive bash session
$ nix run nixpkgs#termsnap -- --interactive --out ./interactive-bash.svg -- bash

上面的操作是从 nixpkgs 仓库获取 Termsnap。要使用此存储库主分支上的最新版本,请将 nixpkgs#termsnap 替换为 github:tomcur/termsnap

关于字体的说明

Termsnap 生成的 SVG 对用于文本渲染的字体度量做出了假设。具体来说,使用字体的字符进位、行高和下降度量来确定如何在生成的 SVG 中布局终端的单元格。可以通过传递 --font-{advance,line-height,descent} 参数来覆盖默认度量。您可以使用 CLI 程序 font-info 确定您要使用的字体的度量。或者,您可以使用字体编辑器 Fontforge

字体未嵌入,文本未转换为路径。如果客户端渲染SVG时找不到指定的字体,SVG可能渲染不正确,特别是如果用于渲染的字体度量与生成SVG时使用的度量有显著差异时。您可以使用例如Inkscape将文本转换为路径——缺点是在低分辨率渲染时文本可能会失去清晰度。您还可以将SVG转换为位图。

# Text to path
$ inkscape --export-text-to-path --export-plain-svg --export-filename=./out.svg ./in.svg

# Render to raster image
$ inkscape --export-width=800 --export-filename=./out.png ./in.svg

依赖项

约6-19MB
约208K SLoC