Instalé `fzf`. ¿Y ahora qué hago? (2023)
(andrew-quinn.me)- El buscador difuso de línea de comandos
fzfofrece un valor inmediato y único en relación con la inversión, pero muchos desarrolladores lo instalan, no saben cómo aprovecharlo y terminan abandonándolo - Puede reemplazar la búsqueda del historial con
Ctrl+Rpor coincidencia difusa y vista previa múltiple, resolviendo la incomodidad del método anterior basado en coincidencia exacta de cadenas - Con
Alt+C, incluso si solo recuerdas vagamente el nombre de un directorio, puedes hacercddifuso, y también puedes armar un flujo de trabajo para abrir archivos al instante con la combinaciónvi $(fzf) - Al conectarlo por pipe con
ripgrep, puedes hacer un uso avanzado: buscar difusamente todas las líneas de todos los archivos y luego abrir de inmediato ese archivo en el editor - Es una herramienta con una mejora de productividad tan inmediata que incluso rompe la heurística 80/20 de aprender primero herramientas Unix tradicionales como
cat,grepyfind
El valor que obtienes justo después de instalar fzf
- Los ingenieros de software pueden crear con facilidad herramientas para mejorar su propio trabajo, pero si van saltando entre muchas herramientas sin dominarlas a fondo, el costo crece con el tiempo
- Una buena heurística 80/20 es aprender primero herramientas Unix antiguas como
cat,ls,cd,grepycut; en funciones modernas de administración de sistemas también entransedyawk fzfpuede verse como una excepción a esa heurística porque su retorno sobre la inversión es inmediato y su valor es único- Lo clave son las funciones que puedes usar enseguida después de instalarlo con el script de instalación de
fzfen un entorno Ubuntu estándar
Efecto inmediato de los atajos predeterminados
-
Ctrl+R: convierte el historial de comandos en una búsqueda difusa- En la mayoría de terminales de Linux y Windows,
Ctrl+Rofrece búsqueda inversa del historial de comandos - El
Ctrl+Rpredeterminado requiere una coincidencia exacta para encontrar el comando que quieres, y además solo muestra una vista previa a la vez, así que si fallas por una sola letra se vuelve difícil encontrarlo - Al instalar
fzf, varios atajos de teclado se sobrescriben con un comportamiento mejor, yCtrl+Rtambién mejora mucho frente al método anterior - Si lo instalas con un gestor de paquetes como
apt, es posible que no se incluya esta integración de atajos, lo que explica por qué conviene usar el script de instalación defzf
- En la mayoría de terminales de Linux y Windows,
-
Alt+C: ir rápido a un directorio que recuerdas vagamentefzfconvierteAlt+Cen un atajo mejorado decddifuso- Puedes moverte rápido cuando no recuerdas la ruta exacta de un directorio y solo tienes presente un nombre aproximado
- Es útil para encontrar repositorios o directorios de trabajo que no visitas desde hace tiempo desde una terminal vacía
El propio comando fzf y sus combinaciones con el shell
-
fzfbásico- Si ejecutas el comando
fzftal cual, hace una búsqueda difusa de rutas de archivos relativas tomando como base el directorio actual - Por sí solo, su utilidad es limitada porque básicamente solo sirve para elegir la ubicación de un archivo
- Si ejecutas el comando
-
vi $(fzf)- Si lo combinas con sustitución de comandos, como en
vi $(fzf), puedes abrir directamente en el editor el archivo que elegiste con búsqueda difusa - Esta forma no tiene nada especial de
vi; también puede usarse con el editor que prefieras, comoemacs,nano,code, etc.
- Si lo combinas con sustitución de comandos, como en
-
vi $(find . '/' | fzf)- Si combinas
find . '/' | fzfcon un editor, puedes buscar difusamente entre candidatos de ruta completa y abrir un archivo de configuración cuya ubicación no conoces - Cuando quieres encontrar un archivo como
nginx.confpero no recuerdas dónde está, en vez de intentar adivinar o memorizar su ubicación a partir del FHS, basta con pasar la salida defindafzf - Si buscas algo como
conf$, puedes filtrar solo las líneas que terminan enconf - Si
findse topa con muchos errores dePermission denied,fzfpuede tambalearse un momento, pero se recupera después de unos segundos - Esos segundos de retraso son el intercambio a cambio de la comodidad de encontrar archivos de configuración de una forma muy simple
- Si combinas
-
vi **<TAB>- Una función mencionada en un comentario de Hacker News de
sigmonsays, ubicada más o menos a mitad de camino entre sobrescribir atajos y ejecutarfzfdirectamente, es la autocompletación difusa con doble asterisco vi **<TAB>puede usarse para elegir archivos de forma parecida avi $(fzf)- Después de que se completa el comando real, todavía tienes que presionar
Enteruna vez más - Funciona bien en bash y zsh, pero en
fishpuede que no funcione - Si te resulta más fácil recordar la forma de invocarlo explícitamente con
$(fzf), quizá no uses esta función tan seguido
- Una función mencionada en un comentario de Hacker News de
Usar fzf también para mover archivos
-
mv $(fzf) $(fzf)mv $(fzf) $(fzf)sirve cuando no recuerdas exactamente qué quieres mover ni a dónde quieres moverlo, pero sí tienes pistas muy concretas sobre cada uno- La idea es elegir con dos selecciones de
fzftanto el elemento a mover como el destino - Puede volverse algo que uses con frecuencia al mover y acomodar archivos, por ejemplo al agregar GIFs a un README de GitHub
- Como ejemplo relacionado, se enlaza el README del modo interactivo de
finstem
Búsqueda difusa incluso dentro del contenido de archivos con rg
-
rg: ungreprápido con búsqueda recursiva por defecto- La combinación de abajo también se puede hacer con
grep, perorgoripgreptiene la ventaja de que busca recursivamente por defecto - Para seguir el ejemplo, se recomienda instalar y usar
rg
- La combinación de abajo también se puede hacer con
-
rg . | fzfrg .envía como resultados de búsqueda cada línea de los archivos, y si eso se pasa afzf, puedes buscar difusamente entre todas las líneas de todos los archivos- En vez de buscar por nombre de archivo, aquí buscas a partir del contenido de una línea dentro del archivo
-
rg . | fzf | cut -d ":" -f 1- Si al resultado elegido con
rg . | fzfle agregascut -d ":" -f 1, puedes devolver el primer campo separado por dos puntos, es decir, la ubicación del archivo - Es una combinación para buscar difusamente por contenido de línea y luego obtener solo la ruta del archivo que contiene esa línea
- Si al resultado elegido con
-
vim $(rg . | fzf | cut -d ":" -f 1)vim $(rg . | fzf | cut -d ":" -f 1)es una combinación que busca difusamente entre todas las líneas de todos los archivos y luego abre envimel archivo que contiene la línea seleccionada- Si no recuerdas el nombre del archivo y solo recuerdas parte de su contenido, puedes saltar directo al editor
1 comentarios
Comentarios de Lobste.rs
Siento que el público objetivo de este artículo soy exactamente yo. Instalé fzf, pensé “qué genial”, y luego seguía olvidando usarlo, pero ahora quizá sí lo use
Puede que sea un buen artículo, pero si el objetivo es responder “¿y ahora qué hago?”, empezar por la integración con el shell de fzf da la impresión de que apunta a un público más limitado
Ya estoy acostumbrado a usar ctrl-r en bash, así que pedir que lo cambie es poner la vara demasiado alta. Me habría gustado que primero explicara cómo practicar el mismo comportamiento sin reemplazar el valor predeterminado
ctrl-r es probablemente el comando que más uso, y fzf fue una mejora que encajó de inmediato sin curva de aprendizaje. Como se ejecuta con ctrl-r, tampoco se me olvida usar fzf. Eso sí, después me pasé a Fish shell, donde ese mismo comportamiento ya viene por defecto
Me convencieron. Pronto voy a agregar fzf y la integración con el shell, y hoy aprendí algo nuevo
Cuando buscas archivos para meter en un comando, también puedes usar el atajo
ctrl-t. Lo uso seguido congitpara elegir archivos que quiero incluir en cierto cambio, y también lo he usado para filtrar resultados degrepy reducir el alcance de la búsquedaAdemás de mejorar la búsqueda en el historial del shell, he usado
fzfcon estos dos aliasalias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'Lo uso principalmente para elegir qué ramas locales borrar después de fusionar pull requests. Puede que haya una mejor forma, pero hasta ahora nunca me ha fallado
alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'Esto me permite cambiar rápido AWS_PROFILE según los valores en
~/.aws/config. Ahora estoy pensando en hacer un alias parecido para cambiar de namespace en KubernetesSi usas el plugin fzf.vim, puedes usar fzf dentro de vim. No solo para abrir archivos, sino también para buscar de forma difusa entre buffers, historial de comandos, contenido de archivos y más
Mi uso principal de fzf es recorrer y buscar el historial lineal de commits de Git para entender qué cambió recientemente
En mi configuración base de Git, tengo
git fzfdefinido asíSiento que me estoy perdiendo de algo. Me pregunto por qué alguien instalaría fzf si no sabe qué hacer con él
También hay una publicación reciente relacionada. Un usuario está usando fzf como selector de archivos para jj
https://lobste.rs/s/exlogg/jjj