CD fuzzy finder
Presento aquí mi solución personal al problema de moverse rápido entre directorios por la Shell de GNU/Linux. Resulta que durante mis largas jornadas de trabajo, donde estoy constantemente entrando y saliendo de carpetas, he notado que moverme con el ratón por el explorador de archivos y luego hacer click derecho en un hueco vacío para abrir un terminal en ese directorio no es un proceso tan rápido como me gustaría. Más de una vez me he encontrado en situaciones en las que estoy recorriendo el mismo camino por cuarta o quinta vez en la misma jornada.
Normalmente yo no necesito entrar a los directorios desde un entorno
gráfico, suelo acceder para utilizar Git en modo cli, gestionar
archivos o abrir un proyecto entero en el editor de código de turno, con
comandos como nvim .
o code .
los cuales me ahorran mucho tiempo
ejecutándolos desde el directorio que me interesa, antes hacer el
proceso inverso abriendo estos programas desde el entorno gráfico y
luego navegar hasta el directorio desde el.
Solución
Yo ya estoy muy acostumbrado a utilizar el atajo de teclado Ctrl+Alt+T
para abrir una nueva instancia de la terminal situada en el directorio
home de mi usuario. Y se me ocurrió que si conseguía llegar al
directorio deseado lo más rápido posible desde ahí acabaría
agradeciéndolo.
Conocía el programa fzf
(enlace al repo)
que permite hacer una búsqueda sobre una lista de elementos que le
mandes como input. Pero realmente, a pesar de el enorme potencial que
tiene aún no le había encontrado una utilidad muy clara en mi
workflow.
Entonces en un momento de lucidez me vino a la mente el siguiente comando.1
cd "$(find * -type d | fzf)"
Lo que hace básicamente es buscar todos los directorios a partir del
actual con el comando find
y pasar el output al fzf
, dónde nosotros
buscaremos y seleccionaremos a dónde queremos ir. Después el resultado
seleccionado se le pasa como argumento al comando cd
el cual nos lleva
a la dirección solicitada. Y las dobles comillas se las ponemos por si
el directorio solicitado tiene alguna clase de espacio o carácter
especial.
Y ahora que ya tenía lo que yo quería solo necesitaba que fuese
accesible lo más rápido posible, por lo que se me ocurrió agregarlo como
un bind2
en mi ~/.bashrc
, aunque otra opción buena habría sido
agregarlo como alias, pero sin embargo creo que el bind es más rápido
en este caso.
Al final quedó de esta forma para bash, en mi ~/.bashrc
agregué la
siguiente línea.
bind '"\C-g":"cd \"$(find * -type d | fzf)\"\C-m"'
Y en caso de usar zsh habría que agregar lo siguiente al ~/.zshrc
.
bindkey -s '^g' 'cd "$(find * -type d | fzf)"^M'
Variaciones
Hay que tener en cuenta que este comando ignora las carpetas ocultas a
propósito porque a mi me conviene, pero si quisieras listar también esos
directorios solo habría que modificar el comando find
. Una posible
solución podría ser algo como lo siguiente.
cd "$(find $(pwd) -type d | fzf)"
Otra variante para el comando find
podría ser la posibilidad de
ignorar ciertos nombres de carpetas. Por ejemplo, en sistemas macOS no
me gustaría buscar dentro del contenido de las carpetas Library
o
Applications
, por lo que el comando quedaría de la siguiente forma.
cd "$(find * \( -path Library -o -path Applications -o -path opt \) -prune -o -print | fzf)"
He de decir que aún estoy empezando a incorporar esta nueva idea a mi día a día por lo que puede que el comando y, como consecuencia, este articulo sean actualizados a medida que pase el tiempo.
1. ^ Nótese que es necesario haber instalado fzf
para que funcione. He aquí la guía de instalación.
2. ^ En mi caso bindeé la combinación de teclas Ctrl+G
para ejecutar la sentencia.