---
# System prepended metadata

title: fzf：模糊搜尋
tags: [Tool, Linux, macOS]

---

---
title: fzf：模糊搜尋
tags: [Tool, CLI, Linux, MacOS, Search]
---
# fzf：模糊搜尋

[文章更新時間: 2026-01-23 13:34]

![fzf](https://hackmd.io/_uploads/BkTy0n4LWx.jpg)

## 簡介

**fzf** 是一個通用的交互式命令行過濾工具。它的本質是 **"Filter"**：它從標準輸入（stdin）讀取清單，讓你在終端機介面進行模糊搜尋，最後將選中的結果輸出到標準輸出（stdout）。它不依賴複雜的資料庫，卻能以極高的效率處理海量字串，是現代開發者提升 Terminal 工作流的核心元件。

---

## 優點

* **零依賴且可攜性高**：以 Go 語言開發，編譯後僅一個執行檔，部署極其簡單。
* **效能卓越**：即使處理上百萬行資料，搜尋反應依然保持在毫秒級。
* **佈局靈活性**：支援全螢幕、下方彈窗（Horizontal/Vertical Split），甚至整合在 Vim 視窗內。
* **豐富的搜尋語法**：支援精確匹配、反向匹配、字首/字尾匹配。
* **生態系強大**：擁有完善的 Shell 整合（Bash, Zsh, Fish）以及 Vim/Neovim 插件支援。

---

## 安裝步驟

官方強烈建議透過 Git 安裝，因為這能確保你獲得最新的 Shell 腳本整合（包含快捷鍵與自動補全）：

### 通用 Git 安裝法 (Linux/macOS)

```bash
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

```

*在安裝過程中，請對所有提問回答 `y`（包含關鍵字補全與快捷鍵綁定）。*

### 套件管理員安裝

* **macOS (Homebrew)**: `brew install fzf`
* **Linux (Ubuntu)**: `sudo apt install fzf`
* **Linux (Arch)**: `sudo pacman -S fzf`

---

## 操作步驟：核心三劍客與模糊補全

安裝官方腳本後，你將獲得三大核心快捷鍵：

1. **`CTRL-T` (Files)**：搜尋當前目錄下的檔案路徑，選中後直接填入指令列。
2. **`CTRL-R` (History)**：革命性的歷史紀錄搜尋，輸入關鍵字即可找回曾下過的複雜指令。
3. **`ALT-C` (CD)**：搜尋子目錄，選中後直接切換（cd）進去。

### 獨門絕技：模糊自動補全 (Fuzzy Completion)

這是官方文件中最酷的功能。在支援的指令後輸入 `**` 再按 `TAB`：

* `cd **<TAB>`：模糊搜尋目錄並進入。
* `vim **<TAB>`：模糊搜尋檔案並開啟。
* `ssh **<TAB>`：從 `/etc/hosts` 或已知主機中搜尋並連線。
* `export **<TAB>`：搜尋環境變數。

---

## 使用情境介紹

### 情境 A：優雅地處理 Git Log

傳統的 `git log --oneline` 很難閱讀。結合 fzf，你可以直接在 commit 歷史中穿梭：

```bash
git log --oneline --color=always | fzf --ansi --no-sort --reverse --multi --preview 'git show --color=always {1}'

```

### 情境 B：快速殺掉亂跑的 PID

不再需要手動查找 PID，直接選擇要關閉的程序：

```bash
ps -ef | fzf --header='[Kill Process]' --reverse | awk '{print $2}' | xargs kill -9

```

---

## 進階用法：搜尋語法與介面客製化

### 1. 搜尋語法表

fzf 不只是模糊搜尋，它支援精準的操作：
| 標記 | 匹配類型 | 範例 |
| :--- | :--- | :--- |
| `sbtr` | 模糊匹配 | 搜尋包含 s, b, t, r 的項目 |
| `'wild` | **精確匹配** | 搜尋包含完整 "wild" 關鍵字的項目 |
| `^music` | **字首匹配** | 搜尋以 "music" 開頭的項目 |
| `.mp3$` | **字尾匹配** | 搜尋以 ".mp3" 結尾的項目 |
| `!fire` | **反向匹配** | 排除包含 "fire" 的項目 |

### 2. 佈局設定 (Environment Variables)

你可以透過設定環境變數來改變 fzf 的預設長相（放入你的 `.zshrc` 或 `.bashrc`）：

```bash
export FZF_DEFAULT_OPTS="
--layout=reverse
--info=inline
--height=40%
--multi
--preview '[[ $(file --mime -b {}) =~ binary ]] && echo {} is a binary file || (bat --style=numbers --color=always {} || cat {}) 2> /dev/null | head -500'
--color='fg:#bbbbbb,fg+:#ffffff,bg:#222222,bg+:#333333'"
```

*這段設定會讓 fzf 以「上方顯示、40% 高度、支援多選、且具備檔案預覽」的方式呈現。*

---

fzf 是一個極具生命力的工具，它能根據你給予的輸入，演化出無限可能。

**既然我們已經整理好了 fzf，下一步你想看看如何將它深度整合進 Vim，打造一個不需要滑鼠的極速開發環境嗎？**