panlog
panlog というのを作って使っています。
tanlog - 兼雑記 — https://shinh.hatenablog.com/entry/2017/02/12/031105 の tanlog をもじって、 tmux の pane のログを録る、ということで、 panlog です。ディレクトリ構成は、ほぼ GitHub - omakoto/zenlog — https://github.com/omakoto/zenlog のものを頂きました。
インストール
以下のように、例えば ~/c/stuff/panlog を作るとして。
% mkdir ~/c/stuff/panlog % cd $_ % git clone https://git.sr.ht/~hchbaw/panlog
~/.zshrc には、 autoload -Uz panlog-init && panlog-init を追加します。
panlog-init はデフォルトで、 panlog-start を preexec フックに登録するので、常にログが保存されることになります。常に保存されるのは困る(パスワード等を保存したくない)ので、カスタマイズできるように、 preexec フックに登録する関数を取ります。私の場合、以下のように panlog-start-maybe を呼ぶようにしています。
if [[ -n "${TMUX-}" ]]; then fpath[1,0]=~/c/stuff/panlog/panlog autoload -Uz panlog-init panlog-init panlog-start-maybe fpath[1,0]=~/c/stuff/panlog/misc autoload -Uz panlog-start-p panlog-start-maybe () { if panlog-start-p "$@"; then panlog-start "$@" else panlog_logfile= fi } alias nopan=nopanlog nopanlog () "$@" compdef _precommand nopanlog fi
panlog-start-p は以下です。
#!zsh panlog-start-p () { setopt localoptions extendedglob case "$1" in ([[:space:]]#nopan(log)#([[:space:]]##*|(#e))) return 1 ;; ([[:space:]]#ssh([[:space:]]##*|(#e))) return 1 ;; ([[:space:]]#tmux[[:space:]]##attach([[:space:]]##*|(#e))) return 1 ;; esac return 0 } panlog-start-p "$@"
使い方
/var/tmp/panlog の下にログファイルを作ります。ここを hash -d しているので、インタラクティブシェルでは、 ~pan で参照できます。
- ~pan/var/RAW/2006/01/02/2006-01-02T13:04:05,00+07:00
-
ログの実体です。テンポラリファイルに tmux pipe-pane cat をリダイレクトして、最後に ln してテンポラリファイルを削除しています。
- ~pan/var/SAN/2006/01/02/2006-01-02T13:04:05,00+07:00
-
上記ファイルをエスケープシーケンスを処理して (pan-san.zsh) 作成しています。 tmux に描画させて capture-pane -p しています。
- ~pan/S
-
上記ファイルの最新版へのソフトリンクです。
- ~pan/SS...
-
一つ前のファイル… と続いて、 S が 10 ヶまでをローテートしています。
- ~pan/R...
-
ログの実体へのソフトリンクです。 S と同様に、 10 ヶまで。
- ~pan/cmds/make
-
make コマンド毎の出力です。上記同様 ~pan/cmds/make/{R,S,var} があります。
- ~pan/%/$TMUX_PANE
-
$TMUX_PANE 毎の出力です。同じようなコマンドは、同じ $TMUX_PANE で実行することが多いかもしれない、と思って置いてあります。ここを hash -d して ~pam で参照できるようにしています。 ~pam/{R,S,var} があります。
例えば実際に、最近 firefox-latest をダウンロードしたのは、と awk でザックリと、
% awk 'FNR == 1 && !/firefox-latest/ { nextfile; } /^Location:/ { print $2; exit; }' ~pan/cmds/curl/S* https://download-installer.cdn.mozilla.net/pub/firefox/releases/107.0/linux-x86_64/en-US/firefox-107.0.tar.bz2
という感じで、結構雑なスクリプトで欲しいデータを抜き出したりしています。
最後に。
過去に、作業した出力で欲しい情報が tmux や、ターミナルのスクロールバッファに残っていて助かった、ということがよくあったりするのだけれども、それらが常に残っている、というのはやはり心強いな、と思っています。