O Zsh é o mais avançado e performático dos interpretadores shell e o Zinit é o mais avançado e performático dos gerenciadores de plugins para o Zsh. A seguir mostro como migrar para o Zsh e realizar uma configuração simples porém funcional utilizando o Zinit com completações, sugestões automáticas, destaque de sintaxe e o Powerlevel10k.
Por que migrar?
O Zsh é superior. Não há desvantagens em utilizá-lo, só vantagens. Você pode perder uma ou outra funcionalidade que o Fish entrega sem necessidade de configuração mas provavelmente haverá um plugin para o Zsh com essa funcionalidade e no fim do dia você vai estar em um interpretador robusto com mais recursos de linguagem, performance superior à de seus concorrentes e que possui um grande número de usuários e extensões.
Devido ao Zinit ser assíncrono, o tempo de carregamento é menor ao utilizá-lo do que ao carregar diretamente os plugins. Entretanto a principal vantagem em utilizar um gerenciador de plugins não está na rapidez mas na portabilidade. O setup do usuário passa a independer do gerenciador de pacotes do sistema e os dotfiles podem ser clonados e utilizados, a princípio, sem necessidade de modificação em qualquer outro sistema operacional que disponibilize o Zsh como shell. É até mesmo possível configurar para que o Zinit instale, caso não os encontre, programas como o fzf, que são bastante utilizados por usuários mas não omnipresentes nos sistemas.
Instruções
Setar o Zsh como interpretador shell de login.
chsh -s $(which zsh)
Renomear o arquivo de configuração padrão, ‘.zshrc’, do Zsh
mv ~/.zshrc ~/.zshrc.old
Obs: O Zinit muda a forma como completações são carregadas e a configuração padrão do Zsh é desnecessária e indesejada.
Criar um novo ‘.zshrc’.
# Instant Prompt
# --------------
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]] && ! [ $ZELLIJ ]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# Zinit
# -----
declare -A ZINIT
ZINIT[BIN_DIR]="$XDG_CONFIG_HOME/zsh/zinit/bin"
ZINIT[HOME_DIR]="$XDG_CONFIG_HOME/zsh/zinit"
ZINIT[ZCOMPDUMP_PATH]="$XDG_DATA_HOME/shell/zcompdump"
if ! [ -f "$ZINIT[BIN_DIR]/zinit.zsh" ]; then # instalar se não encontrado
git clone --depth 1 --branch master "https://github.com/zdharma/zinit" "$ZINIT[BIN_DIR]" &&
fi && source "$ZINIT[BIN_DIR]/zinit.zsh" # carregar
# Prompt
# ------
# Utilizar prompt arco-íris se em um terminal burro
if [[ "$TERM" == linux ]]; then
autoload -U colors && colors
export PS1="%B%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$reset_color%} $%b "
# Do contrário, utilizar o Powerlevel10k se setar um título contextual à janela
else
zinit depth=1 for \
load \
romkatv/powerlevel10k \
is-snippet \
"$XDG_CONFIG_HOME/zsh/p10k.zsh"
function x_title_precmd () {
print -Pn -- '\e]2;%n@%m %~\a'
[[ "$TERM" == 'screen'* ]] && print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-}\e\\'
}
function x_title_preexec () {
print -Pn -- '\e]2;%n@%m %~ %# ' && print -n -- "${(q)1}\a"
[[ "$TERM" == 'screen'* ]] && { print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-} %# ' && print -n -- "${(q)1}\e\\"; }
}
add-zsh-hook -Uz precmd x_title_precmd
add-zsh-hook -Uz preexec x_title_preexec
fi
# Plugins
# -------
zinit wait lucid depth=1 for \
atinit"zicompinit; zicdreplay" \
zdharma/fast-syntax-highlighting \
atload"_zsh_autosuggest_start" \
zsh-users/zsh-autosuggestions \
blockf atpull'zinit creinstall -q .' \
zsh-users/zsh-completions \
# Extra
# -----
# Utilizar menu de seleção para completações
zstyle ':completion:*' menu select
Iniciar uma nova sessão
Aproveite as novas funcionalidades:
- Comandos são colorizados sintaticamente;
- TAB uma vez completa um comando ou expande as opções quando há mais de uma;
- TAB duas vezes abre um menu para navegar entre as opções de completação;
- Sugestões são recomendadas com base no histórico de comandos.
E se quiser mais ideias para customizar o seu sistema, confira este repositório com as minhas configurações.