Por qué deberías usar fzf, el buscador difuso de línea de comandos

por Alexey Samoshkin

Demo encontrado

En este tutorial, te ayudaré a llevar tus hábitos de línea de comandos a un nivel superior con fzf . Empieza a buscar archivos como un profesional. Aprenda las características menos conocidas, como el cambio de directorio, la búsqueda a través de un historial de comandos, la búsqueda del nombre de host para SSH, matar un proceso, tener una vista previa instantánea de archivos con resaltado de sintaxis, y más…

demostración rápida

Hoy voy a hablarle de una herramienta que puede cambiar su vida tecnológica en «antes» y «después». Créeme, no es una hipérbole. Te presento a fzf, que son las siglas de fuzzy finder. Como dice su definición, es un buscador difuso de propósito general en la línea de comandos. Eso no suena muy descriptivo y atractivo para los que oyen hablar de él por primera vez. Pero es un proyecto muy popular con alrededor de 21.000 estrellas en Github. Así que es hora de despejar la niebla y obtener una visión más profunda.

Este post acompaña a mi reciente screencast sobre el tema. Así que, si eres una persona que aprende mirando, échale un vistazo. De lo contrario, échale un vistazo también *, porque herramientas como fzf se introducen mejor con una demostración en vivo en lugar de toneladas de texto.

Como la página del proyecto fzf no tiene ningún vídeo de demostración hasta ahora, he llamado a este post «demostración perdida encontrada». Pero ahora, este vídeo ya se ha metido en el repo de fzf y ha pasado a formar parte del readme del proyecto.

Búsqueda de archivos

Las personas que están acostumbradas a un entorno de línea de comandos probablemente estén familiarizadas con el concepto de filtros Unix. Esto es cuando varias utilidades independientes se componen juntas en una tubería para producir la salida deseada paso a paso. Por ejemplo, esta cadena produce una lista de cadenas:

$ yes | head -10 | awk '{ print NR, NR % 2 == 0 ? "even" : "odd" }'
1 odd2 even3 odd4 even5 odd6 even7 odd8 even9 odd10 even

Cada programa actúa como un filtro. En términos simples, fzf es sólo otro filtro Unix. Lee líneas de stdin, lanza un diálogo interactivo de búsqueda y, finalmente, escribe los elementos seleccionados en stdout. El punto clave y la diferencia con respecto a herramientas como GNU find, es su diálogo buscador interactivo que filtra los elementos al instante mientras se escribe.

«fzf» como filtro interactivo de unix

Puede que no suene demasiado práctico hasta ahora, pero el caso de uso principal de fzf es buscar archivos en la línea de comandos. Con la coincidencia difusa y la retroalimentación instantánea, usted está a sólo unos pocos caracteres de encontrar el archivo correcto, no importa cuán profundamente se pierde en la jerarquía de directorios. No es necesario volver al gestor de archivos, recorrer la jerarquía de directorios, copiar la ruta de un archivo y pegarla de nuevo en el shell. Compare los flujos de trabajo del «gestor de archivos» frente al «fzf» a continuación.

comparación del fzf frente al gestor de archivos

fzf soporta la coincidencia difusa, por lo que puede escribir varios caracteres seguidos y coincidirá con las líneas que tengan esos caracteres dispersos en la cadena. Alternativamente, anteponga un término de búsqueda con una comilla simple, como 'string, para optar por las coincidencias exactas solamente, o ejecute como fzf --exact .

coincidencia difusa vs. exacta

No soporta expresiones regulares o patrones glob, por lo que el patrón *.sh no funcionaría. Pero manténgalo simple – la productividad y la velocidad es su objetivo hoy. No tiene tiempo libre para componer y escribir expresiones regulares correctas. En su lugar, simplemente escriba varias palabras, o incluso partes de las palabras, delimitadas por un espacio, y eso cubriría el >90% de los casos de uso. Para el 10% restante, use ^ and $ para coincidir con el inicio y el final de la cadena respectivamente, y use ! para negar la coincidencia.

sintaxis de coincidencia de fzf

Imprimir los archivos seleccionados en una línea de comandos no es súper útil, por lo que normalmente la búsqueda se combina con alguna acción adicional. Por ejemplo, usted podría abrirlo con Vim, o canalizar los elementos seleccionados al siguiente programa.

# Open file in a Vimvim -o `fzf`
# Print info for each selected filefzf | xargs ls -l

Completación difusa para bash y zsh

Para hacerlo más conveniente, la compleción difusa puede ser activada si la palabra antes del cursor termina con la secuencia de activación que es por defecto **. Por ejemplo, escriba vim ~/path/** y pulse TAB . Voilà, ¡fzf entra!

La secuencia de terminación difusa de doble estrella

** dispara el buscador fzf y se asemeja a * que es para la expansión nativa del shell. En algún momento, incluso puede olvidarse de la presencia de fzf y tener la impresión de que es una característica nativa del shell.

El formato es el siguiente, donde FUZZY_PATTERN es opcional.

COMMAND **<TAB>

Si no le gusta la secuencia **, puede utilizar los atajos de teclado. CTRL+T desencadena fzf y pega el archivo seleccionado en la línea de comandos, mientras que ALT+C cambia al directorio seleccionado.

Cambio de directorio

Bueno, basta de buscar archivos. Hablemos de otras aplicaciones útiles. Cambiar el directorio de trabajo es una operación muy común. Pero, sin embargo, siempre me atasco un poco intentando recordar y escribir la ruta correcta del directorio, cometiendo varios errores por el camino. Esto ralentiza mi ritmo. Ni siquiera las terminaciones de zsh lo compensan. Pero con fzf, cambiar de directorio es una brisa, no importa lo profundo y lejano que sea. Sólo tienes que escribir cd ** y ya casi estás allí.

Cambiar de directorio es como una brisa

Nota que mientras fzf está indexando tu árbol de directorios, puedes empezar a buscar de inmediato. Cambiar de directorio es mi caso de uso favorito, y la concordancia difusa realmente sobresale aquí. Se requiere de usted el mismo esfuerzo para cambiar un directorio si es un nivel de profundidad o diez niveles de profundidad.

ALT+C acceso directo es una forma alternativa para desencadenar fzf en un modo de cambio de directorio.

Historial de comandos

Es posible que esté utilizando Ctrl+R acceso directo del teclado para buscar a través de su historial de comandos. Genial, pero ¿qué tal si lo superas con el buscador difuso? Mira y compara.

Búsqueda en el historial de comandos

Pega el elemento seleccionado en la línea de comandos, para que puedas modificarlo más.

Busca el nombre del host para SSH en

Si eres un desarrollador de backend y trabajas con varios servidores remotos, podrías apreciar el combo ssh+fzf. Utilice la misma secuencia de disparo de doble estrella y escriba ssh ** . Saca las direcciones IP y los nombres de host usados recientemente de su ~/.ssh/config y saca un buscador interactivo.

Combo «fzf + ssh»

Enviar una señal a un proceso

A veces queremos enviar una señal a un proceso, pero primero necesitamos obtener su PID por nombre. Normalmente se utiliza pgrep <process_name> para resolver el PID seguido de by a kill <process_pid> refiriéndose a eset PID. Con fzf puede combinar los pasos de steps. Type kill <TAB> y fzf para listar todos sus procesos. Ya no es necesario cambiar a un monitor de procesos dedicado, como el «Monitor de actividad» en Mac.

Encuentra un proceso y envía una señal

Visualiza los archivos mientras buscas

Supongamos que estás buscando archivos, pero a veces el propio nombre del archivo no te dice lo suficiente. Así que es posible que desee echar un vistazo al contenido de un archivo por un momento para tomar una decisión. fzf te cubre aquí también.

Ventana de vista previa

Por defecto tengo la ventana de vista previa desactivada, pero la activo cuando quiero echar un vistazo a los archivos. Además, la he mejorado con una salida coloreada y un resaltado de sintaxis usando bat como comando de vista previa.

Personalización

Hay dos formas principales de personalizar la versión de stock de fzf:

  • Cambiar el comportamiento del diálogo del buscador (ventana de vista previa, atajos de teclado, dimensiones, acciones personalizadas, etc). Ver variable de entorno FZF_DEFAULT_OPTS.
  • Cambiar el backend de búsqueda subyacente. Por defecto utiliza la utilidad GNU find, pero puede cambiar a las herramientas más avanzadas como fd o ripgrep. Primero, es más rápido que la utilidad find. En segundo lugar, esas herramientas respetan las reglas .gitignore, por lo que no se obtienen archivos node_modules o .git en los resultados de la búsqueda. También puedes usar git ls-tree para listar archivos cuando estás en un repo de Git. Ver FZF_DEFAULT_COMMAND variable de entorno.

La configuración se realiza a través de las variables de entorno. Aquí está el fragmento de mi configuración. No estoy seguro de que funcione tal cual cuando se copia y se pega, lo más probable es que haya algunas otras dependencias que faltan. Pero esto es sólo para dar una idea de cómo se ve la configuración.

Fzf y Vim

Hasta ahora hemos visto el uso de la línea de comandos solamente. Pero fzftambién se envía como un plugin de Vim. Y créame, si usted es un Vimmer, vale la pena añadir a su vimrc. El uso de Vim está fuera del alcance de este post, de lo contrario nadie lo leería. Pero hablo de ello a fondo en la segunda parte del mi vídeo, también enlazado al principio del post.

Si estás impaciente, aquí tienes un pequeño extracto para llamar tu atención. Utilice el comando :grep para la búsqueda de texto en todo el proyecto, abra las coincidencias en la ventana fzf en un modo de pantalla completa, filtre aún más las coincidencias dentro de fzf, y salte a la coincidencia seleccionada. Y no se olvide de la vista previa instantánea del archivo en la posición precisa de la línea. Es impresionante, ¿no?

fzf ❤️ vim

Conclusión

Espero que estés impresionado de lo súper impresionante que es fzf. Lo más probable es que ya estés dispuesto a instalarlo y probarlo.

Tenga en cuenta que fzfno sólo sirve para buscar archivos, aunque es su característica principal. Como puedes ver, «búsqueda + acción» es un principio general, pero es lo suficientemente abstracto y potente como para trabajar con cualquier tipo de lista: archivos, directorios, procesos, nombres de host, etc. Recuerda al principio de este post – fzf es sólo un filtro Unix. Libera tu imaginación, aliméntalo con cualquier lista y adáptalo a tus propias necesidades. Puede inspirarse en una gran cantidad de ejemplos.

BTW, aprecia lo superior que es la filosofía Unix. fzf es un gran ejemplo de un programa que se adhiere a estos principios.

  • deje que el programa haga una cosa y la haga bien (principio de responsabilidad única)
  • hágalo lo suficientemente abstracto como para ser agnóstico de detalles irrelevantes o tipos de datos
  • componga programas individuales separados utilizando interfaces estándar bien definidas.

Siga estos principios en su carrera de desarrollo de software. Conocer los principios fundamentales que están detrás del rápido nacimiento y muerte de múltiples herramientas, lenguajes y frameworks que existen es lo que diferencia a los desarrolladores profesionales de los aficionados.

Recursos

junegunn/fzf: A command-line fuzzy finder – https://github.com/junegunn/fzf

Universo Vim. fzf – command line fuzzy finder – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

Mi canal de Youtube. Sólo hay unos pocos vídeos, ya que estoy dando mis primeros pasos en hacer screencasts. Tened paciencia, prometo hacer más vídeos. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Una alternativa simple, rápida y amigable a ‘find’ – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep busca recursivamente en directorios un patrón regex – https://github.com/BurntSushi/ripgrep

junegunn/fzf.vim: fzf vim – https://github.com/junegunn/fzf.vim

Deja una respuesta

Tu dirección de correo electrónico no será publicada.