tmuxのwindowのキャプチャを撮る
Claude Codeとのやりとりを残しておきたいので、どうやろうか考えていたら
tmuxの中でやってるのだからtmux windowを上から下まで全部撮影すればいいではないかと気づいた
そしてできたのが
code:tmux-capture(sh)
#!/bin/bash
# 保存先ディレクトリを作成(存在しない場合)
save_dir="$HOME/tmux-captures"
mkdir -p "$save_dir"
output_file="$save_dir/$(date +%Y%m%d-%H%M%S).txt"
# 引数がない場合は現在のペインの内容を保存
if $# -eq 0 ; then
tmux capture-pane -S - -E - -p > "$output_file"
echo "現在のペインの内容を保存しました: $output_file"
exit 0
fi
# 引数がある場合は指定されたセッション:ウィンドウの内容を保存
content=$(tmux capture-pane -t $1 -S - -E - -p)
echo "$content" > "$output_file"
total_lines=$(echo "$content" | wc -l | tr -d ' ')
head_lines=$(echo "$content" | head -n 10)
tail_lines=$(echo "$content" | tail -n 10)
echo "セッション:ウィンドウ '$1' の内容を保存しました: $output_file (全 $total_lines 行)"
echo "先頭10行:"
echo "$head_lines"
echo "..."
echo "末尾10行:"
echo "$tail_lines"
実行方法
$ tmux-capture 1:0
session番号1、window番号0を撮影する
実行結果
https://scrapbox.io/files/67e4c81fc3e0d7a5047b4754.png
先頭と末尾の10行ずつが見れる
誤ったウィンドウを撮影してもすぐ気づけて便利
~/tmux-captures/日時.txtに保存される
ディレクトリは無ければ作成される
このツールを作った時のsession
code:txt
╭────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code research preview! │
│ │
│ /help for help │
│ │
│ cwd: /Users/shokai │
╰────────────────────────────────────────────╯
あるtmux windowに表示されているテキストをまるごとテキストファイルに保存したい。上から下までぜんぶ
⏺ Search(pattern: "tmux\s+capture-pane")…
⎿  Found 0 files
⏺ tmux の capture-pane コマンドと save-buffer コマンドを使うことができます:
tmux capture-pane -S - -E - -p > output.txt
特定のウィンドウを指定するには:
tmux capture-pane -t セッション名:ウィンドウ番号.ペイン番号 -S - -E - -p > output.txt
ペインって何ですか?画面分割?
⏺ はい、ペインはtmuxの画面分割のことです。1つのウィンドウを複数の領域(ペイン)に分割できる機能です。
画面分割してない場合はどうすればいいですか?
⏺ 画面分割していない場合(単一ペインの場合)は、ペイン番号を省略できます:
tmux capture-pane -t セッション名:ウィンドウ番号 -S - -E - -p > output.txt
もしくは、現在アクティブなペインの内容を保存する場合は単に:
tmux capture-pane -p > output.txt
SとかEはstart endのオプションですか?指定しないとどうなりますか?
⏺ はい、-S と -E は「start」と「end」を意味するオプションです。
指定しない場合:
- デフォルトでは、-S は 0(先頭)
- -E はペインの現在の高さ(表示範囲)
-S - と -E - を使うと、スクロールバッファの全履歴(上から下まで全て)を取得します。
オプションなしで実行すると、現在見えている範囲だけが保存されます。
便利ですね。長いので、素早く呼び出すコマンドを bin/ に実行権限付きで作ってほしい。
引数は セッション番号:ウィンドウ番号 の部分だけでいい
⏺ List(path: "bin")…
⎿  - /Users/shokai/
- bin/
- anago
- edishon-sshfs-mount
… +1000 items (ctrl+r to see all)
⏺ Write(file_path: bin/tmux-save)…
⎿ Wrote 12 lines to bin/tmux-save
#!/bin/bash
# 引数がない場合は現在のペインの内容を保存
if $# -eq 0 ; then
tmux capture-pane -S - -E - -p > tmux-output-$(date +%Y%m%d-%H%M%S).txt
echo "現在のペインの内容を保存しました: tmux-output-$(date +%Y%m%d-%H%M%S).txt"
exit 0
fi
# 引数がある場合は指定されたセッション:ウィンドウの内容を保存
… +2 lines (ctrl+r to see all)
⏺ Bash(chmod +x /Users/shokai/bin/tmux-save)…
⎿  (No content)
⏺ tmux-save
コマンドを作成しました。引数なしで実行すると現在のペインの内容を、引数ありで実行すると指定したセッション:ウィンドウの内容をファイルに保存します。
コマンド名はtmux-captureがいい
⏺ Bash(mv /Users/shokai/bin/tmux-save /Users/shokai/bin/tmux-capture)…
⎿  (No content)
⏺ コマンド名を tmux-capture に変更しました。
引数なしだと現在のpaneを保存するのは気が利いてますね
⏺ ありがとうございます。デフォルトで現在のペインを保存するようにしたので、日常的な使用では引数なしで簡単に実行できます。必要な時だけ特定のセッション
:ウィンドウを指定できるようにしました。
出力ファイル名もtmux-output-ではなくtmux-capture-がいい
⏺ Read(file_path: "bin/tmux-capture")…
⎿  #!/bin/bash
# 引数がない場合は現在のペインの内容を保存
… +9 lines (ctrl+r to see all)
⏺ Update(file_path: bin/tmux-capture)…
⎿ Updated bin/tmux-capture with 4 additions and 4 removals
2
3 # 引数がない場合は現在のペインの内容を保存
4 if $# -eq 0 ; then
5 tmux capture-pane -S - -E - -p > tmux-output-$(date +%Y%m%d-%H%M%S).txt
6 echo "現在のペインの内容を保存しました: tmux-output-$(date +%Y%m%d-%H%M%S).txt"
5 tmux capture-pane -S - -E - -p > tmux-capture-$(date +%Y%m%d-%H%M%S).txt
6 echo "現在のペインの内容を保存しました: tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
7 exit 0
8 fi
9
10 # 引数がある場合は指定されたセッション:ウィンドウの内容を保存
11 tmux capture-pane -t $1 -S - -E - -p > tmux-output-$(date +%Y%m%d-%H%M%S).txt
12 echo "指定されたペインの内容を保存しました: tmux-output-$(date +%Y%m%d-%H%M%S).txt"
11 \ No newline at end of file
12 tmux capture-pane -t $1 -S - -E - -p > tmux-capture-$(date +%Y%m%d-%H%M%S).txt
13 echo "指定されたペインの内容を保存しました: tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
14 \ No newline at end of file
⏺ 出力ファイル名を tmux-capture- に変更しました。
ウィンドウ番号とセッション番号を指定した場合に、それが意図した番号と合っているのかわからないので、実行後のアウトプットを工夫してほしい
キャプチャした先頭5行、末尾の5行、全体の行数を表示しましょう
⏺ 良いアイデアです。実装します。
⏺ Read(file_path: "bin/tmux-capture")…
⎿  #!/bin/bash
# 引数がない場合は現在のペインの内容を保存
… +9 lines (ctrl+r to see all)
⏺ Update(file_path: bin/tmux-capture)…
⎿ User rejected update to bin/tmux-capture
1 #!/bin/bash
2
3 output_file="tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
4
5 # キャプチャの概要を表示する関数
6 display_capture_info() {
7 local content=$1
8 local total_lines=$(echo "$content" | wc -l | tr -d ' ')
9
10 # 先頭5行を取得
11 local head_lines=$(echo "$content" | head -n 5)
12
13 # 末尾5行を取得
14 local tail_lines=$(echo "$content" | tail -n 5)
15
16 echo "保存しました: $output_file (全 $total_lines 行)"
17 echo "先頭5行:"
18 echo "$head_lines"
19 echo "..."
20 echo "末尾5行:"
21 echo "$tail_lines"
22 }
23
24 # 引数がない場合は現在のペインの内容を保存
25 if $# -eq 0 ; then
26 tmux capture-pane -S - -E - -p > tmux-capture-$(date +%Y%m%d-%H%M%S).txt
27 echo "現在のペインの内容を保存しました: tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
26 content=$(tmux capture-pane -S - -E - -p)
27 echo "$content" > "$output_file"
28 echo "現在のペインの内容を保存しました"
29 display_capture_info "$content"
30 exit 0
31 fi
32
33 # 引数がある場合は指定されたセッション:ウィンドウの内容を保存
34 tmux capture-pane -t $1 -S - -E - -p > tmux-capture-$(date +%Y%m%d-%H%M%S).txt
35 echo "指定されたペインの内容を保存しました: tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
34 \ No newline at end of file
35 content=$(tmux capture-pane -t $1 -S - -E - -p)
36 echo "$content" > "$output_file"
37 echo "セッション:ウィンドウ '$1' の内容を保存しました"
38 display_capture_info "$content"
39 \ No newline at end of file
引数指定なしで実行した場合はプレビュー不要です
⏺ 了解です。引数指定があった場合のみプレビューを表示するように修正します。
⏺ Update(file_path: bin/tmux-capture)…
⎿ Updated bin/tmux-capture with 16 additions and 4 removals
1 #!/bin/bash
2
3 output_file="tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
4
5 # 引数がない場合は現在のペインの内容を保存
6 if $# -eq 0 ; then
7 tmux capture-pane -S - -E - -p > tmux-capture-$(date +%Y%m%d-%H%M%S).txt
8 echo "現在のペインの内容を保存しました: tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
7 tmux capture-pane -S - -E - -p > "$output_file"
8 echo "現在のペインの内容を保存しました: $output_file"
9 exit 0
10 fi
11
12 # 引数がある場合は指定されたセッション:ウィンドウの内容を保存
13 tmux capture-pane -t $1 -S - -E - -p > tmux-capture-$(date +%Y%m%d-%H%M%S).txt
14 echo "指定されたペインの内容を保存しました: tmux-capture-$(date +%Y%m%d-%H%M%S).txt"
13 \ No newline at end of file
14 content=$(tmux capture-pane -t $1 -S - -E - -p)
15 echo "$content" > "$output_file"
16 total_lines=$(echo "$content" | wc -l | tr -d ' ')
17 head_lines=$(echo "$content" | head -n 5)
18 tail_lines=$(echo "$content" | tail -n 5)
19
20 echo "セッション:ウィンドウ '$1' の内容を保存しました: $output_file (全 $total_lines 行)"
21 echo "先頭5行:"
22 echo "$head_lines"
23 echo "..."
24 echo "末尾5行:"
25 echo "$tail_lines"
26 \ No newline at end of file
⏺ 引数指定があった場合のみプレビューを表示するように修正しました。引数なしで実行する場合はシンプルに保存先のみ表示します。
tmux-capture
⏺ tmux-capture コマンドを実行すると、現在のペインの内容が保存されます。引数としてセッション:ウィンドウ番号を指定すると、そのペインの内容を保存し、内
容のプレビューも表示されます。
実行例:
# 現在のペインを保存
tmux-capture
# 特定のセッション:ウィンドウを指定して保存
tmux-capture 0:1
実行して
⏺ 現在のシェルで直接コマンドを実行します:
Bash(/Users/shokai/bin/tmux-capture)…
✳ Actualizing… (0s · esc to interrupt)
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ >  │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
? for shortcuts