- stinkpot armazena o histórico de comandos do Bash em SQLite para gerenciá-lo independentemente da sessão e permitir buscas rápidas por uma TUI de pesquisa
- Remove do Atuin o servidor de sincronização, IA, gerenciador de dotfiles e scripts e armazenamento KV, implementando apenas as funções necessárias em cerca de 400 linhas de Go
- O histórico existente do Bash é importado com
stinkpot import, e ao pressionarCtrl+Ré aberta uma TUI de busca reversa - No NixOS, oferece um módulo home-manager; em outros ambientes, é inicializado no
.bashrccomeval "$(stinkpot init)" - O banco de dados é armazenado em
~/.local/share/stinkpot; se ele for corrompido após uma atualização, é possível apagá-lo e importar o histórico novamente
Separando do Atuin apenas as funções necessárias
- stinkpot surgiu da experiência de usar o Atuin e precisar apenas do gerenciamento de histórico independente de sessão e da TUI de busca
- Não inclui servidor de sincronização, Atuin AI, gerenciador de dotfiles, gerenciador de scripts nem armazenamento KV
- Como as configurações e comandos executados variavam bastante de uma máquina para outra, a função de sincronização também não era usada
- O projeto foi escrito em cerca de 400 linhas de Go, e a composição de linguagens do repositório é Go 82,5% e Nix 17,5%
- O nome vem de
stinkpot, uma pequena espécie de tartaruga - Para acelerar a busca reversa, o plano de execução do SQLite usa um índice de cobertura (covering index) em vez de uma B-tree temporária para ordenação
Instalação e busca no histórico
- A partir do código-fonte, compile com o seguinte comando
go build -o stinkpot .
- Usuários do NixOS home-manager podem importar o módulo
homeManagerModules.defaultfornecido - Em outros ambientes, adicione o seguinte comando de inicialização ao
.bashrc
eval "$(stinkpot init)"
- Importe o histórico existente do Bash com o seguinte comando
stinkpot import
- No shell, pressionar
Ctrl+Rabre a TUI de busca- Navegue com
↑·↓e selecione comTabouEnter - Depois de selecionar, pressione
Enternovamente para executar o comando - Cancele com
Esc
- Navegue com
- O banco de dados do histórico é armazenado em
~/.local/share/stinkpot- Se o DB quebrar após uma atualização, apague o arquivo e execute
stinkpot importnovamente
- Se o DB quebrar após uma atualização, apague o arquivo e execute
1 comentários
Comentários no Lobste.rs
?por engano no prompt e, quando vi o Atuin perguntando se eu queria ativar o modo de IA, percebi como ele ficou inchado.Dispenso. Graças à indicação, agora migrei para o stinkpot.
Gosto especialmente do fato de ele criar um binário estático, simples e mínimo, com 400 linhas de código Go. Go é uma ótima linguagem no geral, e pretendo testar o stinkpot também.
Usei o hstr por cerca de 15 anos e, recentemente, venho migrando para o fzf. Gosto muito do SQLite em si, mas não entendi por que ele é necessário para este caso de uso.
O arquivo de histórico padrão não é estruturado, mas no SQLite é possível armazenar dados como código de saída e horário de término; também dá para executar rapidamente tratamentos como remover duplicatas na inserção ou atualizar o horário de execução quando o mesmo comando é executado novamente.
Em teoria, dá para reconstruir o contexto a duras penas a partir do histórico de comandos, mas poder consultar rapidamente o histórico do shell por diretório de projeto parece algo bem útil.
Ainda assim, tem a vantagem de funcionar bem, embora seja bem possível que eu não o atualize há muito tempo.
cwd. A possibilidade de usar o diretório como critério para o histórico de comandos é o único motivo pelo qual uso o Atuin.Depois de dar
cdpara um projeto, dá para retomar imediatamente de onde parei antes, e isso é especialmente útil para reexecutar comandos longos com muitos parâmetros.cwdregistrado, pois obash_historypadrão não contém essa informação.Se estiver tudo bem, eu gostaria de adicionar uma licença pública e depois integrá-lo ao experimental oils readline. Depois que eu terminar o widget dinâmico, histórico de comandos é uma das principais pendências no TODO.
É raro, mas às vezes preciso apagar algumas linhas de comando do histórico do shell; no modelo antigo, eu podia abrir o
bash_historydiretamente e remover as linhas correspondentes. Fico me perguntando se o stinkpot tem um comando para apagar histórico.Tirando esse uso mais específico, o projeto em si parece bastante interessante.