1 pontos por GN⁺ 2 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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 pressionar Ctrl+R é aberta uma TUI de busca reversa
  • No NixOS, oferece um módulo home-manager; em outros ambientes, é inicializado no .bashrc com eval "$(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.default fornecido
  • 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+R abre a TUI de busca
    • Navegue com · e selecione com Tab ou Enter
    • Depois de selecionar, pressione Enter novamente para executar o comando
    • Cancele com Esc
  • 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 import novamente

1 comentários

 
GN⁺ 2 시간 전
Comentários no Lobste.rs
  • Nesta semana, digitei ? 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.
  • Já sofri por perder o histórico de comandos do shell, então gostei muito deste projeto. Também experimentei o atuin.sh, mas não fiquei muito satisfeito.
    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.
  • Fico curioso sobre o que o uso de SQLite aqui traz de melhor em comparação com ferramentas que leem diretamente o arquivo de histórico, como hstr ou fzf.
    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.
    • Se você fizer o Bash gravar o histórico no arquivo a cada execução de comando, dá para implementar algo parecido só com fzf.
      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.
    • Pensei no uso de armazenar e indexar o diretório de trabalho atual de cada item do histórico.
      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.
  • Com certeza vale testar. O Atuin virou quase um zoológico de recursos, cheio de funcionalidades pelas quais não tenho quase nenhum interesse.
    Ainda assim, tem a vantagem de funcionar bem, embora seja bem possível que eu não o atualize há muito tempo.
    • Eu já conhecia o Atuin fazia tempo, mas só fui experimentar nesta semana. Pelo rumo que está tomando, parece que logo ele vai começar a ler até e-mails.
  • Parece excelente, mas fico me perguntando se é possível filtrar o histórico por 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 cd para um projeto, dá para retomar imediatamente de onde parei antes, e isso é especialmente útil para reexecutar comandos longos com muitos parâmetros.
    • O fish oferece esse recurso por padrão, e ele é muito útil.
    • Não é o comportamento que eu pessoalmente prefiro, mas dá para implementar sob uma restrição: apenas comandos executados depois da instalação do stinkpot terão o cwd registrado, pois o bash_history padrão não contém essa informação.
  • Para que outras pessoas possam usar o código com tranquilidade, seria bom adicionar uma licença ao projeto.
    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.
  • Fico curioso sobre quão fácil é apagar comandos do histórico. Gostaria de saber se é preciso remover linhas diretamente com SQL no banco SQLite.
    É raro, mas às vezes preciso apagar algumas linhas de comando do histórico do shell; no modelo antigo, eu podia abrir o bash_history diretamente 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.