"El buen diseño es obvio. El gran diseño es transparente"
- Joe Sparano

El manifiesto de aplicaciones web

6 minutos de lectura
Fecha: 20/3/2018

Antes de hablaros del proyecto open source oh-my-zsh es necesario explicar que es Zsh y porqué merece la pena que comenzar a usarlo.

En primer lugar Zsh es la abreviatura de ZShell una terminal alternativa a la que traen muchas distribuciones de Linux.

Por ejemplo, Ubuntu viene configurado para ser usado con Bash, y aunque no esta nada mal, podríamos buscar por la razón que sea, un Shell más potente y configurable, si eso es lo que necesitas muy probablemente acabes llegando hasta Zsh.

Que nadie piense que por instalar Zsh pierdes Bash, al instalarlo simplemente tendrás disponibles ambos, y después tu decides cual usar (casi seguro que va a ser Zsh ya verás).

Zsh es una alternativa muy interesante al shell nativo de nuestra distribución de Linux/Unix/MacOs y esto no soy yo quien lo dice, solo el proyecto Oh-my-Zsh tiene alrededor de 67.000 estrellas en Github y ha sido forkeado más de 14.000 veces.

Para que os hagáis una idea de la dimensión de esto, jQuery tiene casi 50.000 estrellas, así que se trata de un proyecto que usa muchísima gente y algo bueno tendrá para que sea así.

¿Entonces que es oh-my-zsh?

Dicho de forma simple oh-my-zsh es un proyecto que sirve para configurar y añadirle plugins y temas al Shell Zsh

Para que nos hagamos una idea de porque son importante los plugins y los temas, simplemente pensemos en un editores como Sublime, Studio Code, Notepad++ y otros tantos, ¿que haríamos si nos quitaran los plugins y temas instalados que les tenemos?

Pues Zsh es lo mismo, por si solo es muy bueno y ya tiene características que lo hacen superior a otros shells, pero si le añadimos plugins y temas (que tiene muchísimos) aumentamos sus capacidades y conseguimos un terminal justo para lo que queremos.

Por esta razón el framework oh-my-zsh es casi imprescindible.

¿Que ventajas tiene oh-my-zsh?

Claro está que, solo porque tenga esa enorme cantidad de estrellas en Github, no es una razón válida para que convencer a nadie que lo instale en su máquina.

Como lo que realmente importa es el valor real que te aporta en el día a día, vamos a ver las razones por la que puede ser el mejor shell para ti, obviamente si de estas cosas que te cuento ninguna te va a resultar práctica no lo instales.

En primer lugar la integración que nos proporciona con git es espectacular, y un buen programador suele usar siempre algún tipo de control de versiones, siendo git la opción más popular hoy en día.

Entre las cosas que ganamos esta la información adicional que puede mostrarnos por consola, como la rama en la que estamos, ver si tenemos cambios por confirmar, ver cuantos commits estamos por encima o por debajo del remoto, número de stashes, el hash de nuestro commit actual…

La verdad es que tenemos a nuestra disposición prácticamente toda la información relevante de nuestro repo, ahora es decisión nuestra que queremos mostrar en nuestro tema.

Mucha información podría hacer poco legible nuestra consola, así que tenemos que decidir que necesitamos tener.

Además oh-my-zsh nos da un gran número de alias para casi todas las operaciones que necesitemos usar en git, y otras muchas que seguro no hemos usado nunca, si quieres ver cuales son te los dejo aquí debajo.

AliasComando
ggit
gagit add
gaagit add —all
gapagit add —patch
gbgit branch
gbagit branch -a
gbdgit branch -d
gblgit blame -b -w
gbnmgit branch —no-merged
gbrgit branch —remote
gbsgit bisect
gbsbgit bisect bad
gbsggit bisect good
gbsrgit bisect reset
gbssgit bisect start
gcgit commit -v
gc!git commit -v —amend
gcagit commit -v -a
gca!git commit -v -a —amend
gcan!git commit -v -a —no-edit —amend
gcans!git commit -v -a -s —no-edit —amend
gcamgit commit -a -m
gcsmgit commit -s -m
gcbgit checkout -b
gcfgit config —list
gclgit clone —recursive
gcleangit clean -fd
gpristinegit reset —hard && git clean -dfx
gcmgit checkout master
gcdgit checkout develop
gcmsggit commit -m
gcogit checkout
gcountgit shortlog -sn
gcpgit cherry-pick
gcpagit cherry-pick —abort
gcpcgit cherry-pick —continue
gcsgit commit -S
gdgit diff
gdcagit diff —cached
gdctgit describe —tags git rev-list --tags --max-count=1
gdtgit diff-tree —no-commit-id —name-only -r
gdwgit diff —word-diff
gfgit fetch
gfagit fetch —all —prune
gfogit fetch origin
gggit gui citool
ggagit gui citool —amend
ggpnpgit pull origin $(current_branch) && git push origin $(current_branch)
ggpullgit pull origin $(current_branch)
gglgit pull origin $(current_branch)
ggpurgit pull —rebase origin $(current_branch)
glumgit pull upstream master
ggpushgit push origin $(current_branch)
ggpgit push origin $(current_branch)
ggsupgit branch —set-upstream-to=origin/$(current_branch)
gignoregit update-index —assume-unchanged
gignoredgit ls-files -v | grep «^:lower:«
git-svn-dcommit-pushgit svn dcommit && git push github master:svntrunk
gkgitk —all —branches
glgit pull
glggit log —stat —max-count = 10
glgggit log —graph —max-count = 10
glggagit log —graph —decorate —all
glogit log —oneline —decorate —color
gloggit log —oneline —decorate —color —graph
glp _git_log_prettily (git log —pretty=$1)
gmgit merge
gmtgit mergetool —no-prompt
gpgit push
gpoatgit push origin —all && git push origin —tags
grgit remote
grbagit rebase —abort
grbcgit rebase —continue
grbsgit rebase —skip
grbigit rebase -i
grhgit reset HEAD
grhhgit reset HEAD —hard
grmvgit remote rename
grrmgit remote remove
grsetgit remote set-url
grt cd $(git rev-parse —show-toplevel
grupgit remote update
grvgit remote -v
gsdgit svn dcommit
gspsgit show —pretty = short —show-signature
gsrgit svn rebase
gssgit status -s
gstgit status
gstagit stash save
gstaagit stash apply
gstdgit stash drop
gstlgit stash list
gstpgit stash pop
gstsgit stash show —text
gtsgit tag -s
gunignoregit update-index —no-assume-unchanged
gunwipgit log -n 1 | grep -q -c «—wip—» && git reset HEAD~1
gupgit pull —rebase
gvtgit verify-tag
gwchgit whatchanged -p —abbrev-commit —pretty = medium
gwipgit add -A; git ls-files —deleted -z | xargs -r0 git rm; git commit -m «—wip—«

Otro de los puntos fuertes que tiene es la navegación entre directorios, y considero que es muy interesante porque si usamos mucho la linea de comandos seguro que lo usamos. Veamos algun ejemplo:

  1. Solo con escribir cd y tabular nos muestra todos los directorios que cuelgan del punto donde estamos, podemos movernos por ellos luego tanto con el tabularor como con las flechas.
  2. Escribiendo ‘..’ navega al directorio superior, con ‘…’ navega dos niveles por encima, con ‘….’ ya son tres niveles, y así sucesivamente.
  3. No es necesario escribir cd para navegar, si pones solo el nombre de la carpeta ya es suficiente.
  4. Ni es necesario escribir todo el nombre de la carpeta para navegar, si pones cd y comienzas a escribir el nombre, el intenta adivinarlo, de manera que autocompleta si solo hay una opcion o te muestra los coincidentes si hay varias.

A mayores existen plugins como autojump o Z que aun mejoran más la navegación, para cosas como navegar automáticamente al directorio que mas utilizamos (hay un historial de directorios) solo con escribir porque letra o letras empieza.

También mejora la búsqueda en el historial de comandos, si no sabes de lo que hablo, tu en Bash por ejemplo pulsando la tecla de flecha arriba/abajo podías navegar entre los últimos comandos que fuiste usando.

En Zsh se va un paso más allá y si comienzas a escribir un comando y luego pulsas las teclas de flecha arriba/abajo muestra los últimos comandos usados que coincidan con lo que has puesto.

Esta caraterística es como hacer una búsqueda inversa solo que es más rápido.

A mayores como decíamos, podemos usar algunos de los muchos plugins que la comunidad desarrolla para hacerlo aun más completo.

Por citar algunos…

  • Zsh-autosuggestions para el autocompletado de comandos
  • Sudo que como bien indica sirve para añadir sudo al comando que este escrito o si no hay ninguno al que escribieramos antes.
  • Zsh-syntax-highlighting para que resalte la sintaxis en el terminal
  • Extract que nos provee de un comando para descomprimir la mayoría de archivos desde el terminal.

¿Como instalo oh-my-zsh?

Si llegados a este punto no estás seguro de si instalar o no Zsh deja que te haga una recomendación, instalalo igual y pruebalo unos dias que es la mejor manera de que te convenzas si merece la pena, total como deciamos al principio no tienes que desinstalar Bash, ni tan si quiera tienes que hacer de Zsh tu shell por defecto, si decides quitarlo no hay ningun problema.

En primer lugar instalamos Zsh con este comando:

sudo apt-get install zsh

Y listo, tenemos la base, ahora instalamos el framework oh-my-zsh para gestionar de forma sencilla todo:

// CON CURL
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

//CON WGET
sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

Ya tenemos todo listo, más fácil imposible.

Y si no te gusta lo puedes desinstalar con este comando:

uninstall_oh_my_zsh

En un próximo tutorial os explicaré como añadir o quitar plugins y temas, un saludo!