ターミナルに表示されている情報を色付き・テキストで保存する方法や、それを表示する方法を調べた。

前提

注意 もっと複雑なものもある1が一番簡単なものをまとめる

ターミナルは単純にシェルの標準出力を表示するだけではなく、そこにansi escape sequenceが入ってるとそれに応じてテキストを装飾することがある。

Juliaの`printstyled`を使った装飾付き出力

Juliaのprintstyledを使った装飾付き出力

しかし、一般的にターミナルの文字をコピーしようとすると表示されているテキストのみがコピーされ、色の情報などは失われてしまう。 この記事では装飾とテキストの両方の情報を残す方法について紹介する。

環境

前提で書いた通り、ターミナルの段階で装飾の情報は失われるので、どのターミナルを使うかに方法は依存している。

今回紹介する方法はtmuxを使った方法となる23

方法

保存方法

tmux capture-pane -e

詳しくはman tmuxcapture-paneで検索。

-eでescape sequenceを入れてくれる。 -Jするとwrapしない。 -pで標準出力に出力。 デフォルトはバッファー(yankしたときに入るところ)。 -Sで開始行、-Eで終了行を指定。 デフォルトだと表示している範囲をキャプチャする。 0が表示されている一番上の行で、下の行の方向に正。 なので過去の履歴からキャプチャするときは負値を指定する。 -tでターゲットとなるペインを指定。 デフォルトだと現在操作中のペイン。 自分の環境(session “0"1つ)だと、ペイン名は<window number>.<pane number>だった。 なおfish使ってたら補完でいい感じに出てくるので心配しなくて良い。

これを適当なファイルに保存する。

表示方法

catすればいい。

もしくはless -R。 自分は環境変数LESS-Rはいつも入れているので、tmux capture-pane -eJp | lessしている。

typstで

ansi-renderなる素晴らしいプラグインがあった。

#ansi-render(read("file_name"))

でOk。

こんな感じで使える。 Misskeyの投稿

forgejoに例を上げている。 (forgejoはansi escape sequence付きテキストファイルに色を付けて表示してくれた。多分CIの結果表示するときに使われるんだろう。)

neovimで

ansi.nvimが使えそう? まだ試してない。

yaziで

ただのテキストファイルなので、デフォルトだと$EDITORとかで開くはず。 自分はlessで開くオプションを追加した。

dotfilesのコミット

HTMLに変換して

ahaなるソフトがあるらしい4

微妙なところ

-Sおよび-Eでの範囲指定が非常にやりづらい。 インタラクティブに結果を見ながらいじられるようにしたい。

追記: sixel

自分の環境(tmux on wezterm)だと、sixelが部分的にしか機能しない。

例えば、

  • img2sixelだと結果が表示されない。
  • lsixは正常に動く
  • tdfは動かない (Couldn’t transfer image to the terminal. 外部からkillしないと死なない)
  • yaziは正常に動く(weztermを直接検出してるっぽい)5
  • w3mはカーソルを動かした瞬間一瞬だけ表示される

yazi –debug
Yazi
    Version: 26.1.22 (Arch Linux 2026-01-24)
    Debug  : false
    Triple : x86_64-unknown-linux-gnu (linux-x86_64)
    Rustc  : 1.93.0 (254b5960 2026-01-19)

Ya
    Version: 26.1.22 (Arch Linux 2026-01-24)

Config
    Init             : /home/qwjyh/.config/yazi/init.lua (376 chars)
    Yazi             : /home/qwjyh/.config/yazi/yazi.toml (595 chars)
    Keymap           : /home/qwjyh/.config/yazi/keymap.toml (1296 chars)
    Theme            : /home/qwjyh/.config/yazi/theme.toml (No such file or directory (os error 2))
    VFS              : /home/qwjyh/.config/yazi/vfs.toml (No such file or directory (os error 2))
    Package          : /home/qwjyh/.config/yazi/package.toml (330 chars)
    Dark/light flavor: "" / ""

Emulator
    TERM                : Some("xterm-256color")
    TERM_PROGRAM        : Some("tmux")
    TERM_PROGRAM_VERSION: Some("3.6a")
    Brand.from_env      : Some(WezTerm)
    Emulator.detect     : Emulator { kind: Left(WezTerm), version: "WezTerm 20240203-110809-5046fc22", light: false, csi_16t: (11, 20), force_16t: false }

Adapter
    Adapter.matches    : Iip
    Dimension.available: Dimension { rows: 82, columns: 123, width: 1353, height: 1640 }

Desktop
    XDG_SESSION_TYPE           : Some("x11")
    WAYLAND_DISPLAY            : None
    DISPLAY                    : Some(":0.0")
    SWAYSOCK                   : None
    HYPRLAND_INSTANCE_SIGNATURE: None
    WAYFIRE_SOCKET             : None

SSH
    shared.in_ssh_connection: false

WSL
    WSL: false

Variables
    SHELL              : Some("/usr/bin/bash")
    EDITOR             : Some("/usr/bin/nvim")
    VISUAL             : None
    YAZI_FILE_ONE      : None
    YAZI_CONFIG_HOME   : None
    YAZI_ZOXIDE_OPTS   : None
    FZF_DEFAULT_OPTS   : None
    FZF_DEFAULT_COMMAND: None

Text Opener
    default     : Some(OpenerRule { run: "${EDITOR:-vi} %s", block: true, orphan: false, desc: "$EDITOR", for: None, spread: true })
    block-create: Some(OpenerRule { run: "${EDITOR:-vi} %s", block: true, orphan: false, desc: "$EDITOR", for: None, spread: true })
    block-rename: Some(OpenerRule { run: "${EDITOR:-vi} %s", block: true, orphan: false, desc: "$EDITOR", for: None, spread: true })

Multiplexers
    TMUX               : true
    tmux version       : tmux 3.6a
    tmux build flags   : enable-sixel=Supported
    ZELLIJ_SESSION_NAME: None
    Zellij version     : 0.43.1

Dependencies
    file          : 5.46
    ueberzugpp    : No such file or directory (os error 2)
    ffmpeg/ffprobe: 8.0.1 / 8.0.1
    pdftoppm      : 26.01.0
    magick        : 7.1.2-13
    fzf           : 0.67.0
    fd/fdfind     : 10.3.0 / No such file or directory (os error 2)
    rg            : 15.1.0
    chafa         : 1.18.0
    zoxide        : 0.9.9
    7zz/7z        : No such file or directory (os error 2) / 26.00
    resvg         : 0.47.0
    jq            : 1.8.1

Clipboard
    wl-copy/paste: No such file or directory (os error 2) / No such file or directory (os error 2)
    xclip        : 0.13
    xsel         : No such file or directory (os error 2)

Routine
    `file -bL --mime-type`: text/plain


See https://yazi-rs.github.io/docs/plugins/overview#debugging on how to enable logging or debug runtime errors.

なんで動かないのかわかってないので知見があるかたお知らせ下さい(コメント機能などでどうぞ)。


  1. 例えばsixel始め画像を表示するためのプロトコルがあるし、kittyはテキストのサイズなどをいじる機能もあるらしい。 ↩︎

  2. シェルが見るのはtmuxでtmuxがホストのterminfoを更に参照する。 ↩︎

  3. 例えばmacOSのterminalだとrtfでクリップボードにコピーしてくれるらしい? ↩︎

  4. https://forums.linuxmint.com/viewtopic.php?t=375920 ↩︎

  5. ところでyaziのdebug出力が詳細ですごい(yazi --debug↩︎