github 搜索_Fzf:Golang开发的Github高星系统模糊搜索补全工具
工欲善其事,必先利其器,常使用Linux命令終端的人都知道,bash默認情況下提供了很多便利的功能,比如TAB命令補全等,CTRL+R命令搜索等,但是這些功能往往有這樣或者那樣的問題致使不夠盡興。今天,蟲蟲給大家介紹一款強大通用系統模糊搜索補全工具Fzf,可以給這方面的功能錦上添花,趨于完美。
概述
Fzf是一個開源的交互式shell命令行模糊查詢工具,可以用于對文件,歷史記錄(history),進程,主機名,書簽,git commit等等列表和應用。
Fzf是用Golang語言開發的shell系統工具,源代碼托管再Github上(github.com/junegunn/fzf.git),截止目前該項目已經累積了25500多星,Fork上千。
借助于Golang靜態編譯的特點,Fzf具有便攜式,無依賴性;高性能,速度飛快的優點,同時還具有:
最全面的功能集;
布局靈活;
額外強大的插件支持:
比如Vim/Neovim插件,可支持鍵綁定和模糊自動補全。
安裝
Fzf支持通過Homebrew、操作系統包管理器以及源碼方式安裝。其文件項目有四部分組成,包括以下組件:
fzf可執行文件;
fzf-tmux腳本,用于在tmux窗格中啟動fzf;
Shell擴展:支持按鍵綁定(CTRL-T,CTRL-R和ALT-C),支持bash,zsh,fish。
模糊自動補全,支持bash,zsh。
Vim/Neovim插件。
其中,fzf可執行文件是必須的,其他組件依賴于它。如果不需要其他組件,可以單獨下載fzf可執行文件運行。
發行版包管理器安裝
Fzf最簡單的安裝方法就是通過OS發行版本的包管理器一鍵安裝。Fzf支持了最廣泛的發行版本安裝:
Arch Linux:
sudo pacman -S fzf
Debian系:
fzf支持Debian Buster及更新的版本,可以使用apt-get包管理器安裝。sudo apt-get install fzf
Fedora:
fzf支持Fedora 26及更新的版本,可以使用dnf安裝:
sudo dnf install fzf
默認情況下,啟用vim或neovim的Shell補全和插件。Shell鍵綁定已安裝,但默認情況下未啟用。有關更多信息,請參見Fedora的軟件包文檔(/usr/share/doc/fzf/README.Fedora)。
FreeBSD:
pkg install fzf
NixOS:
以使用Nix軟件包管理器來安裝fzf。
nix-env -iA nixpkgs.fzf
openSUSE:
對于openSUSE 支持Tumbleweed版本,可通過zypper安裝:
sudo zypper install fzf
Windows:
Windows的預編譯二進制文件可以項目發布頁下載。fzf也支持以Chocolatey或Scoop軟件包管理器安裝:
choco install fzf
scoop install fzf
但是,該項目的其他組件可能無法在Windows上運行。已知問題和限制可以在Wiki頁面上找到。可能要考慮在Windows子系統(適用于Linux)上安裝fzf,以確保一切運行正常。
Homebrew安裝
對于Mac系統可以Homebrew fzf。
brew install fzf
如果要安裝用鍵綁定和模糊補全腳本使用:
(brew --prefix)/opt/fzf/install
也可以通過MacPorts:
sudo port install fzf
Git安裝
如果你的用的發行版恰好不支持,或者你需要自定義源碼安裝最新版本,可以通過git clone 克隆項目,然后執行安裝程序即可。
git clone --depth 1 github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Vim插件
安裝好Fzf后,在Vim配置文件中將目錄添加到&runtimepath,就可以在Vim啟它,如下所示:
對Homebrew安裝的
set rtp+=/usr/local/opt/fzf
對通過git安裝的
set rtp+=~/.fzf
如果使用要vim-plug,則配置如下:
對Homebrew安裝的
Plug '/usr/local/opt/fzf'
對通過git安裝的
Plug '~/.fzf'
也可以使用vim-plug來完成安裝工作,而不是在系統上單獨安裝fzf(使用Homebrew或git clone),然后通過配置在Vim中啟用(添加到&runtimepath )。
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
升級fzf
Fzf在持續迭代開發,為了獲取最新功能,則需要時時升級版本。Fzf的升級方法如下:
git安裝:
cd ~/.fzf && git pull && ./install
brew:
brew update; brew reinstall fzf
chocolatey: choco upgrade fzf
vim-plug: :PlugUpdate fzf
Fzf源碼編譯
Fzf編譯需要golang 1.11版本以上,還依賴下面的第三方庫:
使用的第三方庫
mattn/go-runewidth
mattn/ o-shellwords
mattn/go-isatty
tcell
構建fzf二進制文件并將其復制到bin目錄,
make && make install
在目標中構建32位和64位可執行文件和tarball
make release
為目標中所有受支持的平臺制作發布檔案
make release-all
使用go get構建
Fzf也支持,直接通過go get命令,而無需手動克隆存儲庫。具體命令如下:
go get -u github.com/junegunn/fzf
Fzf用法大全
Fzf安裝后,將啟動交互式查找程序,從STDIN中讀取列表,然后將所選項目寫入STDOUT。
find * -type f | fzf > selected
如果沒有STDIN管道,則fzf將使用find命令來獲取文件列表(不包括隱藏文件)。(可以使用FZF_DEFAULT_COMMAND覆蓋默認命令)
vim $(fzf)
使用finder
CTRL-J/CTRL-K(或CTRL-N/CTRL-P)可上下移動光標
輸入鍵選擇項目,按CTRL-C/ TRL-G/ESC退出
在多選模式(-m)中,使用TAB和Shift-TAB標記多個項目
Emacs樣式鍵綁定
鼠標:滾動,單擊,雙擊;在多選模式下按住Shift點擊并Shift滾動。
布局
默認情況下,Fzf開題全屏模式,我們可以使用--height選項使其在光標下方開始。
vim $(fzf --height 40%)
如果喜歡"自上而下"的布局而不是默認的"自下而上"的布局,請使用--reverse和--layout選項。
vim $(fzf --height 40%)
可以將這些選項添加到$ FZF_DEFAULT_OPTS,以便默認情況下應用它們。例如,
export FZF_DEFAULT_OPTS ='--height 40% --layout = reverse --border'搜索語法
除非有特殊說明,Fzf都會以擴展搜索模式啟動,可以在其中鍵入多個以空格分隔的搜索詞。比如:^music .mp3$ chongchong !fire
相關解釋如下:
chongchong模糊匹配,匹配chognchong字條;
^music前綴精準匹配,匹配以music開頭的字條;
.mp3$ 后綴精準匹配,匹配以.mp3結尾的字條;
'whild 精準匹配,匹配包含wild的字條;
!fire 反向精準匹配,匹配其中不包含fire的字條;!也支持對前后綴匹配的反向匹配。
上例子表示查找以music開頭,以.mp3結尾,不包括fire,含有chongchong的字條。
如果不喜歡模糊匹配并且不想"引用"每個單詞,可以用-e或--exact選項啟動fzf。注意:設置為--exact時,"-prefix"選項會實效。
單個豎線字符可以充當OR運算符。比如,下面的查詢匹配以core開頭,以go,rb或py結尾的條目。
^core go$ | rb$ | py$
環境變量
FZF_DEFAULT_COMMAND
輸入為tty時使用的默認命令
例如導出FZF_DEFAULT_COMMAND ='fd --type f'
FZF_DEFAULT_OPTS
默認選項
例如export FZF_DEFAULT_OPTS ="-layout = reverse --inline-info"
fzf-tmux腳本
fzf-tmux是一個bash腳本,用來在tmux窗格中打開fzf。
在水平分割中窗體中(15行))顯示git分支
git branch | fzf-tmux -d 15
在左側垂直分割的窗體中(屏幕寬度的20%)顯示字典的內容:
cat /usr/share/dict/words | fzf-tmux -l 20% --multi --reverse
如果不是tmux模式,該插件也可以正常工作,只是-[udlr]選項會實效。通常模式下需要使用--height HEIGHT[%]選項,啟動非全屏模式的fzf。
fzf --height 40%
命令行的鍵綁定
安裝腳本將會在bash,zsh和fish添加以下按鍵綁定。
CTRL-T: 將選定的文件或者目錄粘貼到命令行上
可通過設置FZF_CTRL_T_COMMAND覆蓋默認命令;
可通過設置FZF_CTRL_T_OPTS設置其他選項;
CTRL-R : 從歷史記錄中將所選命令粘貼到命令行上
如果想按時間順序查看命令,請再次按CTRL-R,按相關性切換排序
可通過設置FZF_CTRL_R_OPTS設置其他選項;
ALT-C cd進入所選目錄
可通過設置FZF_ALT_C_COMMAND以覆蓋默認命令;
可通過設置FZF_ALT_C_OPTS設置其他選項;
在tmux會話下,可以通過將FZF_TMUX設置為1來在拆分窗格中啟動fzf,然后使用FZF_TMUX_HEIGHT更改窗格的高度(例如20%,50%等)。
如果在bash上使用vi模式,則需要在.bashrc中的source ~/.fzf.bash之前添加set -o vi,以使其正確設置vi模式的鍵綁定。
可以在Wiki頁面上找到更多提示。
bash和zsh的模糊補全
文件和目錄
如果光標前的單詞以觸發序列(默認為**)結尾,則可以觸發文件和目錄的模糊補全。
COMMAND [DIRECTORY/] [FUZZY_PATTERN] **
當前目錄下的文件,可以使用TAB鍵選擇多個項目
cat **
對父目錄下的文件名補全
vim ../**
父目錄下匹配`fzf`的文件
vim ../fzf**
用戶主目錄下的文件
cat ~/**
當前目錄下的目錄(單選)
cd **
~/github下與`fzf`匹配的目錄
cd ~/github/fzf**
進程ID
PID的模糊補全提供給kill命令。在這種情況下,沒有觸發序列,只需在kill命令后按tab鍵即可。
可以使用或鍵選擇多個進程
kill -9
主機名
對ssh和telnet命令,支持主機名的模糊補全。補全名稱是從/etc/hosts和~/.ssh/config中獲取的。
ssh **
telnet **
環境變量/別名
unset **
export **
unalias **
默認配置項
觸發關鍵字
比如使用~~作為觸發關鍵字,不用默認的**,可通過設置:
export FZF_COMPLETION_TRIGGER='~~'
fzf命令的選項
export FZF_COMPLETION_OPTS='+c -x'
默認搜索工具
使用fd(github.com/sharkdp/fd)代替默認find命令列出路徑
_fzf_compgen_path() {
fd --hidden --follow --exclude ".git" . "$1"
}
其中函數($1)的第一個參數開始便利的基礎目錄。
使用fd生成目錄補全的列表:
_fzf_compgen_dir() {
fd --type d --hidden --follow --exclude ".git" . "$1"
}
增加命令支持
在bash上,僅對預定義的命令集啟用了模糊補全,其詳細里列表通過"complete | grep _fzf"查看。Fzf也支持對其進行擴展,方法是:
_fzf_setup_completion path|dir COMMANDS...
比如:
_fzf_setup_completion path ag git kubectl
_fzf_setup_completion dir tree
Vim插件
Fzf的Vim插件提供了兩個核心功能fzf#run和fzf#wrap,其中:fzf命令基本文件選擇器命令。
fzf#run([spec dict]):使用給定的規范在Vim中啟動fzf,比如:
:call fzf#run({'source': 'ls'})
fzf#wrap([spec dict]) -> (dict) :采用fzf#run的規范,并返回其擴展版本以及用于處理全局首選項的其他選項(g:fzf_xxx)。
:echo fzf#wrap({'source': 'ls'})
通常在將規范傳遞給fzf#run之前將其包裝在fzf#wrap
:call fzf#run(fzf#wrap({'source': 'ls'}))
:FZF [fzf_options string] [path string]:基本的模糊文件選擇器,對那些不想編寫VimScript來實現自定義命令的人的參考實現
用法
:FZF[!]
"在當前目錄下查找文件
:FZF
在主目錄下查找文件
:FZF ~
使用fzf命令行選項
:FZF --reverse --info=inline /tmp
與ctrlp.vim相似,使用Enter鍵,CTRL-T,CTRL-X或CTRL-V在當前窗口,新選項卡,水平分割或垂直分割中分別打開選定的文件。
注意,環境變量FZF_DEFAULT_COMMAND和FZF_DEFAULT_OPTS也起作用。
配置項
g:fzf_action:自定義的額外按鍵綁定,用于以不同方式打開所選文件
g:fzf_layout: 確定fzf窗口的大小和位置
g:fzf_colors: 自定義fzf顏色以匹配當前的配色方案
g:fzf_history_dir: 啟用歷史記錄功能
fzf#run
fzf#run()函數是Vim集成的核心。它需要一個字典參數,一個規范,并相應地啟動fzf進程。至少要指定接收器選項,以告訴它應該對所選條目執行的操作。
call fzf#run({'sink': 'e'})
上面沒有指定源,所以這等效于在沒有標準輸入管道的情況下在命令行上啟動fzf。fzf將使用find命令(或$ FZF_DEFAULT_COMMAND(如果已定義))列出當前目錄下的文件。選擇一個文件時候,它將使用接收器:e命令將其打開。如果要在新選項卡中打開它,則可以傳遞:tabedit命令作為接收器。
call fzf#run({'sink': 'tabedit'})
可以使用任何shell命令作為源,而不是使用默認的find命令。比如下面示例將列出git管理的文件。相當于shell命令行下運行git ls-files | fzf。
call fzf#run({'source': 'git ls-files', 'sink': 'e'})
可以將fzf選項指定為spec詞典中的選項條目。
call fzf#run({'sink': 'tabedit', 'options': '--multi --reverse'})
不希望fzf窗口占據整個屏幕,還可以傳遞布局選項。
call fzf#run({'source': 'git ls-files', 'sink': 'e', 'left': '40%'})
call fzf#run({'source': 'git ls-files', 'sink': 'e', 'window': '30vnew'})
源不一定是外部shell命令,可以傳遞Vim??數組作為源。下面的示例中,傳遞了顏色名稱實現顏色方案選擇器的源。
call fzf#run({'source': map(split(globpath(&rtp, 'colors/*.vim')),
'fnamemodify(v:val, ":t:r")'),
'sink': 'colo', 'left': '25%'})
fzf#wrap
前面說過:FZF命令的幾個方面可以使用一組全局選項變量進行配置。使用不同的方式打開文件(g:fzf_action),窗口位置和大小(g:fzf_layout),調色板(g:fzf_colors)等不同的方式。那么,如何使我們的自定義fzf#run調用也能起作用呢?只需將其傳遞給fzf#run,然后用fzf#wrap修飾spec詞典:
fzf#wrap([name string], [spec dict], [fullscreen bool]) -> (dict)
所有參數都是可選的。通常只需要傳遞一個規范字典。
name用于管理歷史記錄文件。如果未定義g:fzf_history_dir,則會被忽略。
fullscreeen 可設置為0或1(默認值:0)。
fzf#wrap接受一個規范,并返回它的擴展版本(也是字典),并帶有用于解決全局首選項的其他選項。可以像這樣檢查它的返回值:
echo fzf#wrap({'source': 'ls'})
打包規范之后,就可將其傳遞給fzf#run。
call fzf#run(fzf#wrap({'source': 'ls'}))
現在,它支持CTRL-T,CTRL-V和CTRL-X鍵綁定,并根據g:fzf_layout設置打開fzf窗口。
為了使其易于使用,讓我們定義LS命令使用。
command! LS call fzf#run(fzf#wrap({'source': 'ls'}))
然后就可以通:LS調用。
其他功能
性能問題
Fzf很快,而且會變得越來越快。在大多數情況下,性能都不是問題。但是有幾個性能選項需要了解。
--ansi:告訴Fzf提取并解析輸入中的ANSI顏色代碼,這會使初始掃描變慢。因此,不建議將其添加到$FZF_DEFAULT_OPTS中。
--nth:該選項也會使fzf變慢,指定該選項后fzf必須對每行做標記。
--with-nth:該選項也會使fzf變慢,指定該選項后fzf必須每行標記并重新轉載。
如果對想能有嚴苛要求,可以考慮使用--algo = v1(默認值為v2)使fzf使用更快的貪婪算法。但是,不能保證該算法找到最佳順序的匹配,因此一般不建議使用。
執行外部程序
可以通過設置鍵綁定來啟動外部進程,而無需離開fzf(execute,execute-silent)。
通過按F1鍵以較少的文件打開文件而不離開fzf,通過按CTRL-Y將行復制到剪貼板并中止fzf(需要pbcopy支持)
fzf --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort'
預覽窗口
設置--preview選項時,fzf會自動以當前行作為參數啟動外部進程,并在拆分窗口中顯示結果。
使用{}替換為焦點行的單引號字符串
fzf --preview 'cat {}'
由于預覽窗口僅在該過程完成后才更新,因此該命令快速完成很重要。
使用head而不是cat,以便命令不會花費太長時間來完成
fzf --preview 'head -100 {}'
預覽窗口支持ANSI顏色,因此可以使用語法突出顯示文件內容的程序,比如和
bat、Highlight、CodeRay、Rouge等配合使用,比如下面的命令依次使用bat, highlight, coderay, rougify,然后回退到cat:
fzf --preview '[[ $(file --mime {}) =~ binary ]] &&
echo {} is a binary file ||
(bat --style=numbers --color=always {} ||
highlight -O ansi -l {} ||
coderay {} ||
rougify {} ||
cat {}) 2> /dev/null | head -500'
也可以使用--preview-window選項自定義預覽窗口的大小和位置。例如,
fzf --height 40% --reverse --preview 'file {}' --preview-window down:1
fzf --height 40%--reverse --preview'file {}'--preview-window down:1
.gitignore
可以使用fd,ripgrep或silver搜索程序代替默認的find命令來遍歷文件系統,搜索時候支持利用git忽略定義.gitignore文件排除文件和目錄。
將fd的輸出輸入fzf
fd --type f | fzf
將fd設置為fzf的默認源
export FZF_DEFAULT_COMMAND='fd --type f'
設置后, fzf(不帶管道)將使用fd代替find
也支持對CTRL-T命令使用:
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
如果要使該命令遵循符號鏈接,并且不希望其排除隱藏文件,可使用以下命令:
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
git ls-tree快速遍歷
如果在大型git存儲庫中運行fzf,則使用git ls-tree可以提高遍歷的速度。
export FZF_DEFAULT_COMMAND='
(git ls-tree -r --name-only HEAD ||
find . -path "*/.*" -prune -o -type f -print -o -type l -print |
sed s/^..//) 2> /dev/null'
Fish Shell
Fish Shell 2.6.0之前的版本不允許在命令替換中從STDIN讀取,所以簡單的vim(fzf)將無法正常工作。 fish 2.5.0和更早版本需要使用使用read fish命令:
fzf | read -l result; and vim $result
對于多個結果:
fzf -m | while read -l r; set result $result $r; end; and vim $result
fish shell的glob系統系統和shell不同,所以**的補全功能將不起作用。但是,CTRL-T命令將使用命令行最后一個標記作為遞歸搜索的根文件夾。例如,在以下命令行的末尾按下CTRL-T
ls /var/
將列出/var/下的所有文件和文件夾。
使用自定義FZF_CTRL_T_COMMAND時,請使用未擴展的$dir變量來使用此功能。當最后不是有效目錄時,$dir默認為.。 例:
set -g FZF_CTRL_T_COMMAND "command find -L $dir -type f 2> /dev/null | sed '1d; s#^./##'"
總結
Fzf是一款非常優秀、老少皆宜的開源系統工具,可以用來取代shell默認的搜索和補全行為。由于使用golang開發安裝部署非常方便,性能也非常高。適合于開發者,運維和其他Linux用戶,Github 2萬多星就足以說明其多受歡迎了,非常值得大家使用。
總結
以上是生活随笔為你收集整理的github 搜索_Fzf:Golang开发的Github高星系统模糊搜索补全工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ftp无法与服务器建立连接_建立与Ora
- 下一篇: python的基本语术_Python中的