Navega a través del historial de comandos de una manera eficiente

Si pasan mucho tiempo en la terminal va a llegar un momento en el que no podrán recordar todos los comandos que usaron durante el día, y ni hablar de los días anteriores. Por suerte para nosotros nuestro "shell" puede almacenar esta información por nosotros. Ahora les voy a enseñar cómo podemos sacar provecho de esta información para mejorar nuestra experiencia en la terminal.

Comandos viejos y las flechas

Estoy seguro que todos aquí saben que pueden navegar el historial de comandos usando las flechas. Algunos de ustedes saben que pueden usar ctrl+r para activar una especie de buscador para revisar comandos viejos. ¿Pero y si les digo que podemos obtener lo mejor de estos dos métodos?

Podemos escribir las primeras letras de un comando y presionar la flecha hacia arriba para empezar a buscar los comandos que comienzen con ese "prefijo".

Imaginen. Tienen los siguientes comandos en su historial.

node ./test.js
vi /tmp/text.txt
nvim /tmp/text.txt
vi /tmp/test.js
echo "a string with vi in it"
vi /tmp/other-text.txt

Quieren buscar los archivos que han editado con vi, escriben vi e inmediatamente presionan la flecha hacia arriba. En este caso en pantalla se muestran sólo los comandos que comienzan con vi:

vi /tmp/text.txt
vi /tmp/test.js
vi /tmp/other-text.txt

Sería genial. Basta de presionar 20 veces la flecha hacia arriba para evitar escribir npm start. Sólo usen np + flecha hacia arriba.

¿Cómo podemos habilitar esta maravilla?

# Flecha hacia arriba
bind '"\e[A": history-search-backward'

# Flecha hacia abajo
bind '"\e[B": history-search-forward'
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search

# Flecha hacia arriba
bindkey "${terminfo[kcuu1]}" up-line-or-beginning-search

# Flecha hacia abajo
bindkey "${terminfo[kcud1]}" down-line-or-beginning-search

Nota: Si usan oh-my-zsh esta funcionalidad ya está activada.

Si por alguna razón terminfo no está definido intenten esto en la terminal: presionan ctrl+v luego una de las flechas. En mi caso obtengo:

Entonces para mí esto también funciona.

bindkey '^[OA' up-line-or-beginning-search
bindkey '^[OB' down-line-or-beginning-search

Búsqueda interactiva

Si el "truco" anterior no los impresiona está bien. Todos tenemos nuestras preferencias. Para realizar una búsqueda interactiva prefiero usar fzf. fzf tiene unos scripts (key-bindings.*sh) que nos brinda un buscador con una mejor experiencia de usuario que el tradicional ctrl+r. Para habilitarlo hay muchas formas (depende de su sistema operativo), así que será mejor que investiguen por su cuenta cómo hacerlo.

Espacio mágico

En bash y zsh hay algo llamado "history-expansion". Basícamente es una forma de consultar la data que tenemos en nuestro historial y usarlo en un comando.

Por ejemplo, tenemos que:

Hay más variantes y combinaciones pero esos son los que uso con más frecuencia.

En fin, yo prefiero "expandir" estos símbolos antes de ejecutar el comando. No me gustaría ejecutar un comando como sudo !! sin saber qué es !!. Para esto uso comando que se llama magic-space. Al igual que en nuestro primer "truco" este es un comando que debemos vincular a una tecla, por lo general a la tecla de espacio.

# Espacio, pero mágico
bind Space:magic-space
# Espacio, pero mágico
bindkey ' ' magic-space

Luego de esto podremos expandir todos estos símbolos antes de ejecutar el comando. Podríamos escribir sudo !! y luego si presionamos espacio veremos cómo !! se transforma en el comando que vamos a ejecutar.

Conclusión

Descubrimos varias maneras mejorar la experiencia de usuario de nuestro "shell" con una serie de trucos. Aprendimos cómo optimizar la búsqueda de comandos con las flechas. Descubrimos fzf como una alternativa al ctrl+r. Aprendimos sobre la "expansión de historial" (history-expansion) para consultar el historial y usar el resultado en el comando que estamos creando. Utilizar estos pequeños trucos en su rutina verán que con el tiempo la experiencia usando la terminal se vuelve un poco más placentera.


¿Tienen alguna pregunta? Pueden dejar un comentario en cualquiera de estas plataformas:

Pueden contactarme por las redes sociales:

Gracias por su tiempo. Si este artículo les pareció útil y quieren apoyar mis esfuerzos para crear más contenido, pueden dejar una propina en buy me a coffee ☕.

Buy Me A Coffee