Instalé `fzf`. ¿Y ahora qué hago? (2023)
(andrew-quinn.me)fzfmejora la búsqueda del historial de comandos con Ctrl+R usando búsqueda difusa desde el momento en que se instala- Con Alt+C puedes moverte rápidamente a directorios de trabajo antiguos sin conocer la ruta exacta
- El comando
fzf, combinado con sustitución de comandos, permite abrir de inmediato el archivo seleccionado con vi, emacs o code - Si pasas la salida de
findafzf, es más fácil encontrar archivos de configuración cuya ubicación no conoces, como nginx.conf - rg. | fzf te permite abrir el archivo deseado usando como pista una línea de su contenido, en lugar del nombre del archivo
El valor que obtienes inmediatamente después de instalar fzf
- Los ingenieros de software pueden crear con facilidad herramientas para mejorar su propio trabajo, pero si van saltando entre varias herramientas sin aprenderlas a fondo, el costo crece con el tiempo
- Una buena heurística 80/20 es dominar primero herramientas clásicas de Unix como
cat,ls,cd,grepycut; en funciones modernas de administración de sistemas también incluyesedyawk 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 importante son las funciones que puedes usar justo después de instalarlo con el script de instalación de
fzfen un entorno estándar de Ubuntu
Efectos inmediatos 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 coincidencia exacta para encontrar el comando que quieres, y como solo muestra una vista previa a la vez, si fallas por una 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, puede que esa integración de atajos no venga incluida, y por eso conviene usar el script de instalación defzf
- En la mayoría de terminales de Linux y Windows,
-
Alt+C: muévete rápido a un directorio que recuerdas vagamentefzfconvierteAlt+Cen un atajo mejorado decdcon búsqueda difusa- Te permite moverte rápido cuando no recuerdas la ruta exacta de un directorio y solo tienes una idea aproximada del nombre
- Es útil para encontrar repositorios o directorios de trabajo que no has visitado en mucho tiempo desde una terminal vacía
El propio comando fzf y su combinación con el shell
-
fzfbásico- Si ejecutas el comando
fzftal cual, hace una búsqueda difusa de rutas relativas de archivos 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 - Este método no tiene nada especial de
vi; también puede usarse conemacs,nano,codeu otro editor que prefieras
- 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 archivos de configuración cuya ubicación desconoces - Cuando quieres encontrar un archivo como
nginx.confy no recuerdas dónde está, en vez de adivinar usando tu conocimiento del FHS o memorizar la ruta, puedes 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 trabarse un momento, pero se recupera después de unos segundos - Esos pocos segundos de retraso son el intercambio a cambio de encontrar archivos de configuración de una forma extremadamente simple
- Si combinas
-
vi **<TAB>- Una función mencionada en un comentario de Hacker News de
sigmonsays, a medio camino entre sobrescribir atajos y ejecutarfzfdirectamente, es la autocompletación difusa con doble asterisco vi **<TAB>puede usarse para elegir un archivo de forma parecida avi $(fzf)- Después de completar el comando real, todavía tienes que presionar
Enteruna vez más - Funciona bien en bash y zsh, pero puede no funcionar en
fish - Si te resulta más fácil recordar el método de invocar explícitamente
$(fzf), quizá no uses esta función con frecuencia
- Una función mencionada en un comentario de Hacker News de
fzf también sirve para mover archivos
-
mv $(fzf) $(fzf)mv $(fzf) $(fzf)sirve cuando no recuerdas con precisión qué quieres mover ni a dónde, pero sí tienes pistas muy específicas sobre ambos- La idea es elegir con dos selecciones de
fzftanto el elemento a mover como su destino - Puede volverse un recurso habitual al mover y acomodar archivos para algo como poner un GIF en un README de GitHub
- Como ejemplo relacionado, se enlaza el README del modo interactivo de
finstem
Combínalo con rg para búsqueda difusa dentro del contenido de archivos
-
rg: ungreprápido con búsqueda recursiva por defecto- La combinación de abajo también puede hacerse con
grep, perorgoripgreptiene la ventaja de buscar recursivamente por defecto para este caso de uso - Si quieres seguir los ejemplos, se recomienda instalar y usar
rg
- La combinación de abajo también puede hacerse con
-
rg . | fzfrg .envía como resultados de búsqueda cada línea de los archivos, y si lo pasas afzf, puedes hacer búsqueda difusa sobre todas las líneas de todos los archivos- Así, en vez de usar el nombre del archivo como pista, usas el contenido de una línea dentro del archivo
-
rg . | fzf | cut -d ":" -f 1- Si a un 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 a un 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- Cuando no recuerdas el nombre del archivo y solo conservas parte del contenido, esto te permite pasar directamente 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