1 ポイント 投稿者 GN⁺ 2 시간 전 | 1件のコメント | WhatsAppで共有
  • stinkpot は Bash のコマンド履歴を SQLite に保存してセッションに依存せず管理し、検索 TUI ですばやく見つけられるようにする
  • Atuin から同期サーバー、AI、dotfiles・スクリプト管理、KV ストアを取り除き、必要な機能だけを 約400行の Go で実装している
  • 既存の Bash 履歴は stinkpot import で取り込み、Ctrl+R を押すと 逆方向検索 TUI が開く
  • NixOS では home-manager モジュール を提供し、それ以外の環境では .bashrceval "$(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 を再実行する

1件のコメント

 
GN⁺ 2 시간 전
Lobste.rs のコメント
  • 今週、プロンプトでうっかり ? を入力したら、Atuin が AI モードを有効にするか尋ねてきて、どれほど肥大化したのかを思い知った
    遠慮しておく。紹介してくれたおかげで、もう stinkpot に乗り換えた
  • シェルのコマンド履歴を失って苦労したことがあるので、このプロジェクトは本当に気に入った。atuin.sh も試したが、あまり満足できなかった
    特に 400行の Go コードで、シンプルな静的最小バイナリを作っている点がいい。Go は全体的に優れた言語で、stinkpot も使ってみるつもり
  • hstrfzf のように履歴ファイルを直接読むツールと比べて、ここで SQLite を使うと何が良くなるのか気になる
    hstr を約15年使っており、最近は fzf に移行しつつある。SQLite 自体はとても好きだが、この用途に必要な理由は理解できなかった
    • Bash がコマンド実行後に毎回履歴をファイルへ書き込むようにすれば、fzf だけでも同じように実装できる
      デフォルトの履歴ファイルは構造化されていないが、SQLite には終了コードや終了時刻のようなデータを保存でき、挿入時の重複排除や同じコマンドを再実行したときの実行時刻更新のような処理も高速に行える
    • 各履歴項目の現在の作業ディレクトリを保存してインデックスする用途を考えてみた
      理論的にはコマンド履歴から文脈を苦労して復元できるが、プロジェクトディレクトリごとにシェル履歴をすばやく参照できるなら、かなり便利そう
  • 確かに使ってみる価値はある。Atuin は、ほとんど関心のない機能でいっぱいの機能の動物園になってしまった
    それでもちゃんと動くという利点はあるが、長いこと更新していない可能性が高い
    • Atuin は以前から知っていたが、今週になって初めて使ってみた。今の流れだと、そのうちメールまで読み始めそう
  • 良さそうだが、履歴を cwd でフィルタリングできるのか気になる。コマンド履歴の基準をディレクトリにできる点が、Atuin を使う唯一の理由
    プロジェクトに cd したあと、以前止めたところからすぐ続けられ、引数の多い長いコマンドを再実行するときは特に便利
    • fish はこの機能を標準で提供しており、とても便利
    • 個人的に好みの挙動ではないが、1つの制約の下で実装可能。stinkpot インストール後に実行したコマンドだけ cwd が記録され、標準の bash_history にはこの情報がない
  • 他の人が安心してコードを使えるようにするには、プロジェクトにライセンスを追加したほうがいい
    可能なら公開ライセンスを追加したうえで、experimental oils readline に統合したい。動的ウィジェットを完成させたあとに取り組む最優先 TODO の1つがコマンド履歴
  • 履歴からコマンドをどれだけ簡単に削除できるのか気になる。SQLite データベースから SQL で直接行を削除する必要があるのか知りたい
    まれにシェル履歴から数行のコマンドを削除する必要があり、従来の方法では bash_history を直接開いて該当行を消せた。stinkpot に履歴削除コマンドがあるのか気になる
    こうした特殊な用途は別として、プロジェクト自体はかなり興味深そう