#308 Oh My ZSH
- Download:
- source codeProject Files in Zip (2.18 KB)
- mp4Full Size H.264 Video (25.9 MB)
- m4vSmaller H.264 Video (11.2 MB)
- webmFull Size VP8 Video (11.7 MB)
- ogvFull Size Theora Video (23.5 MB)
Como desarrolladores Rails pasamos mucho tiempo en la línea de órdenes, pero no siempre le sacamos el máximo provecho. La shell por defecto en los sistemas UNIX es Bash, y una de las mejores cosas que se puede hacer es cambiarla por Z Shell (zsh). Esto puede resultar un poco complicado pero existe un proyecto llamado oh-my-zsh que facilita la instalación de zsh con una configuración atractiva por defecto y alguas extensiones y temas. Lo único que tenemos que hacer para cambiar es lanzar esta orden en el terminal:
wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
Si no tenemos wget
instalado en nuestro equipo podemos instalar zsh con curl
de la siguiente manera:
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
Esta línea clonará el repositorio de oh-my-zsh y lo instalará, aunque tendremos que introducir nuestra clave en el proceso. Una vez que haya finalizado, podemos abrir una ventana nueva de terminal, que ahora ejecutará zsh.
Lo primero que hay que destacar es que el prompt tiene un aspecto considerablemente diferente. Podemos personalizarlo todavía más utilizando temas, lo que veremos más adelante. Aunque zsh tiene un aspecto distinto se comporta por lo general igual que Bash, así que las órdenes que usemos en Bash funcionarán igual en zsh.
Un repaso rápido de la funcionalidad de zsh
Una de las funcionalidades más interesantes de zsh es el autocompletado inteligente. Si, por ejemplo, tecleamos ls -
y luego pulsamos la tecla TAB, veremos una lista de las opciones que admite ls
. Podemos incluso usar las teclas de cursor para recorrer la lista y completar la orden. Esta funcionalidad es especialmente interesante con órdenes más complejas como git commit
.
➜ ~ git commit - --all -a -- update all paths in the index file --allow-empty -- allow recording an empty commit --amend -- amend the tip of the current branch --author -- override the author name used in the commit --cleanup -- specify how the commit message should be cleaned up --edit -e -- edit the commit message before committing --file -F -- read commit message from given file --include -i -- update the given files and commit the whole index --interactive -- interactively update paths in the index file --message -m -- use the given message as the commit message --no-verify -n -- do not look for suspicious lines the commit introduc --only -o -- commit only the given files --quiet -q -- suppress commit summary message --reedit-message -c -- use existing commit object and edit log message --reuse-message -C -- use existing commit object with same log message --signoff -s -- add Signed-off-by line at the end of the commit mess --untracked-files -u -- show files in untracked directories --verbose -v -- show unified diff of all file changes
Otra funcionalidad útil es la posibilidad de especificar opciones de comodín más completas. Si queremos un listado de todos los ficheros Ruby de un proyecto Rails, podemos utilizar el asterisco doble para buscar en directorios con varios niveles de anidamiento.
➜ railscasts git:(master) ls **/*.rb app/controllers/application_controller.rb app/controllers/comments_controller.rb app/controllers/episodes_controller.rb app/controllers/feedback_messages_controller.rb app/controllers/info_controller.rb app/controllers/users_controller.rb app/controllers/versions_controller.rb app/helpers/application_helper.rb app/helpers/comments_helper.rb app/helpers/episodes_helper.rb app/helpers/error_messages_helper.rb app/helpers/feedback_messages_helper.rb # rest of files omitted.
Algunas de las funcionalidades que ofrece zsh son específicas de OS X, por ejemplo en el título de la ventana se ofrece información sobre el usuario, máquina y directorio actual.
Hay muchas otras funcionalidades útiles, si se abre una nueva pestaña de terminal se abrirá en el mismo directorio que en la pestaña anterior. También podemos empezar a escribir una orden y al pulsar la fecla hacia arriba se autocompletará la orden basándose en el historial de órdenes anteriores.
Configuración de zsh
Es posible configurar todas estas funcionalidades editando el fichero .zshrc
de nuestro directorio personal que es el que se carga cuando se arranca una nueva sesión con zsh.
# Path to your oh-my-zsh configuration. ZSH=$HOME/.oh-my-zsh # Set name of the theme to load. # Look in ~/.oh-my-zsh/themes/ # Optionally, if you set this to "random", it'll load a random theme each # time that oh-my-zsh is loaded. ZSH_THEME="robbyrussell" # Set to this to use case-sensitive completion # CASE_SENSITIVE="true" # Comment this out to disable weekly auto-update checks # DISABLE_AUTO_UPDATE="true" # Uncomment following line if you want to disable colors in ls # DISABLE_LS_COLORS="true" # Uncomment following line if you want to disable autosetting terminal title. # DISABLE_AUTO_TITLE="true" # Uncomment following line if you want red dots to be displayed while waiting for completion # COMPLETION_WAITING_DOTS="true" # Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) # Example format: plugins=(rails git textmate ruby lighthouse) plugins=(git) source $ZSH/oh-my-zsh.sh # Customize to your needs... export PATH=/Users/eifion/.rvm/gems/ruby-1.9.2-p290/bin:/Users/eifion/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/eifion/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/eifion/.rvm/bin:/Users/eifion/bin:/usr/local/bin:/usr/local/mysql/bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
Este archivo primero establece la ruta de configuración al directorio de oh-my-zsh y luego establece el tema, que es robbyrussell
. Debajo hay otras opciones que figuran comentadas por ejemplo si queremos desactivar los colores en los listados de directorio podemos descomentar la opción DISABLE_LS_COLORS
.
Más abajo hay una lista de los plugins activados. Tan sólo hemos habilitado la extensión para git
, pero más adelante vamos a añadir más. La línea siguiente source $ZSH/oh-my-zsh.sh
es la que carga oh-my-zsh y por último aparece la línea que configura nuestra variable PATH
, que por defecto es el mismo valor que tenía cuando instalamos oh-my-zsh, pero es mejor importarlo directamente de nuestro perfil de Bash, lo que podemos hacer eliminando la línea que empieza por export PATH
de .zshrc
y luego lanzando la orden.
➜ ~ cat ~/.bash_profile >> ~/.zshrc
Por supuesto estos valores serán diferentes en cada máquina, en la mayoría de ocasiones debería ser posible copiarlos directamente pero algunas veces hará falta hacer algún que otro ajuste para que funcione.
Temas
A continuación crearemos un nuevo tema para modificar el aspecto de la línea de órdenes. Los temas disponibles están en el directorio ~/.oh-my-zsh/themes
y la instalación por defecto incluye muchos. Para ver su aspecto hay un listado de los temas con capturas de pantalla en la página de wiki de oh-my-zsh. Si queremos personalizar aún más oh-my-zsh podemos crear nuestro propio tema creando un nuevo archivo zsh-theme
en el directorio de temas, que es lo que haremos a continuación.
PROMPT='%3~$(git_prompt_info)%#' ZSH_THEME_GIT_PROMPT_PREFIX="[" ZSH_THEME_GIT_PROMPT_SUFFIX="]"
Nuestro tema es muy básico, lo único que hace es establecer el prompt y el sufijo para la parte que aparece cuando el directorio actual es parte de un repositorio Git. Si queremos personalizar nuestro tema todavía más podemos inspirarnos en el código fuente de otros temas. Tambien hay una página útil con documentación con los diversos caracteres que podemos pasar en la variable PROMPT
y lo que hacen. Para ver nuestro tema en acción tendremos que cambiar la opción ZSH_THEME
del fichero .zshrc
para que coincida con el nombre de nuestro tema.
ZSH_THEME="eifion"
Extensiones
Zsh se puede ampliar fácilmente utilizando extensiones. Al igual que con los temas por defecto oh-my-zsh incluye muchas extensiones, que se encuentran en el directorio ~/.oh-my-zsh/plugins
. Antes de activar una extensión es buena idea mirar en su directorio para ver qué es lo que hace. Veremos la extensión para Bundler, que tiene un fichero _bundler
. Si una extensión dispone de un fichero que comienza con un guión bajo quiere decir que añade funcionalidad de autocompletado a una orden. La extensión hace también otras cosas, por ejemplo añade varios alias de las órdenes más frecuentes en Bundler y también hace que varias órdenes relacionadas con Rails se lancen con bundle exect
para no tener que teclearlo cada vez que queramos ejecutarlas.
Hay otras extensiones que pueden ser útiles. La extensión brew
añade autocompletado, al igual que la extensión gem
. Otras son menos útiles, como las extensiones rails3
y ruby
que simplemente añaden algunos alias. Para activar estas extensiones tenemos que incluirlas en la opción plugins
del fichero .zshrc
de la siguiente manera:
plugins=(git bundler brew gem)
También podemos crear nuestras propias extensiones. Nosotros guardamos todos nuestros proyectos en el directorio ~/code
y resulta un poco molesto escribir cd ~/code/<project>
cada vez que queremos cambiarnos al directorio de un proyecto. Crearemos una nueva orden c
que nos permitirá movernos fácilmente al directorio de un proyecto. Podemos crear nuestras propias extensiones en el directorio ~/.oh-my-zsh/custom/plugins
. Nos hará falta un directorio para la extensión y un fichero .plugin.zsh
.
c() { cd ~/code/$1; } _c() { _files -W ~/code -/; } compdef _c c
La primera línea define la orden c
y simplemente establece el directorio actual al subdirectorio del~/code
que se pase como argumento. La segunda línea añade autocompletado para la orden. Para añadir autocompletado tenemos que crear otra orden con el mismo nombre pero precedido de un guión bajo. Nuestra orden _c
delega en el comportamiento de completado de _files
, y por tanto generará los nombres a partir de los ficheros que existan en el directorio ~/code
directory. La última línea establece que _c
debería usarse para autocompletar los argumentos de c
.
Para nuestra extensión esté disponible tenemos que añadirla en la opción correspondiente en nuestro fichero .zshrc
.
plugins=(git bundler brew gem eifion)
Tendremos que abrir una nueva pestaña de terminal para que los cambios surtan efecto, tras lo cual podremos usar nuestra nueva orden.
Con esto concluimos este episodio sobre oh-my-zsh. A los que usen mucho la shell les interesa cambiar la que viene incluida por defecto en el sistema por zsh