1 puntos por GN⁺ 4 시간 전 | 1 comentarios | Compartir por WhatsApp
  • fzf mejora 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 find a fzf, 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, grep y cut; en funciones modernas de administración de sistemas también incluye sed y awk
  • fzf puede 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 fzf en 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+R ofrece búsqueda inversa del historial de comandos
    • El Ctrl+R predeterminado 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, y Ctrl+R tambié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 de fzf
  • Alt+C: muévete rápido a un directorio que recuerdas vagamente

    • fzf convierte Alt+C en un atajo mejorado de cd con 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

  • fzf básico

    • Si ejecutas el comando fzf tal 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
  • 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 con emacs, nano, code u otro editor que prefieras
  • vi $(find . '/' | fzf)

    • Si combinas find . '/' | fzf con 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.conf y no recuerdas dónde está, en vez de adivinar usando tu conocimiento del FHS o memorizar la ruta, puedes pasar la salida de find a fzf
    • Si buscas algo como conf$, puedes filtrar solo las líneas que terminan en conf
    • Si find se topa con muchos errores de Permission denied, fzf puede 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
  • vi **<TAB>

    • Una función mencionada en un comentario de Hacker News de sigmonsays, a medio camino entre sobrescribir atajos y ejecutar fzf directamente, es la autocompletación difusa con doble asterisco
    • vi **<TAB> puede usarse para elegir un archivo de forma parecida a vi $(fzf)
    • Después de completar el comando real, todavía tienes que presionar Enter una 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

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 fzf tanto 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: un grep rápido con búsqueda recursiva por defecto

    • La combinación de abajo también puede hacerse con grep, pero rg o ripgrep tiene la ventaja de buscar recursivamente por defecto para este caso de uso
    • Si quieres seguir los ejemplos, se recomienda instalar y usar rg
  • rg . | fzf

    • rg . envía como resultados de búsqueda cada línea de los archivos, y si lo pasas a fzf, 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 . | fzf le agregas cut -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
  • 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 en vim el 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

 
GN⁺ 4 시간 전
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

    • La clave es integrarlo en tu configuración del shell existente, scripts personales y alias. Uso fzf todo el tiempo, pero casi nunca lo ejecuto directamente
  • 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

    • En la práctica, es más bien un valor predeterminado mejorado. Lo correcto es dejar que reemplace ctrl-r, y la mitad de su atractivo está en conservar una acción familiar dentro de tus dedos mientras obtienes una experiencia más rica con un flujo casi igual al de siempre
      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 con git para elegir archivos que quiero incluir en cierto cambio, y también lo he usado para filtrar resultados de grep y reducir el alcance de la búsqueda

  • Además de mejorar la búsqueda en el historial del shell, he usado fzf con estos dos alias
    alias 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 Kubernetes

  • Si 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 fzf definido así

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • 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