Enchula Mi Consola
Tags: tutorial, español, beginners, productivity
Published: 2023-12-19 17:20:21

_disponible en [ingles](https://dev.to/josemunoz/pimp-your-cli-3i5e)_

Como desarrollador, la consola (o terminal) es una de las herramientas mas se usan a lo largo de tu carrera. Puede que sea intimidante adentrarse al mundo de las herramientas de consola pero es tambien una de las mejores experiencias que uno puede tener. En este articulo quiero mostrarles mi propia configuración para terminal. Esta basada en las 3 tecnologias que me gusta llamarles la "santísima trinidad" de la terminal: [TMUX](https://github.com/tmux/tmux/wiki), [ZSH](https://www.zsh.org/), & [Neovim](https://neovim.io/).

## Pre-requisitos:
- Linux, MacOS, or WSL

- Una fuente bonita de [NerdFont](https://www.nerdfonts.com/font-downloads)

- Un emulador de terminal decente (i.e: [iterm2](https://iterm2.com/), [alacritty](https://alacritty.org/), etc.)

- El equivalente a `apt install zsh tmux neovim` en tu sistema, yo voy a usar Debian.

## TMUX
La primera piedra en la experience de consola tiene que ser el multiplexor de terminal: `tmux`. 
En pocas palabras `tmux` te permite separar tu terminal en paneles, ventanas, o sesiones. ¿Alguna vez te has conectado a traves de SSH a un servidor para correr un proceso largo y el salva pantallas te mato la sesión? Tmux te mantiene la sesion corriendo aun si la conexion SSH se corta! En cualquier momento podes re-abrir la sesion previa y es como si nada hubiese pasado.

Hay una gran comunidad que hace temas, plugins, y diferentes utilidades basadas en Tmux. Les recomiendo leer [tmux cheat sheet](https://tmuxcheatsheet.com/) para familiarizarse con las funcionalidad y las combinaciones de teclas. Y este es solo la punta del iceberg, hay tantas cosas que probar. Los animo a que investiguen mas por su parte y configuren todo a su gusto ya que la experiencia que viene por defecto no es muy buena.


![tmux por defecto](https://i.imgur.com/LLIs0Cb.png)

Lo primero es crear un archivo de configuración corriendo `nvim ~/.tmux.conf` y una de las mejoras que me gusta hacer inmediatamente es cambiar el indice a base 1 ya que hace mas comodo navegar pestañas con el teclado.

```sh
# start windows, sessions, and panes with 1
set -g base-index 1
set -g pane-base-index 1
set-window-option -g pane-base-index 1
set-option -g renumber-windows on
```

Tmux usa una combinación de teclas para llamar las funciones, y por defecto esto siempre empieza con `Ctrl + b` pero no me parece muy comodo, asi que yo cambio la combinación lider a `Ctrl + Space` que se me hace mas fácil de hacer de manera constante.

```sh
# change prefix
unbind C-b
set -g prefix C-Space
bind C-Space send-prefix
``` 
Por ultimo, algo que me parece que debería ser así por defecto es que cuando abra un panel nuevo me abra la sesion en donde estaba originalmente y no en la raiz.

```sh
 # split in cwd
 bind '"' split-window -v -c "#{pane_current_path}"
 bind '%' split-window -h -c "#{pane_current_path}"
```

Con esto pueden ir modificando y añadiendole a esta configuración a medida vayan usando tmux para hacer su propia configuración. Pero para poder sacarle bien el jugo a `tmux` hay que aprovechar los _plugins_ a traves de TPM (Tmux Plugin Manager). Para instalar TPM se necesita clonar el repositorio dentro de la carpeta de plugins de tmux

```sh
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
```

ponerlo en la lista de plugins en la configuración

```sh
set -g @plugin 'tmux-plugins/tpm'
```

y luego añadir estas lineas de codigo al final del archivo

```sh
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
 run '~/.tmux/plugins/tpm/tpm'
```

Les puedo recomendar tambien `tmux-plugins/tmux-sensible` y `catppuccin/tmux` para tener mejor funcionalidad y estetica. Al final la configuración les debe quedar así:

```sh
 # List of plugins
 set -g @plugin 'catppuccin/tmux'
 set -g @plugin 'tmux-plugins/tpm'
 set -g @plugin 'tmux-plugins/tmux-sensible'
 
 # split in cwd
 bind '"' split-window -v -c "#{pane_current_path}"
 bind '%' split-window -h -c "#{pane_current_path}"
 
 # start windows, sessions, and panes with 1
 set -g base-index 1
 set -g pane-base-index 1
 set-window-option -g pane-base-index 1
 set-option -g renumber-windows on
 
 # change prefix
 unbind C-b
 set -g prefix C-Space
 bind C-Space send-prefix
 
 # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
 run '~/.tmux/plugins/tpm/tpm'
```

Si no has corrido todavía `tmux` en la consola, la nueva configuración va a cargar automaticamente. Para actualizar la configuración estando ya dentro de tmux basta con correr `tmux source-file ~/.tmux.conf` para actualizar la configuración y los plugins se instalan con `Shift + I`

![not too shabby](https://i.imgur.com/fv9TlyP.png)

Dependiendo de la fuente que uses, habra que ajustar el tamaño de la letra, muchas configuraciónes asumen que usas `16` o mas. Si alguno de los plugins no se instala bien, siempre se puede instalar manualmente clonandolo a la carpeta de plugins como lo hicimos para instalar `tpm`. Hay mas recursos en: [Tmux's Awesome list](https://github.com/rothgar/awesome-tmux).

## Z Shell

`zsh` (tambien conocido como ZSHell) es una alternativa a `bash` (tambien conocido como "Bourne-Again SHell"). En funcionlidad básica hacen lo mismo, pero `zsh` tiene mucha mas funcionalidad sobre lo que se puede hacer con bash, y al igual que TMUX, hay un gran ecosistema con plugins, temas, y mas. Cuando corras `zsh` por primera vez, no va a hacer cambiado mucho, pero con los plugins adecuados `zsh` puede convertirse en tu mejor amigo en la terminal. Para empezar vamos a instalar [oh-my-zsh](https://ohmyz.sh), un framework basado en `zsh` que administra configuraciones, temas, plugins, y mas.

```sh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

Una vez completado el instalador vamos a tener un nuevo archivo de configuración llamado `.zshrc` en la carpeta raíz,
si lo editamos con `nvim ~/.zshrc` podemos ver que ya tiene bastantes secciones con comentarios y varias opciones ya configuradas. Les puedo recomendar el plugin `zsh-autosuggestion` que hace que la terminal te de autocomplete basado en tu historial. Para instalarlo hay que agregarlo a la lista de plugins:

```sh
plugins=( 
    # other plugins...
    zsh-autosuggestions
)
```

hay que clonar el repositorio a la carpeta de plugins de `oh-my-zsh`

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

y por ultimo hay que cargar la nueva configuración corriendo `source ~/.zshrc`. 


Mi tema preferido para `oh-my-zsh` es [powerlevel10k](https://github.com/romkatv/powerlevel10k#oh-my-zsh), asi es, mas de nueve mil!

![mas de nueve mil](https://i.imgur.com/MeJrynw.gif) 

Viene con un instalador que te ayuda a configurar paso a paso cada opcion del tema, con muchos iconos, información y colores. 

![powerlevel10k different styles](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zbowsak7ylkggdb37spo.png)

Para instalarlo hay que clonar el repositorio a la carpeta de temas de `oh-my-zsh`

```sh

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

```

hay que cambiar el tema en `.zshrc` y recargar la configuración.

```sh
ZSH_THEME="powerlevel10k/powerlevel10k"
```

Hay mas recursos en: [Zsh's Awesome List](https://github.com/unixorn/awesome-zsh-plugins).

## NeoVIM

Neovim fue lanzado en 2014 como un fork de Vim que lo extiende con soporte para Lua. Lua ya es un lenguaje establecido en el ambito del desarrollo de sistemas linux, lo que lo hace un reemplazo ideal para vimscript lo que hace mas facil para la comunidad que hace plugins. Al igual que Vim, no es facil acostumbrarse a usar Neovim, pero el cambio a trabajar principalmente con el teclado es lo mas productivo que se puede ser con un editor de texto. Inclusive, los editores modernos tienen plugins para poder usar configuraciones de teclado estilo VIM, asi que una vez que se aprende este modo de trabajo se puede traducir a otros editores facilmente.

Hay miles de opciones para configurar en este editor y hacerlo tan util como VSCode. Podemos empezar con opciones basicas como tabs o espacios e ir haciendo una configuración personalizada. Es facil paralizarse con tantas opciones que aprender, pero la comunidad tiene varias configuraciones populares para tener una buena funcionalidad e interfaz sin mucho que hacer como [AstroNvim](https://astronvim.com/) y [NvChad](https://nvchad.com/).

<a href="https://www.youtube.com/watch?v=Mtgo-nP_r8Y">
  <img src="https://i.ytimg.com/vi/Mtgo-nP_r8Y/maxresdefault.jpg" />
</a>

Para instalar una configuración basta con clonar el repositorio a la carpeta de configuración de Neovim

```sh
git clone --depth 1 https://github.com/AstroNvim/AstroNvim ~/.config/nvim
```
ó
```sh
git clone --depth 1 https://github.com/NvChad/NvChad ~/.config/nvim 
```

Al cambiar de configuración hay que hacer los siguientes respaldos:

```sh
mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak
mv ~/.local/state/nvim ~/.local/state/nvim.bak
mv ~/.cache/nvim ~/.cache/nvim.bak
```

Cuando abrís `nvim` la primera vez despues de cambiar la configuración se van a instalar los plugins basicos con [Lazy](https://github.com/folke/lazy.nvim) el manejador de paquetes para Neovim que carga los plugins a medida se van necesitando.
Una vez terminada la instalación el editor se ve como un IDE completo.

![final setup](https://i.imgur.com/CEHh02Y.png)

Algunas [cosirijillas](https://www.youtube.com/watch?v=rpDVBZqCXXE&t=8s) que me hacen la vida mas facil es configurar mi editor global de git que sea `nvim`:

```sh
git config —global core.editor nvim
```

Muchos programas usan `vi` como el editor por defecto, asi que una manera de tomar un atajo y cambiarlos todos es hacerle un alias apuntando a `nvim`

```sh
alias vi=“nvim”
```
 
A veces hay que editar un archivo con privilegios y al correr `sudo nvim` te aparece la configuración inicial sin temas ni nada. Esto es porque Neovim carga su configuración con las variables de ambiente del usuario, para pasarlas con sudo se usa la opción `-E`. Se le puede hacer un alias para hacerte la vida mas facil.

```sh
alias sudo=“sudo -E”
```

Hay mas recursos en: [Neovim's Awesome List](https://github.com/rockerBOO/awesome-neovim).

## Conclusión

Cuando vas a pasar mucho tiempo usando un programa es importante que tenga buena interfaz y funcionalidad. Aventurarse a la consola puede ser intimidante pero con una buena interfaz muchas cosas se vuelven digeribles.
Comenten sus recomendaciones de herramientas de consola, les agradezco de antemano.

## Extra

Si queres enchular tu SSH también, te recomiendo los [SSH Tips and Tricks](https://carlosbecker.com/posts/ssh-tips-and-tricks/) en el blog de Carlos Becker