fzf(fuzzy finder)是一個功能強大的命令列模糊搜尋工具,以 Go 語言編寫,速度極快。它不只是一個搜尋工具,更提供完整的 shell 整合,讓你用 Ctrl+R 搜尋歷史指令、Ctrl+T 搜尋檔案、Alt+C 快速切換目錄,大幅提升命令列操作效率。
安裝方式
macOS
1
2
3
4
|
brew install fzf
# 安裝 shell 整合(強烈建議)
$(brew --prefix)/opt/fzf/install
|
Linux / WSL
1
2
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
|
安裝過程中會詢問是否啟用 shell 整合(key bindings 和 fuzzy completion),建議全部選「yes」。
zplug(zsh 環境)
1
2
|
zplug "junegunn/fzf", as:command, rename-to:fzf, \
hook-build:"./install --bin"
|
Shell 整合快捷鍵
安裝 shell 整合後,在終端機中可以使用以下快捷鍵:
| 快捷鍵 |
功能 |
Ctrl+R |
模糊搜尋命令歷史記錄 |
Ctrl+T |
模糊搜尋目前目錄下的檔案 |
Alt+C |
模糊搜尋並切換到子目錄 |
基本使用方式
1
2
3
4
5
6
7
8
|
# 從 find 結果中互動式選取檔案
find * -type f | fzf
# 選取後執行指令
vim $(fzf)
# 從 ls 結果選取
ls | fzf
|
多選功能
使用 --multi(或 -m)參數啟用多選,按 Tab 選取多個項目:
1
2
3
4
5
|
# 多選後一次開啟多個檔案
vim $(find . -name "*.js" | fzf --multi)
# 多選後刪除
find . -name "*.tmp" | fzf --multi | xargs rm
|
Preview 預覽功能
fzf 的 --preview 選項可以在右側即時預覽選中的項目:
1
2
3
4
5
6
7
8
9
10
11
|
# 預覽檔案內容
fzf --preview 'cat {}'
# 使用 bat(語法高亮)預覽
fzf --preview 'bat --color=always {}'
# 預覽目錄結構
find . -type d | fzf --preview 'ls -la {}'
# 預覽 git 提交差異
git log --oneline | fzf --preview 'git show {1}'
|
常用整合範例
Git 整合
1
2
3
4
5
6
7
8
|
# 互動式選擇分支並切換
git checkout $(git branch | fzf)
# 模糊搜尋 git log 並查看 diff
git log --oneline | fzf --preview 'git show {1}' | awk '{print $1}' | xargs git show
# 互動式 add
git diff --name-only | fzf --multi | xargs git add
|
殺掉程序
1
2
|
# 互動式選擇並殺掉程序
kill -9 $(ps aux | fzf | awk '{print $2}')
|
SSH 快速連線
1
2
|
# 從 ~/.ssh/config 中選擇 host
ssh $(grep -i "^Host " ~/.ssh/config | awk '{print $2}' | fzf)
|
fzf 的 ~/.zshrc 整合設定
1
2
3
4
5
6
7
8
9
|
# 設定 fzf 的預設選項
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border"
# 使用 fd 或 rg 代替 find(更快、尊重 .gitignore)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
# 啟用 preview 的快捷鍵設定
export FZF_CTRL_T_OPTS="--preview 'bat --color=always {}'"
|
Vim 整合
安裝 fzf.vim 插件:
1
2
3
4
5
6
7
8
9
10
|
" 在 vim-plug 中加入
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
" 常用指令
:Files " 搜尋檔案
:GFiles " 搜尋 git 追蹤的檔案
:Rg " 全文搜尋(需安裝 ripgrep)
:Buffers " 搜尋開啟的 buffer
:History " 搜尋最近開啟的檔案
|
fzf 與 fzy 的比較
| 特性 |
fzf |
fzy |
| 語言 |
Go |
C |
| 多選 |
✅ --multi + Tab |
❌ |
| Preview |
✅ --preview |
❌ |
| Shell 整合 |
✅ 完整(Ctrl+R, Ctrl+T, Alt+C) |
需手動設定 |
| Vim 插件 |
✅ fzf.vim |
❌ |
| 安裝大小 |
稍大 |
極小 |
| 排序精準度 |
靈活 |
偏好短路徑 |
參考資料