devAlice
← Mac

Personalización de zsh: prompt starship, historial, alias y plugins

Convierte el zsh predeterminado de macOS en un shell productivo en 30 minutos. starship + búsqueda en historial + autosuggestions + syntax highlighting.

macOS incluye zsh como shell predeterminado desde Catalina, pero la configuración de fábrica deja mucho sin aprovechar. Instalar Oh My Zsh completo añade peso y ralentiza el arranque. Esta guía personaliza solo lo necesario: prompt starship, búsqueda en historial, autosuggestions, syntax highlighting, fzf y cinco alias útiles.

La configuración del shell es uno de esos lugares donde — creo que — menos es más. En lugar de instalar frameworks completos, lo que realmente mejora la productividad diaria son tres o cuatro cambios concretos: un historial que no se pierde, sugerencias contextuales y un prompt que muestra lo que necesitas ver.

La audiencia son personas que completaron la configuración inicial de Mac y quieren pulir zsh — incluyendo sincronizar .zshrc con otras máquinas vía dotfiles.

TL;DR

  1. starship — prompt rápido y hermoso (más ligero que Oh My Zsh)
  2. zsh-autosuggestions — sugerencias grises basadas en historial (estilo fish)
  3. zsh-syntax-highlighting — coloriza comandos mientras escribes
  4. integración de fzf con el shell — búsqueda en historial moderna con Ctrl+R
  5. Haz commit de .zshrc a chezmoi vía dotfiles para que otras máquinas lo adopten

Requisitos previos

1. Por qué el zsh predeterminado no es suficiente

  • Sin información de git en el prompt: la rama y el estado sucio son invisibles.
  • Búsqueda en historial limitada: Ctrl+R existe, pero sin búsqueda difusa.
  • Autocompletado básico: Tab funciona, pero no hay sugerencias grises estilo fish.
  • Sin syntax highlighting: los errores tipográficos solo se ven al pulsar Enter.

Corregir esto mejora el flujo de trabajo cada día.


2. Prompt de starship (5 min)

starship.rs: un prompt multi-shell rápido escrito en Rust. Más ligero que Powerlevel10k de oh-my-zsh, con una sobrecarga de arranque prácticamente nula.

2.1 Instalar

brew install starship

Al final de .zshrc:

eval "$(starship init zsh)"

Abre un nuevo terminal — aplicado inmediatamente.

2.2 Nerd Font (para iconos)

Para ver los iconos de rama de git y lenguaje de starship necesitas una Nerd Font.

brew install --cask font-jetbrains-mono-nerd-font

Cambia la fuente de tu terminal a JetBrainsMono Nerd Font. (Ver la guía de WezTerm.)

2.3 Ajustes (opcional)

~/.config/starship.toml:

# Prompt de dos líneas — info arriba, entrada abajo
add_newline = true
format = """
$directory$git_branch$git_status$nodejs$python$rust$line_break$character"""
 
[character]
success_symbol = "[➜](bold green)"
error_symbol = "[✗](bold red)"
 
[directory]
truncation_length = 3
truncate_to_repo = true
 
[git_branch]
symbol = " "
style = "bold purple"
 
[git_status]
conflicted = "⚠️ "
ahead = "⇡${count} "
behind = "⇣${count} "
staged = "[+${count}](green) "
modified = "[!${count}](yellow) "
untracked = "[?${count}](red) "

Los valores predeterminados son excelentes. Empieza sin starship.toml y ajusta solo lo que te moleste.


3. Historial: corrige los malos valores predeterminados

Añade a .zshrc:

# Tamaños del historial
HISTSIZE=50000              # líneas mantenidas en memoria
SAVEHIST=100000             # líneas guardadas en archivo
HISTFILE="$HOME/.zsh_history"
 
# Deduplicar + guardar inmediatamente
setopt HIST_IGNORE_ALL_DUPS  # eliminar duplicados
setopt HIST_REDUCE_BLANKS    # fusionar diferencias solo de espacios en blanco
setopt HIST_VERIFY           # no auto-ejecutar expansiones estilo `!42`
setopt SHARE_HISTORY         # todas las instancias de zsh comparten historial
setopt INC_APPEND_HISTORY    # añadir al archivo de historial inmediatamente
setopt EXTENDED_HISTORY      # marca de tiempo + duración
 
# Arriba/Abajo — búsqueda por prefijo
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search    # Arriba
bindkey "^[[B" down-line-or-beginning-search  # Abajo

Efecto: escribe git c y presiona ↑; solo los comandos anteriores que empiezan con git c se recorren.


4. zsh-autosuggestions (3 min)

Sugerencias grises estilo fish para el siguiente comando. Acepta con Tab o →.

brew install zsh-autosuggestions

Al final de .zshrc:

source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
 
# Tono gris (el predeterminado es demasiado oscuro)
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'
 
# Omite sugerencias en comandos muy largos (rendimiento)
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=80

Nuevo terminal → escribe un comando → ve la sugerencia gris = OK.


5. zsh-syntax-highlighting (2 min)

Coloriza los comandos mientras escribes: válido en verde, inválido en rojo, opciones en amarillo, etc.

brew install zsh-syntax-highlighting

Al final de .zshrc — debe ir después de zsh-autosuggestions:

source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

El orden importa:

  1. autosuggestions
  2. syntax-highlighting (debe ir al final)

Al revés, ambos se rompen ocasionalmente.


6. fzf: búsqueda en historial moderna con Ctrl+R

El Ctrl+R predeterminado retrocede línea por línea. fzf ofrece búsqueda difusa con vista previa.

brew install fzf
$(brew --prefix)/opt/fzf/install --all

El script de instalación añade esto a .zshrc:

[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
  • Ctrl + R — búsqueda fuzzy en historial
  • Ctrl + T — selección fuzzy de archivo en el directorio actual (p.ej., vim <Ctrl+T>)
  • Alt + Ccd fuzzy

Más: configuración inicial de Mac §3.2.


7. Cinco alias útiles

Añádelos a .zshrc o, mejor, a un archivo ~/.zsh_aliases separado:

# git
alias g='git'
alias gs='git status -s'
alias gd='git diff'
alias gco='git checkout'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
 
# Sistema de archivos (eza — ls moderno)
alias ls='eza --git --group-directories-first'
alias ll='eza -l --git --group-directories-first --icons'
alias la='eza -la --git --group-directories-first --icons'
alias tree='eza --tree --level=3'
 
# Navegación de directorios
alias ..='cd ..'
alias ...='cd ../..'
 
# Recargar
alias zrl='source ~/.zshrc'
 
# Editor (VS Code o Cursor)
alias c='code .'

Los alias de una sola letra pueden colisionar. g (git) y c (code) funcionan bien cuando la intención es clara.


8. Salto de directorios con zoxide

En lugar de cd /Users/me/projects/myapp, escribe z myapp y salta directamente. Aprende los directorios que visitas con más frecuencia.

brew install zoxide

.zshrc:

eval "$(zoxide init zsh --cmd cd)"  # reemplaza cd mismo con zoxide

Usa cd como de costumbre; zoxide aprende. Luego cd myapp salta por nombre parcial.


9. Ejemplo completo de .zshrc

Una referencia completa que combina lo anterior:

# ~/.zshrc
 
# ─────────────────────────────────────────────
# PATH
# ─────────────────────────────────────────────
export PATH="$HOME/.local/bin:$PATH"
 
# ─────────────────────────────────────────────
# Historial
# ─────────────────────────────────────────────
HISTSIZE=50000
SAVEHIST=100000
HISTFILE="$HOME/.zsh_history"
setopt HIST_IGNORE_ALL_DUPS HIST_REDUCE_BLANKS HIST_VERIFY
setopt SHARE_HISTORY INC_APPEND_HISTORY EXTENDED_HISTORY
 
# Arriba/Abajo — búsqueda por prefijo
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
 
# ─────────────────────────────────────────────
# Alias
# ─────────────────────────────────────────────
alias g='git'
alias gs='git status -s'
alias gd='git diff'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
alias ls='eza --git --group-directories-first'
alias ll='eza -l --git --group-directories-first --icons'
alias la='eza -la --git --group-directories-first --icons'
alias ..='cd ..'
alias ...='cd ../..'
alias zrl='source ~/.zshrc'
alias c='code .'
 
# ─────────────────────────────────────────────
# Plugins (el orden importa)
# ─────────────────────────────────────────────
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=80
 
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
# ─────────────────────────────────────────────
# Herramientas
# ─────────────────────────────────────────────
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
eval "$(mise activate zsh)"           # gestor de versiones de lenguaje — /mac/dev-toolchain
eval "$(zoxide init zsh --cmd cd)"
 
# ─────────────────────────────────────────────
# Prompt
# ─────────────────────────────────────────────
eval "$(starship init zsh)"

10. Verificar

# En un nuevo terminal
type starship              # /opt/homebrew/bin/starship
ZSH_AUTOSUGGEST_USE_ASYNC=true   # autosuggest activo
echo $HISTSIZE             # 50000
 
# Prompt de starship
cd ~/work/myrepo           # el prompt muestra rama de git + iconos de lenguaje
 
# Sugerencias
git c                      # sugerencia gris — Tab para aceptar
 
# fzf
history | head             # escribe 'git c' luego Ctrl+R — búsqueda fuzzy

11. Solución de problemas

El prompt muestra glifos rotos (▢▢)

Falta la Nerd Font. Instala font-jetbrains-mono-nerd-font vía brew y cambia la fuente del terminal.

command not found: starship

  • which starship no devuelve nada: ¿el prefijo de brew está en el PATH?
  • En Apple Silicon: eval "$(/opt/homebrew/bin/brew shellenv)" debe estar en .zprofile.

Arranque lento del terminal (más de 1 segundo)

  • Carga diferida de comandos pesados como nvm desde .zshrc.
  • Perfila con zprof: añade zmodload zsh/zprof al inicio y zprof | head -20 al final.

autosuggestions no aparece

  • Orden en .zshrc: syntax-highlighting debe cargarse después de autosuggestions.
  • ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE puede ser demasiado parecido al color de fondo.
  • Prueba unset ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE para usar el valor predeterminado.

syntax-highlighting parpadea al escribir

  • Desactiva «Render fast» en WezTerm/iTerm2.
  • O establece ZSH_HIGHLIGHT_MAXLENGTH=300 para desactivar el resaltado en líneas muy largas.

zsh: no matches found: *.txt

El globbing de zsh es estricto por defecto. Añade setopt NULL_GLOB a .zshrc, o escapa el patrón: \*.txt.


12. Qué sigue


Referencias

Historial de cambios

  • 2026-05-16: Primera versión. starship + historial + autosuggestions + syntax-highlighting + fzf + alias + zoxide + ejemplo completo de .zshrc + seis casos de solución de problemas.