---
title: "Cómo Activar el Resaltado de Sintaxis en Zsh"
description: "Aprende a activar el resaltado de sintaxis en ZSH para mejorar tu experiencia al programar. Cubre la instalación, la personalización de colores y los highlighters opcionales."
date: 2023-11-16
categories: ["linux"]
tags: ["zsh"]
---

Zsh no colorea los comandos mientras escribes de forma predeterminada. El plugin `zsh-syntax-highlighting` lo soluciona. Resalta comandos, opciones, cadenas, rutas y errores en tiempo real, de forma similar a como Fish shell funciona de fábrica.

Con el resaltado de sintaxis, los comandos válidos aparecen en un color, los inválidos en otro, y las cadenas y rutas también tienen sus propios colores. Detectas los errores de tecleo antes de pulsar Enter.

ZSH viene preinstalado en macOS (desde Catalina). En Linux, tendrás que instalarlo primero.

**Guías relacionadas de ZSH:**

- [Cómo Activar el Autocompletado de Comandos en ZSH](/es/activar-autocompletado-comandos-zsh/)
- [Los 15 Mejores Plugins de Oh My ZSH que Debes Probar](/es/mejores-plugins-oh-my-zsh/)
- [Zoxide: La Forma Más Inteligente de Navegar por tu Terminal](/es/zoxide-tutorial/)

## Qué hace zsh-syntax-highlighting

El plugin resalta tu línea de comandos mientras escribes, antes de que pulses Enter. Colorea:

- **Comandos:** los comandos válidos en un color, los desconocidos/inválidos en rojo (por defecto)
- **Opciones:** flags como `--verbose` o `-la` reciben colores distintos
- **Cadenas:** las cadenas con comillas simples, dobles y sin comillas se diferencian
- **Rutas:** las rutas de archivos existentes se resaltan (subrayadas por defecto)
- **Palabras reservadas:** `if`, `for`, `while`, `case`, etc.
- **Globs y expansiones:** `*.txt`, `$(command)`, `$variable`

El highlighter predeterminado (llamado `main`) cubre todo esto. También hay highlighters opcionales para coincidencia de paréntesis, patrones regex y avisos de usuario root (más sobre ellos abajo).

El plugin requiere ZSH 4.3.11+. Cualquier versión moderna de ZSH lo cumple.

## Paso 1: Instala zsh-syntax-highlighting

Hay cuatro formas de instalarlo. Elige la que encaje con tu configuración.

### Opción A: Con Oh My Zsh

Si usas Oh My Zsh:

```bash
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```

Después edita `~/.zshrc` y añade `zsh-syntax-highlighting` a tu lista de plugins. **Debe ser el último plugin de la lista:**

```zsh
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
```

Si todavía no tienes Oh My Zsh:

```bash
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

### Opción B: Instalación manual (sin Oh My Zsh)

Clona el repositorio y haz `source` del script:

```bash
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git \
  ~/.zsh/zsh-syntax-highlighting
```

Añade esto al **final** de tu `~/.zshrc`:

```zsh
source ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```

### Opción C: Con Homebrew (macOS)

```bash
brew install zsh-syntax-highlighting
```

Añade al **final** de tu `~/.zshrc`:

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

### Opción D: Gestor de paquetes del sistema (Linux)

El plugin está empaquetado para la mayoría de las distribuciones de Linux:

| Distro | Nombre del paquete | Comando source |
|--------|-------------|----------------|
| Debian/Ubuntu | `zsh-syntax-highlighting` | `source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh` |
| Fedora | `zsh-syntax-highlighting` | `source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh` |
| Arch Linux | `zsh-syntax-highlighting` (AUR/community) | `source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh` |
| openSUSE | `zsh-syntax-highlighting` | `source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh` |

Instálalo con tu gestor de paquetes y después añade la línea `source` correspondiente al **final** de tu `~/.zshrc`.

## Paso 2: Haz source al final de .zshrc

Este es el error más común que comete la gente. `zsh-syntax-highlighting` debe cargarse **después de todo lo demás** en tu `.zshrc`: después de Oh My Zsh, después de `compinit`, después de otros plugins, después de los widgets personalizados.

El plugin funciona enganchándose al editor de línea de ZSH (ZLE). Si se carga antes que otras cosas que modifican la línea de comandos, esas modificaciones no dispararán el re-resaltado.

Si usas Oh My Zsh y `zsh-syntax-highlighting` es el último plugin de tu array `plugins=()`, esto se gestiona automáticamente. Para instalaciones manuales, pon la línea `source` al final del todo de `.zshrc`.

## Paso 3: Recarga y prueba

Aplica los cambios:

```bash
source ~/.zshrc
```

O abre una pestaña nueva de terminal. Después prueba:

1. Escribe un comando válido como `ls`. Debería aparecer coloreado (verde por defecto en muchos temas).
2. Escribe un comando inexistente como `asdfg`. Debería aparecer en rojo.
3. Escribe `echo "hello"`. La cadena `"hello"` debería tener su propio color.

Si ves colores, está funcionando.

## Personalizar los colores del resaltado de sintaxis

Los colores predeterminados son razonables, pero puedes sobreescribir cualquiera de ellos. Añade esto a `~/.zshrc` **antes** de la línea `source` del plugin.

### Ajustes de estilo habituales

```zsh
typeset -A ZSH_HIGHLIGHT_STYLES

# Comandos válidos, el predeterminado es 'fg=green' en muchas configuraciones
ZSH_HIGHLIGHT_STYLES[command]='fg=blue,bold'

# Comandos desconocidos, el predeterminado es 'fg=red'
ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red,bold'

# Alias
ZSH_HIGHLIGHT_STYLES[alias]='fg=magenta,bold'

# Builtins del shell (cd, echo, export, etc.)
ZSH_HIGHLIGHT_STYLES[builtin]='fg=blue'

# Palabras reservadas del shell (if, for, while, case)
ZSH_HIGHLIGHT_STYLES[reserved-word]='fg=yellow,bold'

# Rutas de archivos existentes
ZSH_HIGHLIGHT_STYLES[path]='fg=cyan,underline'

# Cadenas entre comillas simples
ZSH_HIGHLIGHT_STYLES[single-quoted-argument]='fg=yellow'

# Cadenas entre comillas dobles
ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=yellow'

# Opciones/flags de comandos (--verbose, -la)
ZSH_HIGHLIGHT_STYLES[single-hyphen-option]='fg=cyan'
ZSH_HIGHLIGHT_STYLES[double-hyphen-option]='fg=cyan'

# Expresiones glob (*.txt, *.log)
ZSH_HIGHLIGHT_STYLES[globbing]='fg=green,bold'

# Operadores de redirección (>, >>, |)
ZSH_HIGHLIGHT_STYLES[redirection]='fg=magenta'

# Sustituciones de comando ($(echo foo))
ZSH_HIGHLIGHT_STYLES[command-substitution]='fg=cyan'

# Asignaciones (FOO=bar)
ZSH_HIGHLIGHT_STYLES[assign]='fg=green'
```

### Desactivar un resaltado concreto

Para desactivar el resaltado de un estilo en particular:

```zsh
ZSH_HIGHLIGHT_STYLES[globbing]='none'
```

### Nombres de estilo disponibles

El highlighter `main` define estas claves de estilo (no es una lista exhaustiva, pero cubre las que más probablemente querrás personalizar):

| Nombre del estilo | Qué resalta |
|---|---|
| `command` | Nombres de comandos externos |
| `alias` | Alias |
| `builtin` | Builtins del shell (`cd`, `pwd`, `shift`) |
| `function` | Nombres de funciones |
| `reserved-word` | `if`, `for`, `while`, `case`, etc. |
| `unknown-token` | Comandos inválidos/desconocidos (errores) |
| `path` | Rutas de archivos existentes |
| `path_prefix` | Prefijos de rutas existentes |
| `single-quoted-argument` | Cadenas `'entre comillas simples'` |
| `double-quoted-argument` | Cadenas `"entre comillas dobles"` |
| `dollar-quoted-argument` | Cadenas `$'con comillas de dólar'` |
| `single-hyphen-option` | Flags estilo `-o` |
| `double-hyphen-option` | Flags estilo `--option` |
| `globbing` | Patrones glob (`*.txt`) |
| `redirection` | `<`, `>`, `>>`, pipes |
| `comment` | Comentarios (cuando `INTERACTIVE_COMMENTS` está activo) |
| `assign` | Asignaciones de variables |
| `default` | Todo lo demás |

La sintaxis de colores sigue el formato `zle_highlight` de ZSH: `fg=color,bold`, `bg=color`, `underline`, `standout`, etc. Puedes combinar atributos con comas.

## Highlighters opcionales

El highlighter `main` está activo por defecto. El plugin incluye varios más que puedes activar:

| Highlighter | Qué hace |
|---|---|
| `main` | Resaltado de comandos, opciones, cadenas y rutas (predeterminado) |
| `brackets` | Resalta corchetes y paréntesis coincidentes con colores |
| `pattern` | Resalta texto que coincide con patrones definidos por el usuario |
| `regexp` | Resalta texto que coincide con regexps definidas por el usuario |
| `cursor` | Resalta la posición del cursor |
| `root` | Resalta toda la línea cuando ejecutas como root (fondo rojo) |
| `line` | Aplica un estilo a toda la línea de comandos |

Para activar highlighters adicionales, añádelos al array `ZSH_HIGHLIGHT_HIGHLIGHTERS`:

```zsh
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets cursor)
```

### Ejemplo de coincidencia de paréntesis

Activa el highlighter `brackets` y personaliza los colores:

```zsh
ZSH_HIGHLIGHT_HIGHLIGHTERS+=(brackets)

# Par de paréntesis coincidentes
ZSH_HIGHLIGHT_STYLES[bracket-level-1]='fg=cyan,bold'
ZSH_HIGHLIGHT_STYLES[bracket-level-2]='fg=green,bold'
ZSH_HIGHLIGHT_STYLES[bracket-level-3]='fg=magenta,bold'

# Paréntesis sin pareja (error)
ZSH_HIGHLIGHT_STYLES[cursor-matchingbracket]='standout'
```

### Aviso de usuario root

El highlighter `root` hace que toda la línea de comandos sea visualmente distinta cuando has iniciado sesión como root. Una buena red de seguridad:

```zsh
ZSH_HIGHLIGHT_HIGHLIGHTERS+=(root)
ZSH_HIGHLIGHT_STYLES[root]='bg=red'
```

### Resaltado por patrones

Resalta patrones concretos que tú defines. Útil para marcar comandos arriesgados:

```zsh
ZSH_HIGHLIGHT_HIGHLIGHTERS+=(pattern)
ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red')
```

Esto hace que los comandos `rm -rf` destaquen con un fondo rojo.

## Poniéndolo todo junto

Un `~/.zshrc` mínimo con el resaltado de sintaxis configurado:

```zsh
# Oh My Zsh
export ZSH="$HOME/.oh-my-zsh"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
source $ZSH/oh-my-zsh.sh

# Estilos de autocompletado
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
zstyle ':completion:*' menu select

# Personalización del resaltado de sintaxis (antes del source del plugin)
ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red,bold'
ZSH_HIGHLIGHT_STYLES[command]='fg=blue,bold'
ZSH_HIGHLIGHT_STYLES[alias]='fg=magenta,bold'
```

Sin Oh My Zsh:

```zsh
# Sistema de autocompletado
autoload -Uz compinit && compinit

# Plugins
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh

# Resaltado de sintaxis, debe ser lo ÚLTIMO
ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red,bold'
ZSH_HIGHLIGHT_STYLES[command]='fg=blue,bold'
source ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```

Nota: con instalaciones manuales, los ajustes de `ZSH_HIGHLIGHT_STYLES` van antes de la línea `source`.

## Limitar la longitud del resaltado

Si editas líneas de comandos muy largas y notas lag, puedes limitar la longitud máxima de línea que se resalta:

```zsh
ZSH_HIGHLIGHT_MAXLENGTH=512
```

Las líneas de más de 512 caracteres no se resaltarán. Por defecto no hay límite.

## Solución de problemas

**No aparecen colores:** Asegúrate de que la línea `source` está al final del todo de `.zshrc`. Esta es la solución más común con diferencia. Ejecuta `source ~/.zshrc` o abre una terminal nueva para probar.

**Plugin no encontrado (Oh My Zsh):** Verifica que el directorio del plugin existe:

```bash
ls ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```

Si está vacío, vuelve a clonar el plugin.

**Los colores se ven mal o invisibles:** El esquema de colores de tu terminal puede estar en conflicto. Por ejemplo, si tu fondo es verde oscuro y "comando válido" también es verde, no verás nada. Ajusta los estilos como se muestra en la sección de personalización, o cambia el esquema de colores de tu terminal.

**El resaltado se rompe tras añadir otros plugins:** Como `zsh-syntax-highlighting` debe cargarse el último, añadir un plugin nuevo después de él puede causar problemas. En Oh My Zsh, asegúrate de que `zsh-syntax-highlighting` sigue al final de tu array `plugins=()`. Para instalaciones manuales, mueve su línea `source` al final.

**Escritura lenta en comandos largos:** Define `ZSH_HIGHLIGHT_MAXLENGTH` con un valor razonable (como 512) para saltarte el resaltado en entradas muy largas.

**¿Quieres resaltado de sintaxis sin plugins?** [Fish Shell](/es/instalar-fish-shell-ubuntu/) incluye resaltado de sintaxis, autosugerencias y autocompletados completos de fábrica. Consulta la comparativa [Fish Shell vs Zsh](/es/fish-shell-vs-zsh-comparacion/) si quieres explorar esa opción.