1 puntos por GN⁺ 2 시간 전 | 1 comentarios | Compartir por WhatsApp
  • 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 presionar Ctrl+R se abre una TUI de búsqueda inversa
  • En NixOS ofrece un módulo de home-manager, y en otros entornos se inicializa desde .bashrc con eval "$(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.default incluido
  • 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+R se abre la TUI de búsqueda
    • Muévete con y , y selecciona con Tab o Enter
    • Después de seleccionar, vuelve a presionar Enter para ejecutar el comando
    • Cancela con Esc
  • 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 import de nuevo

1 comentarios

 
GN⁺ 2 시간 전
Comentarios de Lobste.rs
  • Esta semana escribí ? 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 vuelto
    Paso. Gracias por presentarlo; ahora ya me cambié a stinkpot
  • He sufrido por perder el historial de comandos del shell, así que este proyecto realmente me encanta. También probé atuin.sh, pero no me dejó muy satisfecho
    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
  • Me pregunto qué ventajas aporta usar SQLite aquí frente a herramientas como hstr o fzf, que leen directamente el archivo de historial
    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
    • Si haces que Bash escriba el historial al archivo después de cada comando, se puede lograr algo parecido solo con fzf
      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
    • Pensé en usarlo para guardar e indexar el directorio de trabajo actual de cada entrada del historial
      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
  • Sin duda vale la pena probarlo. Atuin se ha convertido en un zoológico de funciones lleno de cosas que casi no me interesan
    Aun así, tiene la ventaja de que funciona bien, aunque probablemente hace mucho que no lo actualizas
    • Conocía Atuin desde antes, pero apenas esta semana lo usé por primera vez. Si sigue esta tendencia, pronto hasta va a empezar a leer el correo
  • Se ve excelente, pero me pregunto si permite filtrar el historial por cwd. Esa es la única razón por la que uso Atuin
    Puedes hacer cd a un proyecto y retomar justo donde te quedaste antes, y es especialmente útil para volver a ejecutar comandos largos con muchos parámetros
    • fish trae esta función por defecto y es muy útil
    • Personalmente no es el comportamiento que prefiero, pero se puede implementar con una limitación. Solo los comandos ejecutados después de instalar stinkpot tendrán registrado el cwd, porque el bash_history normal no contiene esa información
  • Para que otras personas puedan usar el código con tranquilidad, sería mejor agregar una licencia al proyecto
    Si 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
  • Me pregunto qué tan fácil es borrar comandos del historial. Quisiera saber si hay que eliminar filas directamente con SQL en la base de datos SQLite
    Aunque no pasa seguido, a veces necesito borrar unas cuantas líneas del historial del shell, y antes podía abrir bash_history directamente y borrar esas líneas. Me pregunto si stinkpot tiene un comando para borrar historial
    Fuera de ese caso de uso algo peculiar, el proyecto en sí se ve bastante interesante