fzf를 설치했습니다. 이제 뭘 해야 할까요? (2023)
(andrew-quinn.me)- fzf는 설치 직후 Ctrl+R 명령 기록 검색을 퍼지 검색으로 개선함
- Alt+C로 정확한 경로 없이 오래된 작업 디렉터리로 빠르게 이동 가능함
- fzf 명령은 명령 치환과 결합해 선택한 파일을 vi, emacs, code로 바로 열 수 있음
- find 결과를 fzf에 넘기면 nginx.conf처럼 위치를 모르는 설정 파일을 찾기 쉬워짐
- rg. | fzf는 파일명 대신 파일 내용 줄을 단서로 원하는 파일을 열게 해줌
fzf를 설치한 뒤 바로 얻을 수 있는 가치
- 소프트웨어 엔지니어는 자기 업무를 개선하는 도구를 쉽게 만들 수 있지만, 여러 도구를 옮겨 다니며 깊게 익히지 않으면 시간이 지날수록 비용이 커짐
- 좋은 80/20 휴리스틱은
cat,ls,cd,grep,cut같은 오래된 Unix 도구를 먼저 익히는 것이며, 현대적인 시스템 관리 역할에서는sed와awk도 포함됨 fzf는 투자 대비 효과가 즉각적이고 가치가 독특해 이 휴리스틱의 예외로 볼 수 있음- 표준 Ubuntu 환경에서
fzf설치 스크립트로 설치한 뒤 바로 쓸 수 있는 기능들이 핵심임
기본 단축키가 주는 즉시 효과
-
Ctrl+R: 명령어 기록을 퍼지 검색으로 바꿈- 대부분의 Linux와 Windows 터미널에서
Ctrl+R은 명령어 역방향 검색을 제공함 - 기본
Ctrl+R은 원하는 명령을 찾으려면 정확한 일치가 필요하고, 한 번에 하나의 미리보기만 보여줘 한 글자만 빗나가도 찾기 어려워짐 fzf를 설치하면 여러 키보드 단축키가 더 나은 동작으로 덮어써지며,Ctrl+R도 기존 방식보다 크게 개선됨apt같은 패키지 관리자로 설치하면 이 단축키 통합이 제공되지 않을 수 있어,fzf설치 스크립트를 쓰는 이유가 됨
- 대부분의 Linux와 Windows 터미널에서
-
Alt+C: 기억이 흐릿한 디렉터리로 빠르게 이동fzf는Alt+C를 강화된 퍼지cd단축키로 바꿔줌- 디렉터리의 정확한 경로를 기억하지 못하고 대략적인 이름만 기억할 때 빠르게 이동할 수 있음
- 빈 터미널에서 오래 방문하지 않은 저장소나 작업 디렉터리를 찾을 때 유용함
fzf 명령 자체와 셸 조합
-
기본
fzffzf명령을 그대로 실행하면 현재 디렉터리를 기준으로 상대 파일 경로를 퍼지 검색함- 단독으로는 파일 위치를 고르는 정도라 활용도가 크지 않음
-
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 . | fzfrg .는 파일들의 각 줄을 검색 결과로 내보내고, 이를fzf로 넘기면 모든 파일의 모든 줄을 퍼지 검색할 수 있음- 파일 이름이 아니라 파일 안의 줄 내용을 단서로 찾는 방식이 됨
-
rg . | fzf | cut -d ":" -f 1rg . | 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로 옮겼고, 거기서는 같은 동작이 기본으로 제공됨
- 실제로는 강화된 기본값에 가까움. ctrl-r을 대체하게 두는 게 맞고, 핵심 매력의 절반은 손에 익은 동작을 유지하면서 기존 흐름과 거의 같은데 더 풍부한 경험을 얻는 데 있음
-
설득됐음. 곧 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