1 Punkte von GN⁺ 2 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • stinkpot speichert die Bash-Befehlshistorie in SQLite, verwaltet sie unabhängig von Sessions und macht sie über eine Such-TUI schnell auffindbar
  • Entfernt aus Atuin den Sync-Server, AI, dotfiles-/Skript-Manager und KV-Store und implementiert nur die benötigten Funktionen in rund 400 Zeilen Go
  • Eine bestehende Bash-History wird mit stinkpot import importiert; bei Ctrl+R öffnet sich eine TUI für Rückwärtssuche
  • Unter NixOS wird ein home-manager-Modul bereitgestellt; in anderen Umgebungen erfolgt die Initialisierung in .bashrc mit eval "$(stinkpot init)"
  • Die Datenbank wird unter ~/.local/share/stinkpot gespeichert; falls sie nach einem Upgrade beschädigt ist, kann man sie löschen und die History erneut importieren

Nur die benötigten Funktionen aus Atuin herausgelöst

  • stinkpot entstand aus der Erfahrung mit Atuin, bei der nur sessionsunabhängige History-Verwaltung und eine Such-TUI benötigt wurden
    • Sync-Server, Atuin AI, dotfiles-Manager, Skript-Manager und KV-Store sind nicht enthalten
    • Da Konfigurationen und ausgeführte Befehle je nach Maschine stark unterschiedlich waren, wurde auch die Sync-Funktion nicht genutzt
  • Das Projekt ist in etwa 400 Zeilen Go geschrieben; die Sprachanteile im Repository betragen Go 82,5 % und Nix 17,5 %
  • Der Name stammt von stinkpot, einer kleinen Schildkrötenart
  • Um die Rückwärtssuche zu beschleunigen, nutzt der SQLite-Ausführungsplan statt eines temporären B-Baums zum Sortieren einen Covering Index

Installation und History-Suche

  • Aus dem Quellcode wird mit folgendem Befehl gebaut
go build -o stinkpot .
  • Nutzer von NixOS home-manager können das bereitgestellte Modul homeManagerModules.default einbinden
  • In anderen Umgebungen fügt man der .bashrc den folgenden Initialisierungsbefehl hinzu
eval "$(stinkpot init)"
  • Eine bestehende Bash-History wird mit folgendem Befehl importiert
stinkpot import
  • Drückt man in der Shell Ctrl+R, öffnet sich die Such-TUI
    • Mit · navigieren, mit Tab oder Enter auswählen
    • Nach der Auswahl wird der Befehl durch erneutes Drücken von Enter ausgeführt
    • Mit Esc abbrechen
  • Die History-DB wird unter ~/.local/share/stinkpot gespeichert
    • Falls die DB nach einem Upgrade beschädigt ist, die Datei löschen und stinkpot import erneut ausführen

1 Kommentare

 
GN⁺ 2 시간 전
Lobste.rs-Kommentare
  • Ich habe diese Woche am Prompt versehentlich ? eingegeben und dann gesehen, wie Atuin fragte, ob es den AI-Modus aktivieren soll – da wurde mir klar, wie aufgebläht es geworden ist
    Nein danke. Dank dieses Hinweises bin ich jetzt auf stinkpot umgestiegen
  • Ich habe schon einmal darunter gelitten, meine Shell-Befehlschronik zu verlieren, deshalb gefällt mir dieses Projekt wirklich sehr. Ich habe auch atuin.sh ausprobiert, war aber nicht besonders zufrieden damit
    Besonders gut finde ich, dass damit ein einfaches statisches Minimal-Binary in nur 400 Zeilen Go-Code gebaut wurde. Go ist insgesamt eine großartige Sprache, und ich werde stinkpot wohl auch ausprobieren
  • Ich frage mich, was der Einsatz von SQLite hier gegenüber Tools bringt, die die History-Datei direkt lesen, wie hstr oder fzf
    Ich benutze hstr seit etwa 15 Jahren und wechsle in letzter Zeit eher zu fzf. SQLite selbst finde ich großartig, aber ich habe nicht verstanden, warum es für diesen Zweck nötig ist
    • Wenn man Bash so konfiguriert, dass es nach jedem ausgeführten Befehl die History in die Datei schreibt, lässt sich etwas Ähnliches auch nur mit fzf umsetzen
      Die Standard-History-Datei ist nicht strukturiert, aber in SQLite kann man Daten wie Exit-Code und Endzeit speichern, und Dinge wie Deduplizierung beim Einfügen oder das Aktualisieren der Ausführungszeit beim erneuten Ausführen desselben Befehls lassen sich schnell erledigen
    • Ich dachte dabei an das Speichern und Indizieren des aktuellen Arbeitsverzeichnisses für jeden History-Eintrag
      Theoretisch kann man den Kontext mühsam aus der Befehlschronik rekonstruieren, aber wenn man die Shell-History schnell nach Projektverzeichnissen durchsuchen könnte, wäre das ziemlich nützlich
  • Klingt definitiv einen Versuch wert. Atuin ist zu einem Feature-Zoo voller Funktionen geworden, die mich kaum interessieren
    Der Vorteil ist zwar, dass es gut funktioniert, aber wahrscheinlich habe ich es schon lange nicht mehr aktualisiert
    • Ich kannte Atuin schon länger, habe es aber erst diese Woche zum ersten Mal benutzt. Wenn der Trend so weitergeht, liest es bald auch noch meine E-Mails
  • Sieht großartig aus, aber ich frage mich, ob man die History nach cwd filtern kann. Dass der Verlauf verzeichnisbasiert sein kann, ist der einzige Grund, warum ich Atuin benutze
    Man kann in ein Projekt cd wechseln und direkt dort weitermachen, wo man vorher aufgehört hat; besonders nützlich ist das, wenn man lange Befehle mit vielen Parametern erneut ausführen will
    • fish bringt diese Funktion standardmäßig mit und sie ist sehr nützlich
    • Das ist zwar nicht mein bevorzugtes Verhalten, aber unter einer Einschränkung ließe es sich umsetzen. Nur seit der Installation von stinkpot ausgeführte Befehle hätten ein aufgezeichnetes cwd, denn im normalen bash_history gibt es diese Information nicht
  • Damit andere den Code bedenkenlos nutzen können, wäre es besser, dem Projekt eine Lizenz hinzuzufügen
    Wenn das für dich in Ordnung ist, würde ich nach dem Hinzufügen einer Open-Source-Lizenz gern eine Integration in experimental oils readline versuchen. Einer der wichtigsten TODO-Punkte nach Fertigstellung des dynamischen Widgets ist die Befehlschronik
  • Ich frage mich, wie einfach sich Befehle aus der History löschen lassen. Muss man dazu Zeilen direkt per SQL aus der SQLite-Datenbank entfernen?
    Es kommt selten vor, aber manchmal muss ich ein paar Zeilen aus der Shell-History löschen, und bisher konnte ich dafür einfach bash_history direkt öffnen und die betreffenden Zeilen entfernen. Ich frage mich, ob stinkpot einen Befehl zum Löschen von History-Einträgen hat
    Abgesehen von diesem speziellen Anwendungsfall wirkt das Projekt selbst ziemlich interessant