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.