- stinkpot guarda el historial de comandos de Bash en SQLite para gestionarlo sin depender de la sesión y encontrarlo rápido con una TUI de búsqueda
- Elimina de Atuin el servidor de sincronización, la IA, el gestor de dotfiles y scripts, y el almacén KV, e implementa solo lo necesario en unas 400 líneas de Go
- El historial existente de Bash se importa con
stinkpot import, y al presionarCtrl+Rse abre una TUI de búsqueda inversa - En NixOS ofrece un módulo de home-manager, y en otros entornos se inicializa desde
.bashrcconeval "$(stinkpot init)" - La base de datos se guarda en
~/.local/share/stinkpot, y si se corrompe tras una actualización se puede borrar y volver a importar el historial
Separando de Atuin solo lo necesario
- stinkpot surgió de la experiencia de usar Atuin y necesitar solo la gestión de historial independiente de la sesión y la TUI de búsqueda
- No incluye servidor de sincronización, Atuin AI, gestor de dotfiles, gestor de scripts ni almacén KV
- Tampoco se usaba la función de sincronización porque la configuración y los comandos de ejecución variaban mucho entre máquinas
- El proyecto está escrito en unas 400 líneas de Go, y la proporción de lenguajes en el repositorio es Go 82.5% y Nix 17.5%
- El nombre viene de
stinkpot, una pequeña especie de tortuga - Para acelerar la búsqueda inversa, el plan de ejecución de SQLite usa un índice de cobertura (covering index) en lugar de un B-tree temporal para ordenamiento
Instalación y búsqueda en el historial
- Desde el código fuente se compila con el siguiente comando
go build -o stinkpot .
- Los usuarios de home-manager en NixOS pueden importar el módulo
homeManagerModules.defaultincluido - En otros entornos, agrega el siguiente comando de inicialización a
.bashrc
eval "$(stinkpot init)"
- El historial existente de Bash se importa con el siguiente comando
stinkpot import
- En el shell, al presionar
Ctrl+Rse abre la TUI de búsqueda- Muévete con
↑y↓, y selecciona conTaboEnter - Después de seleccionar, vuelve a presionar
Enterpara ejecutar el comando - Cancela con
Esc
- Muévete con
- La base de datos del historial se guarda en
~/.local/share/stinkpot- Si la DB se daña después de una actualización, borra el archivo y ejecuta
stinkpot importde nuevo
- Si la DB se daña después de una actualización, borra el archivo y ejecuta
1 comentarios
Comentarios de Lobste.rs
?por error en el prompt y ver que Atuin me preguntó si quería activar el modo IA me hizo darme cuenta de lo inflado que se ha vueltoPaso. Gracias por presentarlo; ahora ya me cambié a stinkpot
En especial, me gusta que haga un binario mínimo estático y simple en 400 líneas de código Go. Go es un gran lenguaje en general, y también pienso probar stinkpot
He usado hstr por unos 15 años y últimamente me estoy pasando a fzf. SQLite en sí me encanta, pero no entendía por qué hacía falta para este caso de uso
El archivo de historial predeterminado no está estructurado, pero en SQLite puedes guardar datos como el código de salida y la hora de finalización, y también procesar rápidamente cosas como eliminar duplicados al insertar o actualizar la hora de ejecución cuando se vuelve a correr el mismo comando
En teoría se puede reconstruir el contexto con dificultad a partir del historial de comandos, pero poder consultar rápidamente el historial del shell por directorio de proyecto parece bastante útil
Aun así, tiene la ventaja de que funciona bien, aunque probablemente hace mucho que no lo actualizas
cwd. Esa es la única razón por la que uso AtuinPuedes hacer
cda un proyecto y retomar justo donde te quedaste antes, y es especialmente útil para volver a ejecutar comandos largos con muchos parámetroscwd, porque elbash_historynormal no contiene esa informaciónSi te parece bien, me gustaría añadir una licencia abierta e integrarlo en experimental oils readline. El historial de comandos es uno de los TODO de mayor prioridad que quiero resolver después de terminar los widgets dinámicos
Aunque no pasa seguido, a veces necesito borrar unas cuantas líneas del historial del shell, y antes podía abrir
bash_historydirectamente y borrar esas líneas. Me pregunto si stinkpot tiene un comando para borrar historialFuera de ese caso de uso algo peculiar, el proyecto en sí se ve bastante interesante