1 points par GN⁺ 1 일 전 | 1 commentaires | Partager sur WhatsApp
  • stinkpot enregistre l’historique des commandes Bash dans SQLite pour le gérer indépendamment des sessions et le retrouver rapidement via une TUI de recherche
  • Il reprend uniquement les fonctions nécessaires d’Atuin — en retirant le serveur de synchronisation, l’IA, le gestionnaire de dotfiles et de scripts, ainsi que le stockage KV — et les implémente en environ 400 lignes de Go
  • L’historique Bash existant peut être importé avec stinkpot import, et en appuyant sur Ctrl+R, la TUI de recherche inverse s’ouvre
  • Sur NixOS, un module home-manager est fourni ; dans les autres environnements, l’initialisation se fait dans .bashrc avec eval "$(stinkpot init)"
  • La base de données est stockée dans ~/.local/share/stinkpot et, si elle est corrompue après une mise à niveau, il est possible de la supprimer puis de réimporter l’historique

Isoler uniquement les fonctions nécessaires d’Atuin

  • stinkpot est né de l’expérience d’un utilisateur d’Atuin qui n’avait besoin que d’une gestion de l’historique indépendante des sessions et d’une TUI de recherche
    • Il n’inclut ni serveur de synchronisation, ni Atuin AI, ni gestionnaire de dotfiles, ni gestionnaire de scripts, ni stockage KV
    • Les réglages et commandes d’exécution variant fortement d’une machine à l’autre, la fonction de synchronisation n’était pas utilisée non plus
  • Le projet est écrit en environ 400 lignes de Go, et la répartition des langages du dépôt est de 82,5 % Go et 17,5 % Nix
  • Son nom vient du stinkpot, une petite espèce de tortue
  • Pour accélérer la recherche inverse, le plan d’exécution SQLite utilise un index couvrant (covering index) au lieu d’un B-tree temporaire pour le tri

Installation et recherche dans l’historique

  • Depuis les sources, la compilation se fait avec la commande suivante
go build -o stinkpot .
  • Les utilisateurs de NixOS avec home-manager peuvent importer le module fourni homeManagerModules.default
  • Dans les autres environnements, ajoutez la commande d’initialisation suivante à .bashrc
eval "$(stinkpot init)"
  • L’historique Bash existant peut être importé avec la commande suivante
stinkpot import
  • Dans le shell, appuyer sur Ctrl+R ouvre la TUI de recherche
    • Déplacement avec et , puis sélection avec Tab ou Enter
    • Après la sélection, appuyer de nouveau sur Enter exécute la commande
    • Esc permet d’annuler
  • La base de données de l’historique est stockée dans ~/.local/share/stinkpot
    • Si la base est endommagée après une mise à niveau, supprimez le fichier puis relancez stinkpot import

1 commentaires

 
GN⁺ 1 일 전
Avis sur Lobste.rs
  • Cette semaine, j’ai tapé ? par erreur dans le prompt, et quand Atuin m’a demandé si je voulais activer le mode IA, j’ai réalisé à quel point il était devenu lourd
    Non merci. Grâce à cette présentation, je suis passé à stinkpot
  • J’ai déjà galéré après avoir perdu l’historique de mes commandes shell, donc ce projet me plaît vraiment. J’ai aussi essayé atuin.sh, mais je n’ai pas été très convaincu
    J’aime particulièrement le fait qu’il produise un binaire statique minimal et simple en 400 lignes de Go. Go est globalement un excellent langage, et je compte aussi essayer stinkpot
  • Je me demande ce que l’utilisation de SQLite apporte ici par rapport à des outils qui lisent directement le fichier d’historique, comme hstr ou fzf
    J’ai utilisé hstr pendant environ 15 ans et je suis récemment en train de passer à fzf. J’aime beaucoup SQLite en soi, mais je ne comprends pas pourquoi il serait nécessaire pour cet usage
    • Si Bash écrit l’historique dans un fichier après chaque exécution de commande, on peut obtenir quelque chose de similaire avec fzf seul
      Le fichier d’historique par défaut n’est pas structuré, mais SQLite permet d’enregistrer des données comme le code de sortie et l’heure de fin, et d’effectuer rapidement des traitements comme la déduplication à l’insertion ou la mise à jour de l’heure d’exécution lorsqu’une même commande est relancée
    • J’ai pensé à l’usage consistant à enregistrer et indexer le répertoire de travail courant de chaque entrée d’historique
      En théorie, on peut reconstituer péniblement le contexte à partir de l’historique des commandes, mais pouvoir consulter rapidement l’historique shell par répertoire de projet me semblerait assez utile
  • Ça vaut clairement le coup d’essayer. Atuin est devenu un zoo de fonctionnalités rempli de choses qui ne m’intéressent presque pas
    Il a quand même l’avantage de bien fonctionner, mais il est très possible que je ne l’aie pas mis à jour depuis longtemps
    • Je connaissais Atuin depuis un moment, mais je ne l’ai essayé pour la première fois que cette semaine. À ce rythme, il va bientôt commencer à lire mes e-mails
  • Ça a l’air excellent, mais je me demande s’il est possible de filtrer l’historique par cwd. Le fait de pouvoir utiliser le répertoire comme critère pour l’historique des commandes est la seule raison pour laquelle j’utilise Atuin
    Après un cd dans un projet, je peux reprendre exactement là où je m’étais arrêté, ce qui est particulièrement utile pour relancer de longues commandes avec beaucoup de paramètres
    • fish fournit cette fonctionnalité par défaut, et elle est très utile
    • Ce n’est pas le comportement que je préfère personnellement, mais c’est implémentable avec une contrainte : seul le cwd des commandes exécutées après l’installation de stinkpot sera enregistré, car le bash_history par défaut ne contient pas cette information
  • Pour que d’autres personnes puissent utiliser le code en toute confiance, il vaudrait mieux ajouter une licence au projet
    Si cela te convient, j’aimerais ajouter une licence publique puis l’intégrer à experimental oils readline. Une fois le widget dynamique terminé, l’historique des commandes fait partie des TODO les plus prioritaires
  • Je me demande à quel point il est facile de supprimer des commandes de l’historique. J’aimerais savoir s’il faut supprimer directement des lignes dans la base SQLite avec du SQL
    C’est rare, mais il arrive de devoir supprimer quelques lignes de l’historique shell, et avec l’approche classique on pouvait ouvrir directement bash_history et effacer les lignes concernées. Je me demande si stinkpot propose une commande de suppression d’historique
    À part ce cas d’usage un peu particulier, le projet lui-même a l’air assez intéressant