Contents

超級終端機 fzf

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
安裝大小 稍大 極小
排序精準度 靈活 偏好短路徑

參考資料