Zsh en WSL (Windows Subsystem for Linux)

Instalación de Zsh y Oh My Zsh en WSL en un entorno con Ubuntu, además, implementación de plugins y personalización del prompt con el tema powerlevel10k.

📋 Tabla de contenido

🌅 Introducción

Tenemos el siguiente escenario, trabajamos en un Windows 11 que tiene instalado WSL y queremos utilizar un shell de Linux en lugar de powershell. Vamos a instalar Ubuntu bajo el WSL y configuraremos el entorno para trabajar con Zsh, instalaremos Oh My Zsh y personalizaremos el prompt.

🌍 Enlaces de interés

📌 Instalación de Ubuntu en WSL

wsl --list --verbose # (Para ver la distribución instalada)
wsl -d Ubuntu-24.04

📌 Instalación de Zsh

Zsh es un shell de línea de comandos para sistemas Unix que extiende las funcionalidades del Bourne Shell (sh) con características avanzadas como autocompletado inteligente, corrección de errores de tipeo, soporte para plugins y temas, y una gran personalización.

Desde la terminal de Ubuntu:

  1. Actualiza los paquetes del sistema
sudo apt update && sudo apt upgrade -y
  1. Instala Zsh
sudo apt install zsh -y
  1. Verifica la instalación de Zsh
zsh --version
  1. Actualiza el shell por defecto
chsh -s $(which zsh)
  1. Cierra el terminal y vuelve a abrir Ubuntu (Deberia abrir zsh por defecto)

📌 Instalación de Oh My Zsh y el tema Powerlevel10k

Oh My Zsh es una colección de configuraciones, temas y complementos para Zsh que mejora la experiencia en la línea de comandos, haciéndola más productiva, personalizable y atractiva visualmente.

  1. Instala OhMyZsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  1. Instala un tema (Powerlevel10k)

Más temas para Oh My Zsh

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
  ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
  1. Edita el tema por defecto de Oh My Zsh:
nano ~/.zshrc
# esto:
ZSH_THEME="robbyrussell"
# por esto:
ZSH_THEME="powerlevel10k/powerlevel10k"
source ~/.zshrc

Configura el tema a tu gusto.

📌 Instalación de plugins (zsh-autosuggestions)

El plugin zsh-autosuggestions es una extensión para el shell Zsh que sugiere comandos automáticamente mientras escribes, basándose en tu historial de comandos o en comandos previos. Cuando sugiere un comando basta con pulsar la tecla de dirección derecha (➡️) para realizar el autocompletado.

  1. Instala el plugins
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
  1. Abre la configuración de Zsh
nano ~/.zshrc
  1. Actualiza la configuración de Zsh para admitir el plugin
# Busca esta línea: 
plugins=(git)
# Agrega el plugin a la lista
plugins=(git zsh-autosuggestions)
  1. Aplica los cambios
source ~/.zshrc

📌 Personalización del prompt

Para personalizar el prompt puede ser interesante consultar los códigos de colores disponibles y emojis.

Para hacer un campo personalizado para el prompt se definen funciones cuyo nombre debe comenzar por prompt_*, en este ejemplo, definiremos funciones para mostrar el nombre de usuario con el del host y el directorio actual, ambos con emojis.

  1. Abre el fichero de configuración del tema (Powerlevel10k)
nano ~/.p10k.zsh
  1. Inserta al final el siguiente contenido
# ╭────────────────────────────────────────────────────────────╮
# │ Custom segment: 🤖 user@host                               │
# ╰────────────────────────────────────────────────────────────╯
function prompt_my_userhost() {
  local user=$USER
  local host=$(hostname)
  local icon="🤖" 
  p10k segment -f 178 -t "$icon $user@$host" 
  }
# ╭────────────────────────────────────────────────────────────╮
# │ Custom segment: 📂 dir_name                                │
# ╰────────────────────────────────────────────────────────────╯
function prompt_my_dir() {
  local dir_name="${PWD##*/}"
  p10k segment -f 39 -t "📂 $dir_name"
}
  1. Busca la siguiente directiva dentro de la configuración del tema y agrega los campos personalizados
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENT
(
  # os_icon               # os identifier                            
  my_userhost             # user@host                  
  my_dir                  # custom current directory             
  # dir                     # current directory                         
  vcs                     # git status                                            
  prompt_char             # prompt symbol                                  
)  
  1. Puedes personalizar la sección del control de versiones, por ejemplo, agregar un emoji (🌿) junto al nombre de la rama
typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='🌿 '
  1. También puedes cambiar el icono y el color del prompt de shell
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='$'
# Para cambiar los colores busca las directivas que correspondan al siguiente patrón
typeset -g POWERLEVEL9K_PROMPT_CHAR_*
  1. Guarda el fichero y aplica los cambios
source ~/.p10k.zsh

📌 Cambiar la terminal por defecto en vscode

Control + Shift + P
Terminal: Select Default Profile

📌 Configuración de git

Dentro de el sistema de Ubuntu se montan particiones que enlazan directamente a los archivos de Windows, normalmente /mnt/c o /mnt/d, para poder disfrutar de nuestra configuración de git del equipo host dentro de Ubuntu hay que hacer algunas configuraciones extras.

  1. Enlazar los dirctorios .gitconfig y .ssh al directorio home de tu usuario
ln -s /mnt/c/Users/$USUARIO/.gitconfig ~/.gitconfig
ln -s /mnt/c/Users/$USUARIO/.ssh ~/.ssh
  1. Para no tener problemas con los saltos de líneas (^M)

Cuando abrás un proyecto desde Ubuntu y compruebes con git los cambios en los ficheros, normalmente mostrará un cambio en los saltos de línea, ya que Windows (CRLF) y Ubuntu (LF) lo gestionan de manera diferente.

Cambia la configuración en git desde Ubuntu

git config core.autocrlf false
git config core.eol lf

git add --renormalize .
git status

También puede cambiar la gestión de los saltos de línea en vscode

📌 Alias de Oh My Zsh

Oh My Zsh proporciona una lista amplia de alias, mayormente para trabajar con git o para trabajar con directorios, consulta la lista completa una vez instalado con alias y para consultar directamente que hace un alias which $ALIAS

Estos son algunos ejemplos:

# Alias para el sistema
_='sudo '
1='cd -1'
2='cd -2'
...
9='cd -9'
l='ls -lah'
la='ls -lAh'
ll='ls -lh'
ls='ls --color=tty'
lsa='ls -lah'
md='mkdir -p'
rd=rmdir
# Alias para git
g=git
ga='git add'
gb='git branch'
gbD='git branch --delete --force'
gcf='git config --list'
gcmsg='git commit --message'
gd='git diff'
gf='git fetch'
ggpush='git push origin "$(git_current_branch)"'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gp='git push'
grhh='git reset --hard'
grm='git rm'
gst='git status'

📌 Actualizar Zsh y Oh My Zsh

# Actualizar Zsh
sudo apt update && sudo apt upgrade zsh
# Actualizar Oh My Zsh
omz update

📌 Desinstalar Zsh

# Desinstalar Zsh
sudo apt --purge remove zsh
# Configurar por defecto la shell bash de Ubuntu
chsh -s `which bash`