--- 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,打造一個不需要滑鼠的極速開發環境嗎?**