特別感謝:
Warp 是一個基於 Rust 的現代化終端,內建 AI,因此您和您的團隊可以更快地建立出色的軟體。
請造訪 warp.dev 以了解更多資訊。
fzf 是一個通用的命令列模糊查找器。
它是一個互動式過濾程序,適用於任何類型的清單;檔案、命令歷史記錄、進程、主機名稱、書籤、git 提交等。它實現了「模糊」匹配演算法,因此您可以快速輸入省略字元的模式,但仍然可以獲得您想要的結果。
便攜式- 作為單一二進位檔案分發,以便於安裝
速度極快-高度優化的程式碼可立即處理數百萬個項目
極為通用-透過事件-動作綁定機製完全可自訂
包含電池— 包括與 bash、zsh、fish、Vim 和 Neovim 的集成
我要感謝這個計畫的所有贊助商,他們讓我能夠繼續改進 fzf。
如果您想贊助該項目,請訪問 https://github.com/sponsors/junegunn。
安裝
使用自製軟體
Linux 軟體套件
Windows 軟體包
使用git
二進位版本
設定 shell 集成
Vim/Neovim 插件
升級fzf
建設fzf
用法
--height
模式
--tmux
模式
使用取景器
顯示模式
搜尋語法
環境變數
選項
示範
範例
命令列的鍵綁定
bash 和 zsh 的模糊補全
檔案和目錄
進程 ID
主機名稱
環境變數/別名
設定
支援的命令
自訂模糊補全
Vim 插件
高級主題
1. 按 CTRL-R 更新進程列表
2. 按 CTRL-D 或 CTRL-F 在來源之間切換
3. 互動式 ripgrep 集成
表現
執行外部程式
轉變為不同的過程
重新載入候選列表
預覽視窗
預覽影像
尖端
尊重.gitignore
魚殼
fzf主題遊樂場
相關項目
執照
您可以使用 Homebrew(在 macOS 或 Linux 上)安裝 fzf。
釀造安裝fzf
重要的
若要設定 shell 整合(按鍵綁定和模糊完成),請參閱下面的說明。
fzf 也可以透過 MacPorts 取得: sudo port install fzf
套件管理器 | Linux發行版 | 命令 |
---|---|---|
應用程式 | 阿爾卑斯Linux | sudo apk add fzf |
易於 | Debian 9+/Ubuntu 19.10+ | sudo apt install fzf |
康達 | conda install -c conda-forge fzf | |
地下城與勇士 | 軟呢帽 | sudo dnf install fzf |
尼克 | 尼克斯作業系統等 | nix-env -iA nixpkgs.fzf |
吃豆人 | 架構Linux | sudo pacman -S fzf |
包裝 | 自由BSD | pkg install fzf |
包金 | 網路BSD | pkgin install fzf |
包添加 | 開放BSD | pkg_add fzf |
波蒂奇 | 根圖 | emerge --ask app-shells/fzf |
史派克 | spack install fzf | |
XBPS | 虛空Linux | sudo xbps-install -S fzf |
札普 | 開放SUSE | sudo zypper install fzf |
重要的
若要設定 shell 整合(按鍵綁定和模糊完成),請參閱下面的說明。
在 Windows 上,fzf 可透過 Chocolatey、Scoop、Winget 和 MSYS2 取得:
套件管理器 | 命令 |
---|---|
巧克力口味 | choco install fzf |
舀 | scoop install fzf |
溫蓋特 | winget install fzf |
MSYS2(吃豆人) | pacman -S $MINGW_PACKAGE_PREFIX-fzf |
或者,您可以“git clone”此儲存庫到任何目錄並執行安裝腳本。
git clone --深度 1 https://github.com/junegunn/fzf.git ~/.fzf~/.fzf/install
安裝腳本將向您的 shell 設定檔新增行以修改$PATH
並設定 shell 整合。
您可以從發布頁面下載官方 fzf 二進位。
https://github.com/junegunn/fzf/releases
將以下行新增至您的 shell 設定檔中。
巴什
# 設定 fzf 鍵綁定和模糊完成eval "$(fzf --bash)"
桀騁
# 設定 fzf 鍵綁定與模糊補全source <(fzf --zsh)
魚
# 設定 fzf 鍵綁定fzf --fish |來源
筆記
--bash
、 --zsh
和--fish
選項僅在 fzf 0.48.0 或更高版本中可用。如果您有舊版本的 fzf,或者想要更好的控制,您可以在 /shell 目錄中取得單獨的腳本檔案。文件的位置可能會有所不同,具體取決於您使用的套件管理器。請參閱包文檔以獲取更多資訊。 (例如apt show fzf
)
提示
您可以在取得腳本時透過將FZF_CTRL_T_COMMAND
或FZF_ALT_C_COMMAND
設為空字串來停用 CTRL-T 或 ALT-C 綁定。例如,要停用 ALT-C 綁定:
bash: FZF_ALT_C_COMMAND= eval "$(fzf --bash)"
zsh: FZF_ALT_C_COMMAND= source <(fzf --zsh)
魚: fzf --fish | FZF_ALT_C_COMMAND= source
取得腳本後設定變數將不會產生任何效果。
如果您使用 vim-plug,請將其新增至您的 Vim 設定檔:
外掛 'junegunn/fzf', { 'do': { -> fzf#install() } } 插件 'junegunn/fzf.vim'
junegunn/fzf
提供基本的函式庫函數
fzf#install()
確保您擁有最新的二進位文件
junegunn/fzf.vim
是一個單獨的項目,提供各種有用的命令
要了解有關 Vim 整合的更多信息,請參閱 README-VIM.md。
提示
如果您使用 Neovim 並且更喜歡基於 Lua 的插件,請查看 fzf-lua。
fzf 正在積極開發中,您可能希望偶爾升級它。請根據所使用的安裝方法按照以下說明進行操作。
git: cd ~/.fzf && git pull && ./install
沖泡: brew update; brew upgrade fzf
macports: sudo port upgrade fzf
巧克力口味: choco upgrade fzf
vim-plug: :PlugUpdate fzf
請參閱 BUILD.md。
fzf 將啟動互動式查找器,從 STDIN 讀取列表,並將所選項目寫入 STDOUT。
尋找 * -輸入 f | fzf > 已選擇
如果沒有STDIN管道,fzf將遍歷目前目錄下的檔案系統以取得檔案清單。
vim $(fzf)
筆記
您可以覆寫預設行為
透過將$FZF_DEFAULT_COMMAND
設定為產生所需清單的命令
或透過在$FZF_DEFAULT_OPTS
中設定--walker
、 --walker-root
和--walker-skip
選項
警告
更強大的解決方案是使用xargs
,但我們已經介紹了上面的內容,因為它更容易掌握
fzf--列印0 | xargs -0 -o vim
提示
fzf 還具有將自身變成不同流程的能力。
fzf --bind '輸入:成為(vim {})'
有關更多信息,請參閱轉變為不同的流程。
CTRL-K
/ CTRL-J
(或CTRL-P
/ CTRL-N
)上下移動遊標
Enter
鍵選擇項目, CTRL-C
/ CTRL-G
/ ESC
退出
在多選模式 ( -m
) 下, TAB
和Shift-TAB
標記多個項目
Emacs 風格的鍵綁定
滑鼠:滾動、點擊、雙擊;多選模式下按住 Shift 鍵點選和按住 Shift 鍵捲動
fzf 預設以全螢幕模式運行,但還有其他顯示模式。
--height
模式使用--height HEIGHT[%]
,fzf 將以給定高度從遊標下方開始。
fzf --高度 40%
reverse
佈局和--border
與此選項配合良好。
fzf --高度 40% --佈局反轉 --邊框
在高度前面加上~
,您可以設定最大高度。
# 將以盡可能少的行來顯示清單 3 | fzf --高度 ~100% 序列 3000 | fzf --高度 ~100%
高度值可以是負數。
# 螢幕高度 - 3fzf --height -3
--tmux
模式使用--tmux
選項,fzf 將在 tmux 彈出視窗中啟動。
# --tmux [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]fzf --tmux center # 中心,寬度和高度50%fzf --tmux 80% # 中心, 80% 寬度和高度fzf --tmux 100%,50% # 居中,100% 寬度和50% 高度fzf --tmux left,40% # 左,40% 寬度fzf --tmux left,40%,90% # 左,40% 寬度fzf --tmux left,40%,90% # 左,40 % 寬度, 90% 高度fzf --tmux top,40% # 頂部, 40% 高度fzf --tmux 底部,80%,40% # 底部, 80% 高度, 40% 高度
--當你不在 tmux 上時, --tmux
會被默默地忽略。
筆記
如果您堅持使用不支援彈出視窗的舊版 tmux,或者您想在常規 tmux 窗格中開啟 fzf,請查看 fzf-tmux 腳本。
提示
您可以將這些選項新增至$FZF_DEFAULT_OPTS
中,以便預設套用它們。例如,
# 如果在 tmux 上,則在 tmux 彈出視窗中打開,否則使用 --height modeexport FZF_DEFAULT_OPTS='--height 40% --tmux Bottom,40% --layout reverse --border top'
除非另有說明,fzf 以「擴展搜尋模式」啟動,您可以在其中輸入多個以空格分隔的搜尋字詞。例如^music .mp3$ sbtrkt !fire
代幣 | 比賽類型 | 描述 |
---|---|---|
sbtrkt | 模糊匹配 | 與sbtrkt 匹配的項目 |
'wild | 完全符合(引用) | 包含wild 的物品 |
'wild' | 精確邊界匹配(兩端都引用) | 在字邊界處包含wild 的項目 |
^music | 前綴精確匹配 | 以music 開頭的項目 |
.mp3$ | 後綴精確匹配 | 以.mp3 結尾的項目 |
!fire | 逆向精確匹配 | 不包括fire 的物品 |
!^music | 反向前綴精確匹配 | 不以music 開頭的項目 |
!.mp3$ | 反向後綴精確匹配 | 不以.mp3 結尾的項目 |
如果您不喜歡模糊匹配並且不希望“引用”每個單詞,請使用-e
或--exact
選項啟動 fzf。請注意,當設定--exact
時, '
-prefix 會「取消引用」該術語。
單一條形字元項充當 OR 運算符。例如,以下查詢會比對以core
開頭並以go
、 rb
或py
結尾的項目。
^core go$ | rb$ | py$
FZF_DEFAULT_COMMAND
輸入為 tty 時使用的預設指令
例如export FZF_DEFAULT_COMMAND='fd --type f'
FZF_DEFAULT_OPTS
預設選項
例如export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"
FZF_DEFAULT_OPTS_FILE
如果您希望管理文件中的預設選項,請將此變數設定為指向文件的位置
例如export FZF_DEFAULT_OPTS_FILE=~/.fzfrc
警告
由於需求略有不同, FZF_DEFAULT_COMMAND
不被 shell 整合使用。
CTRL-T
運行$FZF_CTRL_T_COMMAND
來取得檔案和目錄的列表
ALT-C
運行$FZF_ALT_C_COMMAND
來取得目錄列表
vim ~/**
以前綴 ( ~/
) 以第一個參數執行fzf_compgen_path()
cd foo**
以前綴 ( foo
) 作為第一個參數運行fzf_compgen_dir()
本文檔稍後將介紹可用選項。
有關選項的完整列表,請參閱手冊頁 ( man fzf
)。
如果您透過觀看影片來學習,請觀看 @samoshkin 的螢幕錄影來探索fzf
功能。
範例 Wiki 頁面
免責聲明:本頁面上的範例由社區維護,未經徹底測試
高級 fzf 範例
透過設定 shell 集成,您可以在 bash、zsh 和 Fish 中使用以下鍵綁定。
CTRL-T
- 將選定的檔案和目錄貼到命令列上
您可以透過將FZF_CTRL_T_COMMAND
設定為產生所需清單的自訂命令來覆寫該行為
或者您可以在FZF_CTRL_T_OPTS
中設定--walker*
選項
此列表是使用--walker file,dir,follow,hidden
選項產生的
設定FZF_CTRL_T_OPTS
將附加選項傳遞給 fzf
# 使用bat預覽檔案內容 (https://github.com/sharkdp/bat)export FZF_CTRL_T_OPTS=" --walker-skip .git,node_modules,target --preview 'bat -n --color=always {}' - -bind 'ctrl-/:change-preview-window(down|hidden|)'"
可以透過在取得腳本時將FZF_CTRL_T_COMMAND
設定為空字串來停用
CTRL-R
- 將所選命令從歷史記錄貼到命令列上
如果您想按時間順序查看命令,請再次按CTRL-R
以切換按相關性排序
按CTRL-/
或ALT-/
切換換行
設定FZF_CTRL_R_OPTS
將附加選項傳遞給 fzf
# CTRL-Y 使用 pbcopyexport 將指令複製到剪貼簿 FZF_CTRL_R_OPTS=" --bind 'ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort' --color header:italic --header '按CTRL-Y 將指令複製到剪貼簿'"
ALT-C
- cd 進入所選目錄
或者您可以在FZF_ALT_C_OPTS
中設定--walker-*
選項
該列表是使用--walker dir,follow,hidden
選項產生的
設定FZF_ALT_C_COMMAND
以覆蓋預設命令
設定FZF_ALT_C_OPTS
以將附加選項傳遞給 fzf
# 在預覽視窗中列印樹狀結構export FZF_ALT_C_OPTS=" --walker-skip .git,node_modules,target --preview 'tree -C {}'"
可以透過在取得腳本時將FZF_ALT_C_COMMAND
設為空字串來停用
這些綁定的顯示模式可以透過FZF_{CTRL_T,CTRL_R,ALT_C}_OPTS
單獨配置,也可以透過FZF_DEFAULT_OPTS
全域配置。 (例如FZF_CTRL_R_OPTS='--tmux bottom,60% --height 60% --border top'
)
更多提示可以在 wiki 頁面上找到。
如果遊標前面的單字以觸發序列結尾,則可以觸發檔案和目錄的模糊補全,預設為**
。
COMMAND [DIRECTORY/][FUZZY_PATTERN]**
# 目前目錄下的檔案# - 可以用TAB鍵選擇多項vim **# 父目錄下的檔案vim ../** # 父目錄下符合`fzf` 的檔案vim ../ fzf* * # 主目錄下的檔案vim ~/** # 目前目錄下的目錄(單選)cd ** # ~/github 下與`fzf` 相符的目錄cd ~ /github/fzf **<製表符>
Kill 指令提供了 PID 的模糊補全。
# 可以使用或 鍵選擇多個程序kill -9 **
對於 ssh 和 telnet 指令,提供了主機名稱的模糊補全。這些名稱是從 /etc/hosts 和 ~/.ssh/config 中提取的。
ssh **telnet **
取消設定 **匯出 ** unalias **
# 使用 ~~ 作為觸發序列而不是預設 **export FZF_COMPLETION_TRIGGER='~~'# fzf 指令的選項export FZF_COMPLETION_OPTS='--border --info=inline'# 使用 fd (https://github.com/ sharkdp /fd) 用於列出候選路徑。 { fd --hidden --follow --exclude ".git" 。 "$1"}# 使用fd產生目錄清單completion_fzf_compgen_dir() { fd --type d --hidden --follow --exclude ".git" 。 "$1"}# 透過 _fzf_comprun 函數進階自訂 fzf 選項# - 函數的第一個參數是指令的名稱。 # - 您應該確保將其餘參數傳遞給 fzf._fzf_comprun() { local command =1美元 轉移 case "$command" incd) fzf --preview 'tree -C {} |頭-200'“$@”;; 導出|取消設定) fzf --preview "eval 'echo $'{}" "$@" ;; ssh) fzf --preview 'dig {}' "$@" ;;*) fzf --preview 'bat -n --color=always {}' "$@" ;; 埃薩克}
在 bash 上,僅對一組預先定義的指令啟用模糊補全( complete | grep _fzf
檢視清單)。但是您也可以使用_fzf_setup_completion
輔助函數為其他指令啟用它。
# 用法: _fzf_setup_completion 路徑|dir|var|alias|主機指令..._fzf_setup_completion 路徑 ag git kubectl _fzf_setup_completion 目錄樹
(自訂完成 API 處於實驗階段,可能會發生變化)
對於名為"COMMAND"的指令,使用_fzf_complete
幫助器定義_fzf_complete_COMMAND
函數。
# “doge”指令的自訂模糊補全# 例如 doge **_fzf_complete_doge() { _fzf_complete --multi --reverse --prompt="doge> " -- "$@" <<( echo very echo wow echo such echo doge )}
--
之前的參數是 fzf 的選項。
在--
之後,只需傳遞原始完成參數不變( "$@"
)。
然後,編寫一組產生補全候選的命令,並使用進程替換 ( < <(...)
) 將其輸出提供給函數。
zsh 將使用命名約定自動取得函數,但在 bash 中,您必須使用complete
命令手動將函數與命令關聯起來。
[ -n "$BASH" ] && 完整 -F _fzf_complete_doge -o 預設 -o bashdefault doge
如果需要對 fzf 的輸出進行後處理,請如下定義_fzf_complete_COMMAND_post
。
_fzf_complete_foo() { _fzf_complete --multi --reverse --header-lines=3 -- "$@" < <( ls -al )}_fzf_complete_foo_post() { awk '{print $NF}'} [ -n "$BASH" ] && 完成 -F _fzf_complete_foo -o 預設 -o bashdefault foo
請參閱 README-VIM.md。
fzf很快。在大多數用例中,效能不應該成為問題。但是,您可能想了解可能影響效能的選項。
--ansi
告訴 fzf 提取並解析輸入中的 ANSI 顏色代碼,這會使初始掃描速度變慢。因此不建議您將其新增至$FZF_DEFAULT_OPTS
。
--nth
使 fzf 變慢,因為它必須標記每一行。
--with-nth
使 fzf 變慢,因為 fzf 必須標記並重新組裝每一行。
您可以設定用於啟動外部程序的鍵綁定,而無需離開 fzf( execute
、 execute-silent
)。
# 按 F1 以 less 開啟檔案而不離開 fzf # 按 CTRL-Y 將行複製到剪貼簿併中止 fzf (需要 pbcopy)fzf --bind 'f1:execute(less -f {}),ctrl-y:執行靜默(echo {} | pbcopy)+中止'
有關詳細信息,請參閱手冊頁的KEY BINDINGS部分。
become(...)
類似於上面描述的execute(...)
/ execute-silent(...)
,但是它不是執行命令並在完成後返回fzf,而是將fzf變成一個新的進程命令。
fzf --bind '輸入:成為(vim {})'
與看似等效的命令替換vim "$(fzf)"
相比,這種方法有幾個優點:
當您使用CTRL-C終止 fzf 時,Vim 不會開啟空文件
當您在空結果上按ENTER時,Vim 不會開啟空白文件
即使有空格也可以處理多個選擇
fzf --multi --bind '輸入:成為(vim {+})'
公平地說,運行fzf --print0 | xargs -0 -o vim
而不是vim "$(fzf)"
解決了提到的所有問題。儘管如此, become(...)
在不同的場景中仍然提供額外的好處。
您可以設定多個綁定以不同的方式處理結果,而無需任何包裝腳本
fzf --bind '輸入:成為(vim {}),ctrl-e:成為(emacs {})'
以前,您必須使用--expect=ctrl-e
並檢查 fzf 輸出的第一行
您可以使用 fzf 的欄位索引表達式輕鬆建立後續命令
# 在 Vim 中開啟檔案並轉到行 git grep --line-number 。 |fzf --分隔符號 : --nth 3.. --bind 'enter:become(vim {1} +{2})'
透過將reload
操作綁定到按鍵或事件,您可以使 fzf 動態地重新載入候選清單。有關更多詳細信息,請參閱#1750。
ps-ef | fzf --bind 'ctrl-r:reload(ps -ef)' --header '按 CTRL-R 重新載入' --header-lines=1 --高度=50% --佈局=反向
FZF_DEFAULT_COMMAND='查找。 -類型f' fzf --bind 'ctrl-d:reload(find . -type d),ctrl-f:reload(eval "$FZF_DEFAULT_COMMAND")' --高度=50% --佈局=反向
以下範例使用 fzf 作為 ripgrep 的選擇器介面。我們將reload
操作綁定到change
事件,因此每次您鍵入 fzf 時,ripgrep 程序都會使用佔位符表達式{q}
表示的更新後的查詢字串重新啟動。另請注意,我們使用了--disabled
選項,以便 fzf 不執行任何二次過濾。
: | rg_prefix='rg --column --line-number --no-heading --color=always --smart-case' fzf --bind '開始:重新載入:$rg_prefix ""' --bind '更改:重新載入:$rg_prefix {q} ||真的' --bind '輸入:成為(vim {1} +{2})' --ansi --停用 --高度=50% --佈局=反向
如果 ripgrep 沒有找到任何匹配項,它將以非零退出狀態退出,並且 fzf 會警告您。為了抑制警告訊息,我們加入了|| true
命令,因此它總是以 0 退出。
有關更複雜的範例,請參閱「使用 fzf 作為互動式 Ripgrep 啟動器」。
當設定--preview
選項時,fzf 會自動啟動一個以目前行作為參數的外部進程,並在分割視窗中顯示結果。您的$SHELL
用於透過$SHELL -c COMMAND
執行命令。可以使用滑鼠或自訂鍵綁定滾動視窗。
# {} 替換為焦點行的單引號字串 fzf --preview 'cat {}'
預覽視窗支援 ANSI 顏色,因此您可以使用任何語法突出顯示文件內容的程序,例如 Bat 或 Highlight:
fzf --preview 'bat --color=always {}' --preview-window '~3'
您可以使用--preview-window
選項自訂預覽視窗的大小、位置和邊框,並使用--color
選項自訂預覽視窗的前景色和背景色。例如,
fzf --高度 40% --佈局反向 --info 內聯 --border --preview '文件 {}' --preview-window up,1,border-horizontal --bind 'ctrl-/:更改預覽視窗(50%|隱藏|)' --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,預覽-bg:#223344,邊框:#778899'
有關選項的完整列表,請參閱手冊頁 ( man fzf
)。
可以在這裡找到更高級的範例。
警告
由於 fzf 是通用文字過濾器而不是檔案查找器,因此將--preview
選項新增至$FZF_DEFAULT_OPTS
並不是一個好主意。
# **********************# ** 不要這樣做! **********************export FZF_DEFAULT_OPTS='--preview“bat --style=numbers --color=always --line-range :500 {} "'# bat 不適用於文件清單以外的任何輸入sps -ef |佛茲夫 序列 100 | fzf歷史|佛茲夫
fzf 可以使用以下協定之一在預覽視窗中顯示影像:
Kitty圖形協議
iTerm2 內嵌影像協議
西塞爾
有關更多信息,請參閱 bin/fzf-preview.sh 腳本。
fzf --preview 'fzf-preview.sh {}'
.gitignore
您可以使用 fd、ripgrep 或 silver 搜尋器來遍歷檔案系統,同時遵守.gitignore
。
# 將 fd 的輸出輸入 fzffd --type f --strip-cwd-prefix | fzf# 將 fd 設為 fzfexport 的預設來源 FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix'# 現在 fzf(無管道)將使用 fd 指令產生清單 fzf# 將指令套用至CTRL-T 以及export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
如果您希望該命令遵循符號連結並且不希望它排除隱藏文件,請使用以下命令:
導出 FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix --hidden --follow --exclude .git'
與 bash 和 zsh 不同,fish 的CTRL-T
鍵綁定將使用命令列上的最後一個標記作為遞歸搜尋的根目錄。例如,在以下命令列末尾按CTRL-T
ls /var/
將列出/var/
下的所有檔案和目錄。
使用自訂FZF_CTRL_T_COMMAND
時,請使用未展開的$dir
變數來利用此功能。 $dir
預設為.
當最後一個標記不是有效目錄。例子:
set -g FZF_CTRL_T_COMMAND "指令 find -L $dir -type f 2> /dev/null | sed '1d; s#^./##'"
fzf Theme Playground 由 Vitor Mello 創建,是一個可以互動式建立 fzf 主題的網頁。
https://github.com/junegunn/fzf/wiki/Related-projects
麻省理工學院許可證 (MIT)
版權所有 (c) 2013-2024 Junegunn Choi