Bash

Arch Linux 上的 fzf 入門

  • October 12, 2021

我剛剛在 Arch Linux 4.13.11 上使用pacman -S fzf.

在 Bash 中,我可以呼叫它來選擇目前目錄及其子目錄中的fzf文件(使用Ctrl+nCtrl+ )。p

這很好,但我想要某種形式的 Bash 集成。

我從這裡去哪裡?

預設 bash 鍵綁定

使用whereis fzf,我在以下位置找到了用於 Bash 集成的 fzf 文件usr/share/fzf

completion.bash
key-bindings.bash

sourceing 兩個文件之後,這將為 Bash 啟用幾個鍵綁定:例如,我可以點擊Ctrl+t來搜尋目前目錄中的文件,Ctrl+r來搜尋我的命令歷史記錄。

對於查找和更改目錄,有Alt+ c

為了使這些鍵綁定持久化,我將它們添加到我的.bashrc

source /usr/share/fzf/completion.bash && source /usr/share/fzf/key-bindings.bash

定制

我發現有用的自定義是在使用 fzf 時顯示文件預覽(我也把它放在我.bashrc的里面):

# When selecting files with fzf, we show file content with syntax highlighting,
# or without highlighting if it's not a source file. If the file is a directory,
# we use tree to show the directory's contents.
# We only load the first 200 lines of the file which enables fast previews
# of large text files.
# Requires highlight and tree: pacman -S highlight tree
export FZF_DEFAULT_OPTS="--preview '(highlight -O ansi -l {} 2> /dev/null ||
cat {} || tree -C {}) 2> /dev/null | head -200'"

路徑完成

開箱即用,fzf 支持幾個硬編碼命令的模糊路徑完成,如cd,lsvim.

例如,vim ** Tab在 Bash 上輸入會在目前目錄中啟動模糊搜尋,並使用 Vim 1打開所選文件。

這非常有用,但我想以相同的方式打開例如 PDF。您可以通過將以下行添加到.bashrc

complete -o bashdefault -o default -F _fzf_path_completion zathura

zathura是我的 PDF 查看器;您可以用您選擇的文件查看器替換它。

請注意,模糊路徑完成適用於所有路徑,而不僅僅是目前目錄:

vim ~/**

然後點擊Tab將模糊搜尋您的主目錄下的文件,然後在 Vim 中打開它。

Vim 集成

.vimrc以下是我在 Vim 會話中使用 fzf的一些鍵綁定:

" Search and switch buffers
nmap <leader>b :Buffers<cr>
" Find files by name under the current directory
nmap <leader>f :Files<cr>
" Find files by name under the home directory
nmap <leader>h :Files ~/<cr>
" Search content in the current file
nmap <leader>l :BLines<cr>
" Search content in the current file and in files under the current directory
nmap <leader>g :Ag<cr>

所有這些的先決條件是fzf Vim 外掛我用Plug安裝它,把它放在我的.vimrc

Plug 'junegunn/fzf.vim'

然後:PlugInstall從 Vim 呼叫。

這是你可以從 Vim 呼叫的 fzf 命令列表。

搜尋項目文件

特別是在開發軟體時,我喜歡在給定項目的文件之間切換。假設項目是使用 Git 進行版本控制的,這裡有一個綁定,它將模糊搜尋項目內的文件並打開選定的文件:

nmap <leader>R :Files `=GetGitRoot()`<cr>

function! GetGitRoot()
 " Get the dir of the current file
 let currentDir = expand("%:p:h")
 " We stop when we find the .git/ dir or hit root
 while !isdirectory(currentDir . "/.git/") && currentDir !=# "/"
   " Make the parent the current dir
   let currentDir = fnamemodify(currentDir, ':h')
 endwhile
 return currentDir
endfunction

走得更遠

有關 fzf、Vim 和 Tmux 的強大組合,請查看Keegan Lowenstein 的部落格文章(我--preview從那裡獲得了配置)。

這裡有一些關於如何配置 fzf 的 shell 集成的想法。

您可以在fzf 的自述文件及其wiki中找到更多 fzf 配置範例。

1 如果你發現自己在模糊搜尋文件,然後在 Vim 中打開它們很多,你可以使用這個.bashrc.

引用自:https://unix.stackexchange.com/questions/403916