- Starship é um projeto open source de prompt com leveza, alto desempenho e flexibilidade para uso em diversos ambientes de shell
- Oferece ampla compatibilidade com a maioria dos principais shells, incluindo Bash, Zsh, Fish, Powershell e Tcsh
- Pode ser configurado e aplicado de forma simples adicionando scripts de inicialização para cada shell
- Escrito em Rust, garante velocidade e segurança, sendo distribuído como um binário único
- Permite personalização até nos menores detalhes
- Suporta uma configuração de ambiente comum em várias plataformas, como Android, BSD, Linux, macOS e Windows, melhorando a produtividade e a facilidade de uso
Projeto open source Starship
- Starship é uma ferramenta de prompt que combina desempenho e personalização, podendo ser usada em diversos sistemas operacionais e shells
- Em comparação com prompts tradicionais mais pesados, destaca-se pela resposta rápida e pelo baixo uso de recursos, além de ajudar a aumentar a produtividade de desenvolvimento com seu alto nível de personalização
Como configurar em cada ambiente de shell
- Bash:
- Adicione o código
eval "$(starship init bash)" ao final do arquivo ~/.bashrc
- Fish:
- Adicione
starship init fish | source ao final do arquivo ~/.config/fish/config.fish
- Zsh:
- Adicione o código
eval "$(starship init zsh)" ao final do arquivo ~/.zshrc
- Powershell:
- Adicione
Invoke-Expression (&starship init powershell) ao arquivo Microsoft.PowerShell_profile.ps1
- É possível verificar a localização do arquivo de perfil do PowerShell pela variável
$PROFILE
- Ion:
- Insira o código
eval $(starship init ion) no arquivo ~/.config/ion/initrc
- Elvish:
- Compatível apenas com a versão v0.18 ou superior
- Adicione o código
eval (starship init elvish) ao arquivo ~/.elvish/rc.elv
- Tcsh:
- Insira o código
eval \starship init tcsh`` no arquivo ~/.tcshrc
- Nushell:
- Compatível apenas com a versão v0.96 ou superior, e o método de configuração poderá mudar futuramente
- O caminho do arquivo de configuração pode ser verificado com o comando
$nu.config-path
- Aplique no caminho correspondente com o código
starship init nu | save -f ...
- Xonsh:
- Insira o código
execx($(starship init xonsh)) ao final do arquivo ~/.xonshrc
- Cmd (requer Clink):
- Requer Clink v1.2.30 ou superior
- Crie o arquivo
starship.lua e salve-o no diretório de scripts do Clink
- Dentro dele, adicione o código
load(io.popen('starship init cmd'):read("*a"))()
2 comentários
É engraçado ver isso aparecer agora, sendo que uso muito bem há anos :)
Uso desde quando era oferecido como tema de Zsh... hahaha
Opinião do Hacker News
Sou um usuário que gosta de prompts maximalistas e costumo usar o Shell Bling Ubuntu com Starship ao montar máquinas de desenvolvimento
Ainda assim, esse estilo não serve para todo mundo
Se você quiser adicionar só a informação mais densa possível, recomendo mostrar apenas a hora em que o prompt apareceu e a duração de execução do último comando
Só com essas duas informações já dá para entender facilmente o que aconteceu e quando, e isso traz grandes vantagens depois para depuração ou manutenção de registros
Essa abordagem é uma dica tirada de Networking for System Administrators, de Michael W. Lucas, livro que também costumo recomendar para desenvolvedores que querem aprender fundamentos de redes
Se quiser ganhar ainda mais pontos nerd, mostre a hora em segundos no formato UNIX epoch
Isso tem a vantagem de tornar muito fácil calcular deltas de tempo
Veja o repositório Shell Bling Ubuntu
No nushell, esse tipo de informação já vem por padrão
No histórico de execução (
history), é possível ver detalhes como timestamp de início do comando, tempo de execução, diretório atual, status de saída e maisÉ muito prático porque ele mostra diretamente não só a diferença de tempo entre execuções, mas também o próprio tempo de execução do comando
Quase nunca personalizei o prompt
Usando emacs, já consigo ver no editor todas as informações que quero
Só configuro o Starship quando preciso mostrar algo para outra pessoa, como em pair programming, e deixo um aplicativo de terminal separado aberto para não precisar expor minha configuração pessoal
O código de saída do comando anterior também é uma informação muito útil, por motivos parecidos com os acima
Mostrar a hora atual em um formato legível para humanos também ajuda bastante
E se o status de saída do comando anterior não for 0 (ou seja, em caso de falha), mostrar isso ajuda na depuração
Para mim, só a informação do diretório atual já basta
Só preciso que a cor do prompt mude conforme o sucesso ou falha do último comando
Informações extras podem ser consultadas separadamente quando necessário
Fiquei curioso sobre a distribuição etária dos usuários do Starship
Pessoalmente, com o tempo fui perdendo grande interesse em customização de prompt
Cheguei à conclusão de que, por mais elaborado que seja o prompt, 90% das informações exibidas são desnecessárias em 90% do tempo
Na prática, informação demais acaba virando ruído visual, e o cérebro passa a ignorá-la, a ponto de você até esquecer que ela está ali
Informações realmente importantes também têm limite no prompt; por exemplo, um indicador de que houve mudança na branch do Git não diz quais arquivos mudaram, então no fim ainda é preciso rodar comandos adicionais
Tenho mais de 20 anos de experiência em desenvolvimento
Acho muito útil ter informações de Git no prompt
Não dá para ver todos os detalhes, mas é ótimo para me lembrar de alterações não commitadas ou de um
stashesquecidoO Starship pareceu interessante e instalei na hora, mas coisas como exibição de versão de ferramentas me pareceram barulhentas demais, e no fim desinstalei
Opções como tempo de comando e status de sucesso/falha eram boas, mas sobrou pouco valor diante do esforço de manter uma configuração customizada complexa
Como sênior com mais de 25 anos na área, não costumo usar ferramentas modernas chamativas
Antigamente eu usava um
PS1bem simples, como <pre><code>export PS1="[\033[1;32m][\t \u@\h \w]\$[\033[0m]"</code></pre>, mostrando só hora, minha conta, host conectado e caminho atualTambém tentei várias vezes outros prompts mais sofisticados, mas quase nunca ajudavam
Hoje uso Starship há alguns anos com satisfação
Personalizei para mostrar só o mínimo necessário, e ele é muito rápido e agradável de usar
Uma das partes mais úteis da customização do meu prompt é mostrar o
exit statusdo comando anteriorÀs vezes um comando falha sem mostrar mensagem de erro, então esse indicador de falha é um grande sinal
Ainda assim, ele só aparece quando houve falha, para não virar ruído no dia a dia
Exemplo: <pre><code>» true » false (last command returned 1.)</code></pre>
Se o encerramento ocorreu por sinal (
signal), também mostro isso traduzido, como em "last command exited on SIGSEGV"Também é útil no caso oposto, quando um programa imprime mensagem de erro mas encerra com código de sucesso
Como usuário "very senior" com décadas de experiência em UNIX, prefiro o modo minimal do Starship porque ele é limpo
No passado sofri durante anos com várias configurações de zsh, mas agora quase não tenho mais trabalho nenhum
Se você imaginava que todo usuário de Starship fosse da geração nova que exagera em emoji no JavaScript, fica registrado que gente como eu também usa
De forma mais ampla, isso vale para o ambiente computacional como um todo
Quando eu era mais novo, gostava de montar meu próprio sistema com Gentoo, ajustar flags de otimização de CPU, window manager, aliases e funções do
bashrc, e até o promptEsse tipo de trabalho de otimização em si acaba sendo uma experiência bastante útil no processo de crescimento
Numa analogia com marcenaria, no começo você passa a maior parte do tempo criando e refinando ferramentas e truques; em algum momento, porém, o foco muda para o trabalho prático
Ainda gosto de Linux, mas na correria da vida acabo priorizando o “trabalho” acima de eficiência ou refinamento, então uso Debian e KDE como ambiente padrão
Não gosto de enfeites desnecessários nem de excesso de informação, então prefiro um ambiente de terminal minimalista
Ainda assim, o Starship mostra bem o contexto quando necessário e permite customização detalhada
Meu prompt padrão mostra apenas diretório atual, hora e um
%Quando certas variáveis de ambiente (
KUBECONFIG,OS_CLOUDetc.) estão definidas, ele também inclui essas informações de forma apropriadaVersões de linguagens como Go e Python também aparecem automaticamente conforme o contexto de uso
O Starship facilita muito esse tipo de configuração e funciona com o mínimo de sobrecarga, sem exigir uma composição complicada de plugins de zsh
Especialmente em conjunto com evalcache, a inicialização também fica muito rápida
Como fã do Starship, alguns comentários
O fato de ser desenvolvido em Rust de forma segura e rápida, e distribuído como binário compilado, faz com que o desempenho seja muito melhor do que alternativas como powerline em Python, ohmybash em shell script, ohmyzsh em zshell e spaceship
Além de zsh, bash, sh e fish, ele também suporta MS Windows CMD e Powershell
Ser praticamente o único a permitir gerenciar o prompt de todos os sistemas a partir de um único arquivo de configuração é uma grande vantagem
Se houver informação demais, é fácil simplificar, e os ícones também podem ser desativados
Com cerca de 100 módulos, quase não há limite para a customização
Não entendo por que fazem marketing do Starship como algo “minimal”
<pre><code>: ▶</code></pre>Na prática, ele tem uma enorme variedade de recursos, e o que se vê em uso são prompts gigantes com todo tipo de enfeite
Eu uso algo bem simples assim
Se você quer minimalismo de verdade, não precisa necessariamente de um framework de customização como esse
Em comparação com outros shells e prompts, o arquivo de configuração do Starship tem a vantagem de continuar bem intuitivo mesmo quando a complexidade aumenta
Dá para desativar todos os recursos
<pre><code>format = """ $username\ $hostname\ $shlvl\ $directory\ $git_branch\ $git_commit\ $git_state\ $git_metrics\ $git_status\ $package\ $python\ $rust\ $env_var\ $custom\ $cmd_duration\ $jobs\ $time\ $status\ $shell\ $character"""</code></pre>Hoje eu uso uma configuração minimalista nesse estilo
No fim, dá para usar o Starship de forma minimalista, mas em essência ele é um prompt maximalista, feito para comportar o máximo possível de informação e conteúdo
Acho que seria bom reconhecer isso
Eu uso uma seta ainda mais fina do que essa
<pre><code>PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'</code></pre>Limpo, simples e minimalista
Fico surpreso com reações que confundem ser customizável com ser maximalista
O padrão é um pouco exagerado, mas dá para reduzir o quanto quiser
Eu trabalho em vários ambientes AWS e com runtimes diversos, então as informações de contexto no prompt realmente me ajudam bastante
Pessoalmente, uso a combinação Starship + Nushell há muito tempo
Gosto porque basta instalar uma vez e depois não preciso mais mexer
Eu quero ver de imediato se o shell está em node 20 ou 22, se o Rust está em
stableounightlyComo ele mostra essas coisas diretamente, sem trabalho extra, fico satisfeito
Independentemente do Starship, me incomoda um fenômeno no prompt do zsh em que, ao apertar Enter, o cursor se move momentaneamente para o começo da linha e ocorre um “flash”
Em prompts ultra-fast isso aparece menos, mas quando o prompt faz qualquer coisinha, esse efeito fica muito visível
Observei a mesma coisa em vários terminais (
gnome-terminal,wezterm,kitty,alacritty,xterm)O único em que esse problema não acontece é o urxvt
Veja a reprodução em vídeo
Queria entender a causa desse flash e como evitá-lo
Se o prompt ficar consultando informações inúteis como
git statustoda vez que for renderizado, a cada 100 ms, isso acaba virando perda invisível de produtividadeO terminal deveria ser uma ferramenta de memória responsiva, e é melhor evitar que ele vire adorno desnecessário
O problema é que a gente se preocupa com velocidade de execução de código, mas acaba sendo tolerante com a latência na própria digitação
O Starship é realmente rápido
Leva só alguns milissegundos para coletar os dados necessários, e é fácil controlar quais informações extrair
Em outras ferramentas que usei, sempre me incomodava uma demora perceptível, mas com Starship a diferença na sensação de uso é nítida
Os 100 ms percebidos por uma pessoa e os 100 ms de otimização de CPU são coisas totalmente diferentes
Na minha visão, quando o prompt leva 100 ms para mostrar branch ou status do Git, isso afeta mais o “flow” do que o tempo que eu mesmo gasto digitando comandos, então vale pensar no que faz mais sentido otimizar
Alguns milissegundos gastos com funcionalidades convenientes são perfeitamente aceitáveis
No fim, trata-se de encontrar um ponto de equilíbrio entre conveniência e minimalismo
Tanto o minimalismo extremo quanto o excesso de enfeite podem levar à ineficiência
Esse atraso me incomodou tanto que eu acabei aplicando um patch no terminal kitty para mover o prompt do Starship para uma status bar inferior, como no vim ou no emacs
A modeline é atualizada de forma assíncrona, então a resposta do prompt fica muito rápida
A desvantagem é que é preciso aplicar patch no kitty manualmente, e eu não consegui testar fora do meu ambiente Linux pessoal
Veja o projeto de patch relacionado
Fico curioso se uma ferramenta de prompt poderia funcionar como um TUI e modificar a área do prompt de forma assíncrona mesmo depois de já ter devolvido completamente a saída do prompt — por exemplo,
kubectl, Git ou AWS CLI acrescentarem informação 200 ms depoisAssim, o usuário poderia começar a digitar o próximo comando sem esperar, e as informações adicionais apareceriam naturalmente depois
Talvez o problema seja que, mais do que otimização da execução de código, o aumento no número de camadas (
layer) que usamos torne de fato mais difícil otimizar a latência de entrada do promptQuando entrei no site oficial, senti falta de uma explicação clara de por que eu deveria usar Starship
<pre><code>- resultado do último comando (cor: verde, vermelho, roxo)Minha customização recente de prompt mostra estas informações de relance
Se o último comando teve sucesso, fica em verde; se falhou, em vermelho; se foi interrompido, em roxo
Eu posso até ser o público-alvo deles, mas a homepage não me transmite claramente o “porquê” de usar nem quais melhorias concretas isso traria