日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

github 搜索_Fzf:Golang开发的Github高星系统模糊搜索补全工具

發布時間:2024/8/1 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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高星系统模糊搜索补全工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。