Estrategias de fusión en git: Ship / Show / Ask
Guía del comando jq

Zsh: Configuración, personalización y algo más

shell zsh

Como informáticos, la línea de comandos y los navegadores son las herramientas estrella que necesitamos. De hecho me atrevería a decir que son las únicas que necesitamos para nuestro flujo de trabajo. La shell la utilizamos para instalar paquetes/dependencias, para probar puntos finales de la API, para control de versiones con Git y muchas otras cosas. Por eso, merece la pena sacar el máximo rendimiento y es aquí donde aparece zsh.

Índice:

Diferentes shells

Tenemos muchas shell, por ejemplo:

  • Bash quizá sea la más usada ya que está por defecto en muchas distribuciones de Linux.
  • Fish te da un montón de complementos y herramientas preinstaladas para utilizarlas desde el minuto 0.
  • Y la que ahora es mi shell favorito: zsh. Un intérprete de comandos Unix altamente personalizable, que contiene algunas características muy potentes, como la finalización de pestañas, un historial inteligente, la expansión de archivos remotos y mucho más.

Estas características que he comentado de zsh también te las da fish, pero el problema de fish es que a veces tiene incompatibilidad con bash y sh, algo que resulta ser un gran problema para el scripting que tanto usamos los «pantallas negras».

En este artículo, mostraré cómo instalé zsh, y luego ofreceré algunos consejos y trucos para que ser más productivo cuando uses la línea de comandos. Se trata de una guía para principiantes que puede seguir cualquiera que tenga un mínimo interés en sacarle jugo a la terminal.

Empecemos.

¿Qué es zsh?

Z shell (o simplemente zsh) es un potente intérprete de comandos para sistemas operativos de tipo Unix, como por ejemplo los BSD o GNU/Linux.​ La primera versión de zsh fue escrita por Paul Falstad en 1990, cuando era estudiante en la Universidad de Princeton.

Zsh se diseñó para poder usarse interactivamente. Se le han incorporado muchas de las características principales de otras shells de Unix como bash, ksh, o tcsh y además posee características propias originales.

macOS Catalina, lanzada en octubre de 2019, adoptó a Zsh como la shell predeterminada, remplazando a Bash. 😮

Instalación Zsh

No quiero ofrecer instrucciones de instalación en profundidad para cada sistema operativo, sino más bien algunas directrices generales. Si te quedas atascado instalando zsh, hay mucha ayuda disponible en línea. El código fuente lo puedes encontrar aquí y la web oficial de zsh es zsh.org.

En nuestro Linux, si no lo tenemos instalado por defecto, lo podemos instalar facilmente. En las distribuciones basadas en Ubuntu, puedes instalar zsh usando:

sudo apt-get install zsh.

Una vez completada la instalación, puedes comprobar la versión utilizando

zsh --version

Luego puedes hacer que zsh sea tu shell por defecto utilizando

chsh -s $(que zsh)

Tendrás que cerrar la sesión y volver a iniciarla para que los cambios surtan efecto o utilizar el comando

exec zsh

Si estás ejecutando una distro no basada en Debian, puedes revisar las instrucciones para otras distros.

Primera ejecución

Cuando abra zsh por primera vez, será recibido por el siguiente menú.

menú_zsh

Si seleccionas (1) entrarás en un menú que permite configurar el historial, las combinaciones de teclas y un montón de otras cosas. Sin embargo, te sugiero que selecciones (2), que creará un perfil de configuración con los ajustes predeterminados recomendados.

Archivo de configuración

Ahora echemos un vistazo al archivo que zsh acaba de crear. Entra en tu directorio principal y abre el archivo oculto .zshrc en tu editor preferido. Este archivo se ejecuta cada vez que inicias zsh y es el lugar donde tienes la configuración personalizada principal.

Podemos demostrar cómo funciona este archivo creando un alias. En su forma más simple, los alias son atajos de terminal para comandos regulares. Añade lo siguiente al final de .zshrc y guarda el archivo:

alias myip="curl http://ipecho.net/plain"

Reinicia la shell (por ejemplo, cerrándola y abriéndola de nuevo o con el comando «exec zsh»), y si escribes myip directamente te saldrá el resultado del comando cURL, siempre y cuando tengas el programa cURL instalado, así que deberías ver tu dirección IP pública actual en el terminal.

Si te interesa saber más sobre cURL mira este tutorial y estos ejemplos de comandos.

Cierra la terminal escribiendo exit, luego localiza el archivo .zsh_history, que también está en tu directorio home. Aquí es donde zsh almacena una lista de tus comandos de terminal anteriores. Actualmente, si no has escrito nada más, debería contener dos líneas: myip y exit.

Consejos

1. Instala Oh My zsh

Si sólo sigues uno de estos consejos, tiene que ser éste. Oh My Zsh es un framework impulsado por una gran comunidad para la gestión y configuración de zsh. Viene con miles de funciones útiles, ayudas, plugins y temas. Algunos de los siguientes consejos dependerá de que instales este framework.

Como se explica en la página principal del proyecto, puedes instalarlo usando cURL o wget.

sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

Para usae ambos comandos tienes que tener git instalado, lo cual esperamos que ya tengas. Si no es así, puedes cogerlo de la página web del proyecto o seguir este pequeño tutorial.

Ahora puedes ver en el mensaje de instalación que Oh My Zsh creó una copia de seguridad de tu archivo .zshrc, y luego lo reemplazó con su propia versión. Esto significa que tendrás que copiar cualquier configuración personalizada (como nuestro alias myip) a tu nuevo archivo .zshrc.

2. Selecciona un tema

Si pasas mucho tiempo en la terminal, vale la pena invertir algún esfuerzo en hacerla visualmente atractiva. Afortunadamente Oh My Zsh viene con un montón de temas.

Si buscas en el archivo ~/.zshrc la variable ZSH_THEME, encontrarás que está establecida como robbyrussel. Este es el tema por defecto que utiliza Oh My Zsh.

Para instalar un tema diferente, elige uno del enlace anterior y cambia el valor de la variable ZSH_THEME con el nombre del escogifo y reinicia tu shell. Por ejemplo, establecer ZSH_THEME=»avit» hará que Oh My Zsh utilice el tema avit.

Fíjate en el detalle de cómo el tema reconoce que está en un repo de git cuando entras en una carpeta iniciado con el control de versiones, dice la rama en la que estás y muestra un tick verde para que se sepa que todo está actualizado. Una maravilla.

Te animo a que te des un buen garbeo por los temas disponibles para encontrar el que más te guste. De todas formas, puedes ver el que me gusta a mi en mi personalización de la shell.

Solución de un problemilla

Probando Oh My Zsh puede que veas caracteres rotos en el terminal. Para remediarlo tuve que instalar las fuentes Powerline y decirle a mi terminal que las usara.

git clone https://github.com/powerline/fonts.git
cd fonts
./install.sh

Por último, elige una fuente adecuada en las propiedades de tu terminal. Asegúrate de que está seleccionada una fuente Powerline. Por ejemplo, Deja Vu Sans Mono para Powerline me funcionó bien.

Ten en cuenta también que un par de temas requieren fuentes Powerline, independientemente del sistema operativo. Veremos la instalación de uno de estos temas (Agnoster) hacia el final del artículo.

3. Trabajar con el historial

Una de las características geniales de Oh My Zsh es la forma en que te permite buscar en tu historial. Imagina que el contenido de .zsh_history se ve así:

cd Escritorio
mkdir mi-proyecto
cd mi-proyecto
npm init -y
mkdir {src,build}
touch index.js

Si estás en la terminal y presionas la tecla ↑, esperarías recorrer cada una de esas entradas del historial una por una, ¿verdad? No es ninguna sorpresa, en bash funciona así. Sin embargo, Oh My Zsh le da una vuelta de tuerca y te permite introducir el principio de un comando, luego pulsar la tecla ↑ para recorrer las entradas que coincidan, como un buscador. Así que, con el ejemplo anterior, si introduces «mkdir» y luego presionas la tecla ↑, verás que se muestra directamente «mkdir {src,build}». Si la pulsas de nuevo, verás «mkdir mi-proyecto».

Es una función que te ahorra «history | grep <búsqueda>». Por ejemplo, cuando quiero hacer ssh en un servidor y no puedo recordar las credenciales exactas, simplemente introduzco «ssh» y puedo recorrer las conexiones recientes hasta que encuentro la correcta. O, cuando no puedo recordar la sintaxis exacta de un comando, puedo simplemente introducir los primeros caracteres y recorrer cualquier coincidencia. ¡Impresionante!

4. ¡Autosugerencias!

Otra gran característica de Oh My Zsh son los plugins. Estos añaden nuevas características a tu shell y aumentan su funcionalidad.

Oh My Zsh viene con cientos de plugins para casi cualquier uso que te puedas imaginar. Veremos algunos de ellos más adelante y puedes ver los que tengo en mi repositorio de «Mi Configuración personal de la shell«. En esta sección, sin embargo, me gustaría presentarte un plugin de terceros llamado Autosuggestions. Este sugiere comandos mientras escribes basándose en el historial. Sí sí, lo has oído bien.

Para instalarlo, necesitas clonar su repositorio en $ZSH_CUSTOM/plugins. Por defecto es ~/.oh-my-zsh/custom/plugins.

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

Una vez hecho esto, para activarlo, entra en el archivo ~/.zshrc y descomenta la siguiente línea

# plugins=(git)

Luego reemplaza git por zsh-autosuggestions. Que también puedes dejar git.

plugins=(zsh-autosuggestions)

Reinicia tu shell y notarás que al escribir un comando, Oh My Zsh te hará sugerencias basadas en tu historial. Si la sugerencia es la que buscas, pulsa la tecla → para aceptarla. ¡Un verdadero ahorro de tiempo!

6. Navega a cualquier sitio usando z

z es un práctico plugin que construye una lista de tus carpetas más frecuentes y recientes (las llama «frecent») y te permite saltar a ellas con un solo comando. Esto es a menudo mucho más conveniente que tener que tabular a través de una estructura de carpetas anidadas.

Para instalar el plugin, todo lo que tienes que hacer es añadirlo a tu archivo .zshrc de la siguiente manera

plugins=(
    z
    zsh-autosuggestions
)

Luego reinicia tu terminal.

Una vez instalado, z tendrá una breve fase de aprendizaje mientras observa cómo navegas por tu PC con la terminal. Sin embargo, después de un tiempo, podrás escribir z seguido de cualquier palabra que esté en la ruta de tu directorio deseado. El plugin utilizará la coincidencia difusa para averiguar a qué carpeta quieres ir y expandirá la ruta en consecuencia. Si hay más de una posibilidad, puede ir cambiando las opciones como se describe en el consejo anterior.

Puede que esto no parezca gran cosa, pero podrá abrir un shell, escribir z mi-proyecto y hacer que expanda la ruta a /home/manu/files/alguna/carpeta_anidada/or/otro/mi-proyecto. Luego, cuando estés en ese directorio, puedes escribir z mi-otro-proyecto y hacer que expanda la ruta a /var/www/html/proyectos/top/secreto/mi-otro.proyecto.

Ten en cuenta que mientras que no hayas navegado durante un buen tiempo z no ha aprendido y puedes obtoner un error como

_z_dirs:2: no such file or directory: /home/jim/.z.

Suele ser algo aislado, ya que aparentemente z, como hemos comentado, necesitaba crear un archivo .z en el directorio personal.

7. Trabajar con git

Zsh incluye una integración básica con git desde el principio. Por ejemplo, si escribes git y presionas la tecla Tab, zsh escupirá una larga lista de posibles comandos git. Esto se vuelve un poco más útil si escribes git, seguido por el primer par de letras del comando que estás buscando. Por ejemplo git a + Tab produce:

add        -- add file contents to index
am         -- apply patches from a mailbox
apply      -- apply patch to files and/or to index
archimport -- import an Arch repository into git
archive    -- create archive of files from named tree

Las cosas empiezan a ponerse más interesantes cuando instalas el plugin git de Oh My Zsh.

plugins=(git z zsh-autosuggestions)

Esto proporciona un montón de alias, así como algunas funciones útiles para trabajar con git. Algunos alias son:

    gaa – git add all
    gdca – git diff --cached
    gp – git push
    gpf! – git push --force
    grhh – git reset --hard
    gst – git status

También puedes crear un alias para varios comandos a la vez, añadiendo lo siguiente a tu archivo .zshrc:

function acp() {
  git add .
  git commit -m "$1"
  git push
}

Ahora, cuando estés en un repositorio de git, escribiendo acp «a commit message» añadirás todos los archivos modificados, los confirmarás con el mensaje de confirmación que hayas especificado y los enviarás a tu remoto. El mérito de esta idea es de Ali Spittel.

8. Obtener información instantánea sobre el estado de un Repo git

Al principio del artículo activamos un tema llamado avit. Cuando estés en un repositorio git, este tema mostrará el nombre de la rama, así como una cruz o una verificación que indica si todo está actualizado. Esta información de un vistazo ahorra mucho tiempo y es definitivamente un gran paso para evitar hacer git status de manera obsesiva.

Hay un par de temas, sin embargo, que muestran esta información de una manera más intuitiva, como Agnoster, el cual lo vamos a instalar ahora. Recordad, que muchos temas necesitan instalar una fuente parcheada por Powerline para que se vean correctamente los caracteres especiales, como Agnoster que lo necesita para las flechas y los iconos de git.

Para probar si su terminal puede mostrar todos los caracteres necesarios, ejecute el siguiente comando:

echo "\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699"

El resultado deberían ser una serie de iconos. Después de esta comprobación, habilita el tema cambiando la siguiente línea en el archivo .zshrc:

ZSH_THEME="agnoster"

Reiniciando el terminal ya veremos como luce Agnoster. Con este tema tendrás una visión más intuitiva del estado de cualquier repositorio git. También recibirás información visual sobre si el comando anterior tuvo éxito o no y, por supuesto, verás si estás trabajando con privilegios elevados o no.

Si no te gusta la parte del usuario@host del prompt, puedes hacer que desaparezca añadiendo DEFAULT_USER=tu_nombre_de_usuario al archivo .zshrc.

9. Plugins, Plugins y más Plugins

Como se mencionó, Oh My Zsh viene con un montón de plugins. Deberías echarle un vistazo e invertir algo de tiempo en aprender aquellos que te ayudarán en tu productividad. Para empezar, estos son algunos de los más populares:

  • cloudapp – sube archivos y contenidos canalizados al servicio Cloudapp. Sale y copia la URL resultante en el portapapeles.
  • command-not-found – si un comando no es reconocido en el $PATH, esto utilizará el paquete command-not-found de Ubuntu para encontrarlo o sugerir errores ortográficos (Sólo para Ubuntu y openSUSE).
  • node – abre la API de Node, para su versión actual, en su navegador.
  • npm – añade el autocompletado a npm.
  • sudo – pulsar ESC dos veces pone sudo delante del comando actual, o el último si la línea de comandos está vacía.
  • vscode – facilita la interacción entre la línea de comandos y el editor de código.

Si quieres saber los que elegí yo, los tienes en un repo.

10. Combinaciones de teclas

Este no es un consejo específico de zsh, pero para terminar quería que conocieras estas cinco combinaciones de teclas que ahorran tiempo.

  • Ctrl + U – borrar desde el cursor hasta el principio de la línea.
  • Ctrl + K – borrar desde el cursor hasta el final de la línea.
  • Ctrl + W: borra desde el cursor hasta el principio de la palabra anterior.
  • Alt + D – borrar desde el cursor hasta el final de la palabra siguiente.
  • Ctrl + L – borrar el terminal.

Si puedes memorizarlas, te sorprenderá la frecuencia con la que te resultarán útiles.

Conclusión

En este post se ha mostrado cómo instalar zsh y establecerlo como tu shell por defecto. También se han dado algunos tics para sacar el máximo partido a tu terminal con el framework Oh My Zsh. Estoy seguro que si lo pruebas durante un par de semanas luego te preguntarás cómo has podido prescindir de esto.

Si quieres saber como tengo configurada mi terminal puedes verlo en el repositorio:

Configuración personal de la shell

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar