Configura tu terminal de Mac como un desarrollador profesional
¿Ves alguna errata o quieres modificar algo? Haz una Pull Request
¿Quieres tener un flujo de trabajo que te permita ser ágil, ahorrar tiempo y ser más productivo en el desarrollo de tus proyectos? A continuación cuento una serie de aplicaciones y configuraciones que harán más agradable la jornada de trabajo en tu Mac. Hoy hablaremos de la terminal.
iTerm2
Mac OSX viene con un terminal por defecto, como todos los sistemas operativos, sin embargo en ocasiones se queda demasiado limitado. Tenemos una alternativa en Mac que se llama iTerm2 . Es gratuita y podemos descargarla desde su página web .
Una de las cosas que más me gusta es la opción de ocultar y mostrar el terminal rápidamente con una combinación de teclas. Para configurar esta opción, debemos ir al menú iTerm2 > Preferences...
, clickar en la pestaña Keys
y habilitar el checkboxk Hotkey - Show/hide iTerm2 with a system-wide hotkey
Colores
También podemos configurar los colores que se muestran en la terminal, eligiendo unos que nos resulten agradables. Para ello en la ventana de preferencias elegimos la pestaña Profiles
, nos creamos uno nuevo. En mi caso le he puesto mi nombre carlosazaustre
y
Los predefinidos que usará el sistema son Black
, Red
, Green
, Yellow
, Blue
, Magenta
, Cyan
y White
. Podemos cambiar sus valores hexadecimales por otros que nos resulten más agradables.
Un Theme para iTerm que resulta cómodo para la vista a la hora de trabajar y pasar muchas horas en la pantalla es el conocido cómo Solarized Dark
. Para añadir este theme a iTerm nos dirigimos al proyecto Solarized en Github y clickamos en la carpeta iterm2-colors-solarized . Elegimos el fichero Solarized Dark.itermscolors
y pulsamos en RAW
para ver su contenido en texto plano . Guardamos el fichero en nuestro equipo con extensión .itermcolors
y lo importamos en iTerm, en la pestaña Profiles
en el botón Load Presets...
Una vez importado, lo seleccionamos en el menú desplegable para activarlo.
Shell
Lo más normal es que tu shell por defecto sea bash
. Para comprobarlo solo tienes que escribir el siguiente comando en la terminal:
$ echo $SHELL
Que te responderá con
/bin/bash
Bash
no está mal, pero prefiero utilizar zsh
por las posibilidades y configuraciones que permite. Para cambiar el tipo de Shell en Mac. Abrimos el Panel de Preferencias del sistema, elegimos Usuarios y Grupos. Clickamos en nustro usuario con Click Derecho y elegimos Opciones avanzadas
En el campo Login Shell
elegimos la opción /bib/zsh
:
Tu terminal de iTerm lucirá ahora así:
Es el momento de personalizar el prompt por uno más Pro y útil que el que trae por defecto
Prompt
La fuente por defecto que trae iTerm es Monaco
, que no está mal, pero yo últimamente prefiero la tipografía de Ubuntu
. La podemos descargar desde font.ubuntu.com y una vez instalada la versión Monospace
en nuestro sistema, la activamos desde la pestaña Text en el tab Profiles de las Preferencias de iTerm
Para poder cambiar el shell por defecto que trae zsh
, por uno más personalizado, tenemos que editar el fichero .zshrc
en el directorio home, o ~
Cargamos los colores de iTerm dentro de la configuración del fichero con autoload -U colors && colors
.
Para personalizar el prompt usamos la variable PROMPT
. Si escribimos algo como PROMPT=" > "
en nuestro terminal tendremos algo como esto:
Podemos configurarlo con más información y colores para hacerlo más identificable.
- La variable
$fg[color]
nos permite cambiar el color de lo que estamos escribiendo sustituyendocolor
porred
,yellow
,green
, etc... - la variable
%n
nos devuelve el nombre del usuario del sistema, en mi casocarlosazaustre
%m
nos devuelve el nombre de la máquina, en mi casomacbookpro
.%~
nos permite ver el directorio en el que nos encontramos.%T
nos devuelve el tiempo (hora:minutos) actual.- la variable
$reset_color
resetea los colores y vuelve a los de por defecto del terminal
También podemos crear funciones, por ejemplo la función precmd
se ejecuta antes de cada Prompt, por lo tanto si creamos la siguiente función:
function precmd() {
ls
}
Se ejecutará el comando ls
que lista los archivos del directorio en el que nos encontremos cada vez que ejecutemos un comando.
También podemos crear alias para comandos, y así ahorrarnos escribir. Por ejemplo, podemos hacer que el comando ll
sea el equivalente a ls -al
para mostrar los ficheros de un directorio en 1 columna, incluyendo los archivos ocultos. Eso lo podemos hacer con la siguiente línea:
alias ll = 'ls -al'
También es muy útil para comandos de Git:
alias ga = 'git add'
alias gc = 'git commit -m'
alias gst = 'git status'
Y a continuación unas funciones que te harán ahorrar tiempo:
function take() {
mkdir $1
cd $1
}
Ésta función lo que hace es crear un directorio con el nombre que le pasemos por parámetro ($1
) y después dirigirse a ese directorio, algo así:
carlosazaustre@macbookpro ~/development
> take project
carlosazaustre@macbookpro ~/development/project
Y esta otra hará que te estalle la cabeza:
function server() {
if [ $1 ]
then
local port="$1"
else
local port="8000"
fi
open "http://localhost:$port" && python -m SimpleHTTPServer "$port"
}
Esto consigue que al teclear server
en tu prompt, se arranque un servidor local en el directorio en que te encuentres y te abre el navegador para que puedas visualizarlo. Ideal para pruebas rápidas si no quieres configurar un servidor con Gulp o Grunt para tu entorno de desarrollo.
Mi fichero .zshrc
completo, con lo que considero más útil, quedaría de la siguiente manera:
autoload -U colors promptinit && colors
# Quickly creates a folder
function take() {
mkdir $1
cd $1
}
# Run a local server on current folder
function server() {
if [ $1 ]
then
local port="$1"
else
local port="8000"
fi
open "http://localhost:$port" && python -m SimpleHTTPServer "$port"
}
# Prompt
PROMPT="
$fg[red]%n$reset_color@$fg[yellow]%m$reset_color: $fg[green]%~$reset_color
$fg[green]>$reset_color "
# alias
alias ll='ls -al'
alias ga='git add'
alias gc='git commit -m'
alias gst='git status'
Oh My ZSH
Si quieres ahorrarte tiempo y ampliar la funcionalidad de tu terminal, te aconsejo que instales Oh My ZSH , un framework para manejar la consiguración de tu shell.
Lo puedes instalar de la siguiente manera:
$ cd ~
$ curl -L http://install.ohmyz.sh | sh
Se instalará en el directorio ~/.oh-my-zsh
.
Para configurar los themes, sólo tienes que abrir el fichero .zshrc
que se ha sido sobreescrito, y en la línea 8: ZSH_THEME="nombre_del_theme_que_más_te_guste"
sustituir por el theme que más te guste.
A mi, particularmente me gusta este, nico.zsh-theme , que yo he cambiado un poco.
Copia el siguiente código en un fichero con nombre nico.zsh-theme
en la carpeta ~/.oh-my-zsh/themes
:
# fork from AVIT ZSH Theme
PROMPT='
$(_user_host)${_current_dir}$(git_prompt_info)
$fg[yellow]>$reset_color '
PROMPT2='%{$fg[grey]%}◀%{$reset_color%} '
#RPROMPT='$(_vi_status)%{$(echotc UP 1)%}$(git_prompt_short_sha) $(_git_time_since_commit) ${_return_status} %T% %{$(echotc DO 1)%}'
RPROMPT='$(_vi_status)%{$(echotc UP 1)%}$(git_prompt_short_sha) ${_return_status} %T% %{$(echotc DO 1)%}'
local _current_dir="%{$fg[magenta]%}%0~%{$reset_color%} "
local _return_status="%{$fg[red]%}%(?..⍉)%{$reset_color%}"
local _hist_no="%{$fg[grey]%}%h%{$reset_color%}"
function _user_host() {
echo "%{$fg[red]%}%n%{$reset_color%}@%{$fg[yellow]%}%m%{$reset_color%}: "
}
function _vi_status() {
if {echo $fpath | grep -q "plugins/vi-mode"}; then
echo "$(vi_mode_prompt_info)"
fi
}
function _ruby_version() {
if {echo $fpath | grep -q "plugins/rvm"}; then
echo "%{$fg[grey]%}$(rvm_prompt_info)%{$reset_color%}"
fi
}
# Determine the time since last commit. If branch is clean,
# use a neutral color, otherwise colors will vary according to time.
function _git_time_since_commit() {
if git rev-parse --git-dir > /dev/null 2>&1; then
# Only proceed if there is actually a commit.
if [[ $(git log 2>&1 > /dev/null | grep -c "^fatal: bad default revision") == 0 ]]; then
# Get the last commit.
last_commit=$(git log --pretty=format:'%at' -1 2> /dev/null)
now=$(date +%s)
seconds_since_last_commit=$((now-last_commit))
# Totals
minutes=$((seconds_since_last_commit / 60))
hours=$((seconds_since_last_commit/3600))
# Sub-hours and sub-minutes
days=$((seconds_since_last_commit / 86400))
sub_hours=$((hours % 24))
sub_minutes=$((minutes % 60))
if [ $hours -gt 24 ]; then
commit_age="${days}d"
elif [ $minutes -gt 60 ]; then
commit_age="${sub_hours}h${sub_minutes}m"
else
commit_age="${minutes}m"
fi
color=$ZSH_THEME_GIT_TIME_SINCE_COMMIT_NEUTRAL
echo "$color$commit_age%{$reset_color%}"
fi
fi
}
if [[ $USER == "root" ]]; then
CARETCOLOR="red"
else
CARETCOLOR="white"
fi
MODE_INDICATOR="%{$fg_bold[yellow]%}❮%{$reset_color%}%{$fg[yellow]%}❮❮%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[green]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}✗%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_CLEAN=" %{$fg[green]%}✔%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_ADDED=" %{$fg[green]%}✚{$reset_color%}"
ZSH_THEME_GIT_PROMPT_MODIFIED=" %{$fg[yellow]%}⚑{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DELETED=" %{$fg[red]%}✖{$reset_color%} "
ZSH_THEME_GIT_PROMPT_RENAMED=" %{$fg[blue]%}▴{$reset_color%} "
ZSH_THEME_GIT_PROMPT_UNMERGED=" %{$fg[cyan]%}§{$reset_color%} "
ZSH_THEME_GIT_PROMPT_UNTRACKED=" %{$fg[grey]%}◒{$reset_color%} "
# Colors vary depending on time lapsed.
ZSH_THEME_GIT_TIME_SINCE_COMMIT_SHORT="%{$fg[green]%}"
ZSH_THEME_GIT_TIME_SHORT_COMMIT_MEDIUM="%{$fg[yellow]%}"
ZSH_THEME_GIT_TIME_SINCE_COMMIT_LONG="%{$fg[red]%}"
ZSH_THEME_GIT_TIME_SINCE_COMMIT_NEUTRAL="%{$fg[yellow]%}"
# Format for git_prompt_long_sha() and git_prompt_short_sha()
ZSH_THEME_GIT_PROMPT_SHA_BEFORE="%{$fg[white]%}[%{$fg[yellow]%}"
ZSH_THEME_GIT_PROMPT_SHA_AFTER="%{$fg[white]%}]"
# LS colors, made with http://geoff.greer.fm/lscolors/
export LSCOLORS="exfxcxdxbxegedabagacad"
export LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43:su=0;41:sg=0;46:tw=0;42:ow=0;43:'
export GREP_COLOR='1;33'
Y en el fichero ~/.zshrc
cambia el valor de la variable ZSH_THEME
por nico
:
ZSH_THEME = "nico";
Reinicia la terminal y tendrás el siguiente aspecto. Con feedback de la rama de Git en la que te encuentres, si ha habido cambios en el repositorio, etc...