fzf
「 fzf是一种通用的命令行模糊查找器 」
校对 ✅
翻译的原文 | 与日期 | 最新更新 | 更多 |
---|---|---|---|
commit | ⏰ 2018 9.4 | 中文翻译 |
- readme
- README-VIM.md
- BUILD.md
贡献
欢迎 👏 勘误/校对/更新贡献 😊 具体贡献请看
生活
If help, buy me coffee —— 营养跟不上了,给我来瓶营养快线吧! 💰
fzf是一种通用的命令行模糊查找器.
它是一个用于命令行的交互式Unix过滤器,可以与任何列表一起使用;文件,命令历史,进程,主机名,书签,git提交等.
优点
- 便携,无依赖性
- 非常快
- 最全面的功能集
- 布局灵活
- 自带的电池包括
- Vim/Neovim插件,按键绑定和模糊自动补全
目录
安装
fzf项目包含以下组件:
fzf
可执行文件fzf-tmux
用于在tmux窗格中,启动fzf的脚本- Shell扩展
- 按键绑定 (
CTRL-T
,CTRL-R
,和ALT-C
) (bash,zsh,fish) - 模糊自动补全 (bash,zsh)
- 按键绑定 (
- Vim/Neovim插件
您可以仅下载fzf可执行文件,如果你不需要额外的东西的话.
使用Homebrew或Linuxbrew
您可以使用Homebrew要么Linuxbrew安装fzf.
brew install fzf
# 安装有用的 按键 绑定 和 模糊 补全:
$(brew --prefix)/opt/fzf/install
用git
或者,您可以用"git clone"此存储库到任何目录,并运行install脚本.
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
作为Vim插件
一旦安装了fzf,就可以在Vim中启用它,通过添加目录到在您的Vim配置文件中的&runtimepath
,如下所示:
" If installed using Homebrew
set rtp+=/usr/local/opt/fzf
" If installed using git
set rtp+=~/.fzf
如果你使用vim-plug,同样可以写成:
" If installed using Homebrew
Plug '/usr/local/opt/fzf'
" If installed using git
Plug '~/.fzf'
但, 若你不在您的系统上单独安装fzf
(使用Homebrew或"git clone") , 并在Vim上启用它 (将其添加到&runtimepath
) ,你也可以使用vim-plug
来做到这两点.
" PlugInstall and PlugUpdate will clone fzf in ~/.fzf and run install script
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
" Both options are optional. You don't have to install fzf in ~/.fzf
" and you don't have to run install script if you use fzf only in Vim.
Arch Linux
sudo pacman -S fzf
Fedora
fzf在Fedora 26及更高版本中可用,可以使用常用方法安装:
sudo dnf install fzf
默认情况下,启用shell补全和vim或neovim的插件. Shell按键绑定已安装,但默认情况下未启用. 有关更多信息,请参阅Fedora的软件包文档 (/usr/share/doc/fzf/README.Fedora) .
Windows
可以下载用于Windows的预构建二进制文件这里. 也可以用choco.
choco install fzf
但是,项目的其他组件可能无法在Windows上运行. 可以找到已知的问题和限制信息在维基页面. 您可能会考虑安装适用于Linux的Windows子系统的fzf,一切都运行完美.
升级fzf
fzf正在积极开发中,您可能希望偶尔升级一次. 请根据按照以下说明进行操作对应安装方法.
- git:
cd ~/.fzf && git pull && ./install
- brew:
brew update; brew reinstall fzf
- chocolatey:
choco upgrade fzf
- vim-plug:
:PlugUpdate fzf
构建fzf
- 看到BUILD.md.
用法
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
) 上下移动光标Enter
键选择项目,CTRL-C
/CTRL-G
/ESC
退出- 在多选模式下 (
-m
),TAB
和Shift-TAB
标记多个项目 - Emacs样式的按键绑定
- 鼠标: 滚动,单击,双击; 在多选模式下进行
shift-点击
和shift-滚动
布局
默认情况下,fzf以全屏模式启动,但您可以使用--height
选项,从光标下方开始的宽度.
vim $(fzf --height 40%)
还可以看看--reverse
和--layout
选项,如果您更喜欢"自上而下"布局,而不是默认的"自下而上"布局.
vim $(fzf --height 40% --reverse)
您可以将这些选项添加到$FZF_DEFAULT_OPTS
这样他们就可以默认应用了. 例如,
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'
搜索语法
除非另有说明,否则fzf以"扩展搜索模式"开始,您可以在其中键入由空格分隔的多个搜索项. 例如^music .mp3$ sbtrkt !fire
例子 | 匹配类型 | 描述 |
---|---|---|
sbtrkt |
模糊匹配 | 匹配sbtrkt 的项目 |
'wild |
完全匹配 (引号) | 包含wild 的项目 |
^music |
前缀精确匹配 | 以music 开头的项目 |
.mp3$ |
后缀精确匹配 | 以.mp3 结尾的项目 |
!fire |
反精确匹配 | 不包含fire 的项目 |
!^music |
反前缀精确匹配 | 不以music 开头的项目 |
!.mp3$ |
反后缀精确匹配 | 不以.mp3 结尾的项目 |
如果您不喜欢模糊匹配,但由不希望"引号"每个单词,请启动fzf-e
/--exact
选项. 请注意,当--exact
设定,'
-前缀, 就变成了模糊匹配"unquotes"的意思.
有个单个条形字符可用作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"
选项
请参见手册页 (man fzf
) 获取完整的选项列表.
例子
the wiki page可以找到许多有用的例子. 也请随意添加自己的例子.
fzf-tmux
脚本
fzf-tmux是一个bash脚本,在tmux窗格中打开fzf.
# usage: fzf-tmux [-u|-d [HEIGHT[%]]] [-l|-r [WIDTH[%]]] [--] [FZF OPTIONS]
# (-[udlr]: up/down/left/right)
# select git branches in horizontal split below (15 lines)
git branch | fzf-tmux -d 15
# select multiple words in vertical split on the left (20% of screen width)
cat /usr/share/dict/words | fzf-tmux -l 20% --multi --reverse
即使你不在tmux上,它仍然会工作,默默无视-[udlr]
选项,所以可以在你的脚本中经常使用fzf-tmux
.
或者,您可以使用--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模式的按键绑定.
可以在the wiki page找到更多提示.
bash和zsh的模糊完成
文件和目录
如果光标前的单词以默认的触发顺序结束,则可以触发文件和目录的模糊完成**
.
COMMAND [DIRECTORY/][FUZZY_PATTERN]**<TAB>
# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>
# Files under parent directory
vim ../**<TAB>
# Files under parent directory that match `fzf`
vim ../fzf**<TAB>
# Files under your home directory
vim ~/**<TAB>
# Directories under current directory (single-selection)
cd **<TAB>
# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>
进程ID
为kill命令提供PID的模糊完成. 在这种情况下,没有触发序列,只需在kill命令后按tab键.
# Can select multiple processes with <TAB> or <Shift-TAB> keys
kill -9 <TAB>
主机名
对于ssh和telnet命令,提供了主机名的模糊完成. 名称从 /etc/hosts和 〜/.ssh/config 中提取.
ssh **<TAB>
telnet **<TAB>
环境变量/别名
unset **<TAB>
export **<TAB>
unalias **<TAB>
设置
# Use ~~ as the trigger sequence instead of the default **
export FZF_COMPLETION_TRIGGER='~~'
# Options to fzf command
export FZF_COMPLETION_OPTS='+c -x'
# Use fd (https://github.com/sharkdp/fd) instead of the default find
# command for listing path candidates.
# - The first argument to the function ($1) is the base path to start traversal
# - See the source code (completion.{bash,zsh}) for the details.
_fzf_compgen_path() {
fd --hidden --follow --exclude ".git" . "$1"
}
# Use fd to generate the list for directory completion
_fzf_compgen_dir() {
fd --type d --hidden --follow --exclude ".git" . "$1"
}
支持的命令
在bash上,模糊完成,仅对预定义的一组命令启用 (complete | grep _fzf
看清单) . 但您可以为其他命令启用它,如下所示.
complete -F _fzf_path_completion -o default -o bashdefault ag
complete -F _fzf_dir_completion -o default -o bashdefault tree
Vim插件
高级主题
性能
fzf很快,而且是变得更快. 在大多数用例中,性能不应成为问题. 但是,您可能希望了解影响性能的选项.
--ansi
告诉fzf提取,并解析输入中的ANSI颜色代码,它使初始扫描速度变慢. 因此不建议您将其添加到您的$FZF_DEFAULT_OPTS
.--nth
使fzf变慢,因为fzf必须标记每一行.--with-nth
使fzf变慢,因为fzf必须标记化,并重新组合每一行.- 如果您绝对需要更好的性能,可以考虑使用
--algo=v1
(默认为v2
) 使fzf使用更快的贪心算法. 但是,此算法无法保证找到匹配的最佳排序,因此不建议这样做.
执行外部程序
您可以设置按键绑定,以启动外部进程而无需离开fzf (execute
,execute-silent
) .
# Press F1 to open the file with less without leaving fzf
# Press CTRL-Y to copy the line to clipboard and aborts fzf (requires pbcopy)
fzf --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort'
看手册页KEY BINDINGS部分,了解详细信息.
预览窗口
当设置了--preview
选项,fzf会以当前行作为参数自动启动外部进程,并在拆分窗口中显示结果.
# {} is replaced to the single-quoted string of the focused line
fzf --preview 'cat {}'
由于预览窗口仅在过程完成后更新,因此快速完成命令非常重要.
# Use head instead of cat so that the command doesn't take too long to finish
fzf --preview 'head -100 {}'
预览窗口支持ANSI颜色,因此您可以使用语法高亮显示文件内容的程序.
- Highlight: http://www.andre-simon.de/doku/highlight/en/highlight.php
- CodeRay: http://coderay.rubychan.de/
- Rouge: https://github.com/jneen/rouge
# Try highlight, coderay, rougify in turn, then fall back to cat
fzf --preview '[[ $(file --mime {}) =~ binary ]] &&
echo {} is a binary file ||
(highlight -O ansi -l {} ||
coderay {} ||
rougify {} ||
cat {}) 2> /dev/null | head -500'
您可以使用自定义预览窗口的大小和位置,通过--preview-window
选项. 例如,
fzf --height 40% --reverse --preview 'file {}' --preview-window down:1
有关更高级的示例,请参阅git与fzf的键绑定 (code) .
提示
.gitignore
关于您可以使用fd,ripgrep, 要么the silver
searcher替代默认的find命令遍历文件系统遵循.gitignore
内容.
# Feed the output of fd into fzf
fd --type f | fzf
# Setting fd as the default source for fzf
export FZF_DEFAULT_COMMAND='fd --type f'
# Now fzf (w/o pipe) will use fd instead of find
fzf
# To apply the command to CTRL-T as well
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
版本2.6.0之前的fish不允许在命令替换中从STDIN读取,这意味着简单vim (fzf)
没有按预期工作. 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中是不同的,说明**
完成不起作用. 但是,那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#^\./##'"
License
(MIT)
版权所有 (c) 2017 Junegunn Choi