1P by GN⁺ 5시간전 | ★ favorite | 댓글 1개
  • fzf는 설치 직후 Ctrl+R 명령 기록 검색을 퍼지 검색으로 개선함
  • Alt+C로 정확한 경로 없이 오래된 작업 디렉터리로 빠르게 이동 가능함
  • fzf 명령은 명령 치환과 결합해 선택한 파일을 vi, emacs, code로 바로 열 수 있음
  • find 결과를 fzf에 넘기면 nginx.conf처럼 위치를 모르는 설정 파일을 찾기 쉬워짐
  • rg. | fzf는 파일명 대신 파일 내용 줄을 단서로 원하는 파일을 열게 해줌

fzf를 설치한 뒤 바로 얻을 수 있는 가치

  • 소프트웨어 엔지니어는 자기 업무를 개선하는 도구를 쉽게 만들 수 있지만, 여러 도구를 옮겨 다니며 깊게 익히지 않으면 시간이 지날수록 비용이 커짐
  • 좋은 80/20 휴리스틱은 cat, ls, cd, grep, cut 같은 오래된 Unix 도구를 먼저 익히는 것이며, 현대적인 시스템 관리 역할에서는 sedawk도 포함됨
  • fzf는 투자 대비 효과가 즉각적이고 가치가 독특해 이 휴리스틱의 예외로 볼 수 있음
  • 표준 Ubuntu 환경에서 fzf 설치 스크립트로 설치한 뒤 바로 쓸 수 있는 기능들이 핵심임

기본 단축키가 주는 즉시 효과

  • Ctrl+R: 명령어 기록을 퍼지 검색으로 바꿈

    • 대부분의 Linux와 Windows 터미널에서 Ctrl+R은 명령어 역방향 검색을 제공함
    • 기본 Ctrl+R은 원하는 명령을 찾으려면 정확한 일치가 필요하고, 한 번에 하나의 미리보기만 보여줘 한 글자만 빗나가도 찾기 어려워짐
    • fzf를 설치하면 여러 키보드 단축키가 더 나은 동작으로 덮어써지며, Ctrl+R도 기존 방식보다 크게 개선됨
    • apt 같은 패키지 관리자로 설치하면 이 단축키 통합이 제공되지 않을 수 있어, fzf 설치 스크립트를 쓰는 이유가 됨
  • Alt+C: 기억이 흐릿한 디렉터리로 빠르게 이동

    • fzfAlt+C를 강화된 퍼지 cd 단축키로 바꿔줌
    • 디렉터리의 정확한 경로를 기억하지 못하고 대략적인 이름만 기억할 때 빠르게 이동할 수 있음
    • 빈 터미널에서 오래 방문하지 않은 저장소나 작업 디렉터리를 찾을 때 유용함

fzf 명령 자체와 셸 조합

  • 기본 fzf

    • fzf 명령을 그대로 실행하면 현재 디렉터리를 기준으로 상대 파일 경로를 퍼지 검색함
    • 단독으로는 파일 위치를 고르는 정도라 활용도가 크지 않음
  • vi $(fzf)

    • vi $(fzf)처럼 명령 치환과 조합하면, 퍼지 검색으로 고른 파일을 편집기에서 바로 열 수 있음
    • 이 방식은 vi에만 특별한 것이 아니며, emacs, nano, code 등 원하는 편집기와 함께 쓸 수 있음
  • vi $(find . '/' | fzf)

    • find . '/' | fzf를 편집기와 조합하면, 위치를 모르는 설정 파일을 전체 경로 후보에서 퍼지 검색해 열 수 있음
    • nginx.conf처럼 위치가 기억나지 않는 파일을 찾을 때, FHS 지식을 떠올려 추측하거나 외워두는 대신 find 결과를 fzf에 파이프하면 됨
    • conf$처럼 검색하면 conf로 끝나는 줄만 필터링할 수 있음
    • find가 많은 Permission denied 오류를 만나면 fzf가 잠시 흔들릴 수 있지만 몇 초 뒤 회복됨
    • 이런 몇 초의 지연은 설정 파일을 매우 단순한 방식으로 찾는 편익과의 트레이드오프가 됨
  • vi **<TAB>

    • sigmonsays의 Hacker News 댓글에서 나온 기능으로, 단축키 덮어쓰기와 fzf 직접 실행의 중간쯤에 별표 두 개를 쓰는 퍼지 탭 완성이 있음
    • vi **<TAB>vi $(fzf)와 비슷한 방식으로 파일을 고르는 데 쓸 수 있음
    • 실제 명령이 완성된 뒤 Enter를 한 번 더 눌러야 함
    • bash와 zsh에서는 잘 동작하지만, fish에서는 동작하지 않는 경우가 있음
    • $(fzf)를 명시적으로 호출하는 방식이 더 기억하기 쉽다면 이 기능을 자주 쓰지 않을 수도 있음

파일 이동에도 쓰는 fzf

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf)는 무엇을 옮길지와 어디로 옮길지 정확히 기억하지 못하지만, 각각에 대해 매우 구체적인 단서만 기억할 때 쓸 수 있음
    • 두 번의 fzf 선택으로 이동할 대상과 목적지를 고르는 방식임
    • GitHub README에 GIF를 넣는 작업처럼 파일을 옮겨 배치할 때 자주 손이 갈 수 있음
    • 관련 예로 finstem의 interactive mode README가 연결됨

rg와 조합해 파일 내용까지 퍼지 검색

  • rg: 재귀 검색이 기본인 빠른 grep

    • 아래 조합은 grep으로도 가능하지만, rg 또는 ripgrep은 재귀 검색이 기본이라 이 용도에서 강점이 큼
    • 예제를 따라 하려면 rg를 설치해 쓰는 것이 권장됨
  • rg . | fzf

    • rg .는 파일들의 각 줄을 검색 결과로 내보내고, 이를 fzf로 넘기면 모든 파일의 모든 줄을 퍼지 검색할 수 있음
    • 파일 이름이 아니라 파일 안의 줄 내용을 단서로 찾는 방식이 됨
  • rg . | fzf | cut -d ":" -f 1

    • rg . | fzf로 고른 결과에 cut -d ":" -f 1을 붙이면 콜론 기준 첫 번째 필드, 즉 파일 위치를 반환할 수 있음
    • 줄 내용을 퍼지 검색한 뒤 해당 줄이 들어 있는 파일 경로만 얻는 조합임
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1)은 모든 파일의 모든 줄을 퍼지 검색한 뒤, 선택한 줄이 들어 있는 파일을 vim으로 여는 조합임
    • 파일 이름을 기억하지 못하고 내용 일부만 기억할 때 편집기로 바로 이어질 수 있음
Lobste.rs 의견들
  • 이 글의 대상 독자가 딱 나인 듯함. fzf를 설치하고 “천재적이네”라고 생각한 뒤, 정작 쓰는 걸 계속 잊어버렸는데 이제는 쓸지도 모르겠음

    • 핵심은 기존 셸 설정, 개인 스크립트, 별칭에 통합하는 것임. fzf를 항상 쓰지만 직접 실행하는 경우는 거의 없음
  • 좋은 글일 수는 있지만, “이제 뭘 하지?”에 답하려는 목표라면 fzf 셸 통합부터 시작하는 건 오히려 더 좁은 독자층만 상대하는 느낌임
    bash에서 ctrl-r을 익숙하게 쓰고 있는데, 그걸 바꾸라고 하는 건 요구 수준이 너무 높음. 기본값을 대체하지 않고 같은 동작을 연습하는 방법부터 알려줬으면 함

    • 실제로는 강화된 기본값에 가까움. ctrl-r을 대체하게 두는 게 맞고, 핵심 매력의 절반은 손에 익은 동작을 유지하면서 기존 흐름과 거의 같은데 더 풍부한 경험을 얻는 데 있음
      ctrl-r은 아마 내가 가장 많이 쓰는 명령이고, fzf는 학습 곡선 없이 바로 들어맞는 개선이었음. ctrl-r로 실행되니 fzf 쓰는 걸 잊지도 않게 됨. 다만 나중에는 Fish shell로 옮겼고, 거기서는 같은 동작이 기본으로 제공됨
  • 설득됐음. 곧 fzf와 셸 통합을 추가할 예정이고, 오늘 하나 배웠음

  • 명령에 넣을 파일을 찾을 때는 ctrl-t 단축키도 쓸 수 있음. 특정 변경에 포함할 파일을 고를 때 git과 함께 자주 쓰고, grep 출력 결과를 걸러서 찾는 범위를 줄이는 데도 써봤음

  • 셸 기록 검색 개선 말고도 fzf를 다음 두 별칭과 함께 써왔음
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    주로 풀 리퀘스트를 병합한 뒤 삭제할 로컬 브랜치 목록을 고르는 데 씀. 더 나은 방법이 있을 수 있지만 아직 실패한 적은 없음
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    ~/.aws/config에 있는 값에 따라 AWS_PROFILE을 빠르게 바꿀 수 있게 해줌. 이제 Kubernetes 네임스페이스를 바꾸는 비슷한 별칭도 만들까 생각 중임

  • fzf.vim 플러그인을 쓰면 vim 안에서 fzf를 사용할 수 있음. 파일 열기뿐 아니라 버퍼, 명령 기록, 파일 내용 등을 퍼지 검색할 수 있음

  • fzf의 주된 용도는 선형적인 Git 커밋 기록을 훑고 검색해서 최근에 무엇이 바뀌었는지 파악하는 것임
    내 기본 Git 설정에서 git fzf는 이렇게 정의해둠

    [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})' #"  
    
  • 뭔가 놓치고 있는 것 같음. 뭘 할지 모르는 상태에서 왜 fzf를 설치하는지 궁금함

  • 최근 관련 글도 있음. 어떤 사용자가 jj용 파일 선택기로 fzf를 쓰고 있음
    https://lobste.rs/s/exlogg/jjj