Linux模糊搜索神器fzf终极配置

fzf是Linux终端下的一款模糊搜索神器,速度极快,还可以配合vim以及其他软件使用,可以说是终端党的必备神器。虽然它安装起来比 较简单,但是想要使用得比较好,还是需要一番配置的,但是我看网上配置的文章都写得比较简单,所以写这篇文章记录一下。

安装

fzf可以单独安装,不过我推荐在vim中和fzf.vim一起安装,比较方便而且简单,我使用的vim plug管理插件,所以在vim配置文件里添加 以下两行就可以了。

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all'  }
Plug 'junegunn/fzf.vim'

然后在vim下执行:PlugInstall,它就开始安装了,安装过程中会问你几个问题,都按y就好了。

安装完成后就可以开始使用了,但是现在使用起来并不是很爽,因为没有预览,不能搜索隐藏文件,而且只能搜索当前目录,还不能排除一些乱七八糟的文件夹,经过配置之后这些都可以解决。

配置

在使用之前首先要安装两个软件,fdfind(也有可能叫fd)和rg(ripgrep)还有 bat(一个文本 预览工具,类似于cat,但是比它更强大)。然后在.zshrc文件下添加以下设置。

###
###FZF
###
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh

export FZF_DEFAULT_COMMAND='fdfind --hidden --follow -E ".git" -E "node_modules" . /etc /home'
export FZF_DEFAULT_OPTS='--height 90% --layout=reverse --bind=alt-j:down,alt-k:up,alt-i:toggle+down --border --preview "echo {} | ~/linux-config-file/fzf/fzf_preview.py" --preview-window=down'

# use fzf in bash and zsh
# Use ~~ as the trigger sequence instead of the default **
#export FZF_COMPLETION_TRIGGER='~~'

# Options to fzf command
#export FZF_COMPLETION_OPTS=''

# 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() {
  fdfind --hidden --follow -E ".git" -E "node_modules" . /etc /home
}

# Use fd to generate the list for directory completion
_fzf_compgen_dir() {
  fdfind --type d --hidden --follow -E ".git" -E "node_modules" . /etc /home
}

  • 前面有#号的是注释
  • FZF_DEFAULT_COMMAND是用来列出文件以供fzf搜索的命令
  • --hidden:允许搜索隐藏文件
  • -E:后面跟的目录不会被搜索,用来排除一些没什么用的目录
  • 最后的/etc和/home就是会在这两个目录里进行搜索,你也可以添加其它目录
  • FZF_COMPLETION_OPTS是fzf搜索时的默认参数
  • --height:搜索窗口占屏幕的比例
  • --layout=reverse:默认搜索栏在底部,设置后搜索栏在上面
  • --bind:用来更改默认快捷键的,格式就是 快捷键:动作 设置之间用逗号分隔
  • --preview:预览命令,后面的python文件是我自己写的Python脚本路径,可以实现一些文件的预览
  • --preview-window:预览窗口的位置,默认在右边,我设置到下边
  • FZF_COMPLETION_TRIGGER:在终端触发fzf的快捷键,默认是**
  • 最下面两个命令就是终端使用的时候的列出文件的命令,其实和上面的是一样的,只是下面的那个是只列出文件夹,所以多了一个--type参数

下面是我自己写的预览脚本的内容,你得把它复制到文件里,授予执行权限,放到合适的路径,然后用你的路径替换上面我的路径,大佬请忽略我乱七八糟的语法和谜一般的命名。

#! /usr/bin/python3

import os
import sys


def fzf_preview(rg_name):
    rg_list = rg_name.split(':')
    if len(rg_list) == 1:
        bat_range = 0
    else:
        bat_range = rg_list[1].replace('\n', '')
    file_path_list = rg_list[0].replace('\n', '').split('/')
    for i,filep in zip(range(len(file_path_list)), file_path_list):
        path_space = filep.find(' ')
        if not path_space == -1:
            file_path_list[i] = "'{}'".format(filep)
        file_path = '/'.join(file_path_list)
    preview_nameandline = [file_path, bat_range]
    return preview_nameandline


if __name__ == "__main__":
    rg_name = sys.stdin.readlines()[0]
    preview_nameandline = fzf_preview(rg_name)
    if os.path.isdir(preview_nameandline[0]):
        os.system('ls -la {}'.format(preview_nameandline[0]))
    elif preview_nameandline[0].replace("'", '').endswith(('.zip', '.ZIP')):
        os.system('unzip -l {}'.format(preview_nameandline[0]))
    elif preview_nameandline[0].replace("'", '').endswith(('.rar', '.RAR')):
        os.system('unrar l {}'.format(preview_nameandline[0]))
    elif preview_nameandline[0].replace("'", '').endswith('.torrent'):
        os.system('transmission-show {}'.format(preview_nameandline[0]))
    elif preview_nameandline[0].replace("'", '').endswith(('.html', '.htm', '.xhtml')):
        os.system('w3m -dump {}'.format(preview_nameandline[0]))
    else:
        os.system('bat --style=numbers --color=always -r {}: {}'.format(
            preview_nameandline[1], preview_nameandline[0]))

使用

终端中使用

  • 在终端直接执行fzf,搜索到文件后会返回文件的绝对路径
image.png
  • 在终端使用快捷键触发,在任何需要使用路径的地方都可以用
nvim **<tab>
  • kill命令进程搜索,这个是真的好用
kill -9 <tab>

在vim中使用

  • 使用:Files命令开始搜索文件,找到后回车打开
image.png
  • 使用:Rg对文本内容进行模糊搜索,厉害了
image.png

然后你可以将这两个命令绑定到快捷键上,这样你就可以享受fzf所带来的便利了。

和ranger配合使用

ranger是一个终端下的文件浏览器,和它配合使用可以实现文件的寻找并快速跳转。

ranger默认安装完成后没有配置文件,需要执行ranger --copy-config=all来生成默认配置文件。文件路径在~/.config/ranger。现在可以开始添加配置到commands.py,官方的配置你可以在 这里 找到,但是官方的命令并不好用,所以我进行了一些修改,如下:

# use fzf in ranger
class fzf_select(Command):
    """
    :fzf_select

    Find a file using fzf.

    With a prefix argument select only directories.

    See: https://github.com/junegunn/fzf
    """
    def execute(self):
        import subprocess
        import os.path
        if self.quantifier:
            # match only directories
            command='fdfind --type d --hidden --follow -E ".git" -E "node_modules" . /etc /home/tom | fzf +m'
        else:
            # match files and directories
            command='fdfind --hidden --follow -E ".git" -E "node_modules" . /etc /home/tom | fzf +m'
        fzf = self.fm.execute_command(command, universal_newlines=True, stdout=subprocess.PIPE)
        stdout, stderr = fzf.communicate()
        if fzf.returncode == 0:
            fzf_file = os.path.abspath(stdout.rstrip('\n'))
            if os.path.isdir(fzf_file):
                self.fm.cd(fzf_file)
            else:
                self.fm.select_file(fzf_file)

添加完成之后你就可以通过:fzf_select命令来在ranger中启动fzf查找,并自动跳转了。当然你可以把这个命令绑定到一个快捷键上,通过在rc.conf中添加以下配置。

# 将fzf查找绑定到ctrl+f键,最好添加到注释Searching后面,我之前添加到前面没有生效,不知道为什么
map <C-f> fzf_select

目前尚未解决的问题,在nvim中使用Rg进行文本内容搜索时依然只能搜索当前文件夹,并且无法搜索隐藏文件

问题解决

2020/9/14, 搜索隐藏文件的问题已解决, 在init.vim中加上以下内容

command! -bang -nargs=* Rg
             \ call fzf#vim#grep(
             \ "rg --column --line-number --no-heading --color=always --smart-case --hidden -g '!**/.git/**' -- ".shellescape(<q-args>), 1, <bang>0)

# --hidden: 显示隐藏文件
#   -g '!**/.git/**': 排除所有.git文件夹
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 前言 fzf 是一款功能强大的命令行模糊搜索工具。 fzf 可以对文件,命令行历史记录,进程,主机名,标签,git...
    Whyn阅读 16,393评论 1 3
  • 01. VIM 配置 02. Neovim 配置 03. IdeaVim 进阶配置 04. VsVim 配置 前言...
    Whyn阅读 4,441评论 0 2
  • fzf是目前最快的fuzzy finder。使用golang编写。结合其他工具(比如ag和fasd)可以完成非常多...
    佛心看世界阅读 2,276评论 0 2
  • 一、前言 环境: ubuntu16.04 vim7.4 python3.5 最终效果预览 如果想充分地利用好本文,...
    MiracleJQ阅读 4,386评论 0 11
  • 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我...
    Dyworldhua阅读 1,256评论 0 2