- stinkpot は Bash のコマンド履歴を SQLite に保存してセッションに依存せず管理し、検索 TUI ですばやく見つけられるようにする
- Atuin から同期サーバー、AI、dotfiles・スクリプト管理、KV ストアを取り除き、必要な機能だけを 約400行の Go で実装している
- 既存の Bash 履歴は
stinkpot importで取り込み、Ctrl+Rを押すと 逆方向検索 TUI が開く - NixOS では home-manager モジュール を提供し、それ以外の環境では
.bashrcでeval "$(stinkpot init)"により初期化する - データベースは
~/.local/share/stinkpotに保存され、アップグレード後に壊れた場合は削除してから履歴を再インポートできる
Atuinから必要な機能だけを分離
- stinkpot は Atuin を使う中で、セッション非依存の履歴管理と検索 TUI だけが必要だった経験から始まった
- 同期サーバー、Atuin AI、dotfiles マネージャー、スクリプトマネージャー、KV ストアは含まない
- マシンごとに設定と実行コマンドが大きく異なるため、同期機能も使っていなかった
- プロジェクトは約 400行の Go で書かれており、リポジトリの言語構成比は Go 82.5%、Nix 17.5% となっている
- 名前は小型のカメの一種
stinkpotに由来する - 逆方向検索を高速化するため、SQLite の実行計画ではソート用の一時 B-tree ではなく カバリングインデックス (covering index) を使っている
インストールと履歴検索
- ソースからは次のコマンドでビルドする
go build -o stinkpot .
- NixOS の home-manager ユーザーは、提供されている
homeManagerModules.defaultモジュールを取り込める - それ以外の環境では
.bashrcに次の初期化コマンドを追加する
eval "$(stinkpot init)"
- 既存の Bash 履歴は次のコマンドで取り込む
stinkpot import
- シェルで
Ctrl+Rを押すと検索 TUI が開く↑・↓で移動し、TabまたはEnterで選択する- 選択後に
Enterをもう一度押すとコマンドを実行する Escでキャンセルする
- 履歴 DB は
~/.local/share/stinkpotに保存される- アップグレード後に DB が壊れた場合はファイルを削除し、
stinkpot importを再実行する
- アップグレード後に DB が壊れた場合はファイルを削除し、
1件のコメント
Lobste.rs のコメント
?を入力したら、Atuin が AI モードを有効にするか尋ねてきて、どれほど肥大化したのかを思い知った遠慮しておく。紹介してくれたおかげで、もう stinkpot に乗り換えた
特に 400行の Go コードで、シンプルな静的最小バイナリを作っている点がいい。Go は全体的に優れた言語で、stinkpot も使ってみるつもり
hstr を約15年使っており、最近は fzf に移行しつつある。SQLite 自体はとても好きだが、この用途に必要な理由は理解できなかった
デフォルトの履歴ファイルは構造化されていないが、SQLite には終了コードや終了時刻のようなデータを保存でき、挿入時の重複排除や同じコマンドを再実行したときの実行時刻更新のような処理も高速に行える
理論的にはコマンド履歴から文脈を苦労して復元できるが、プロジェクトディレクトリごとにシェル履歴をすばやく参照できるなら、かなり便利そう
それでもちゃんと動くという利点はあるが、長いこと更新していない可能性が高い
cwdでフィルタリングできるのか気になる。コマンド履歴の基準をディレクトリにできる点が、Atuin を使う唯一の理由プロジェクトに
cdしたあと、以前止めたところからすぐ続けられ、引数の多い長いコマンドを再実行するときは特に便利cwdが記録され、標準のbash_historyにはこの情報がない可能なら公開ライセンスを追加したうえで、experimental oils readline に統合したい。動的ウィジェットを完成させたあとに取り組む最優先 TODO の1つがコマンド履歴
まれにシェル履歴から数行のコマンドを削除する必要があり、従来の方法では
bash_historyを直接開いて該当行を消せた。stinkpot に履歴削除コマンドがあるのか気になるこうした特殊な用途は別として、プロジェクト自体はかなり興味深そう