配置 FZF 搜索工作目录之外的有用目录

配置 FZF 搜索工作目录之外的有用目录

我经常使用fzf它来导航文件系统,尤其是 Alt-c 键绑定。

调用时,fzf从当前工作目录生成一个列表。

是否可以fzf从指定目录生成列表?

我尝试过fzf <dir>,但结果出现错误(未知选项)。此外,我找不到任何选项,例如-C <dir>用于指定起始目录。

答案1

我有一个更普遍的问题,可能对你有用。以下内容来自博客文章我写道:

配置 FZF 搜索工作目录之外的有用目录

我既将 fzf 用作命令行工具,也使用 fzf.vim 插件在 Vim 中使用。它使查找(和打开)文件变得直观、快速,并且您无需记住文件的位置或确切名称。默认情况下,fzf 会在当前目录中递归搜索,这通常正是您想要的。如果您需要在当前工作目录之外的某个目录中搜索文件,则需要将该路径指定为 fzf 的参数,之后一切照常(fzf 将递归搜索指定的目录)。

问题

为了进行模糊搜索,有时必须精确指定路径,这总是令人感到遗憾……精确指定路径正是 fzf 应该为您减轻负担的!我最初的方法是提供主目录路径,让 fzf 搜索所有内容,主目录路径只需几个字符即可指定,因此在这种情况下没有真正的负担。

这样做的问题是,你最终会搜索很多目录,而这些目录你知道没有你想要的文件。主要问题是你安装 anaconda3 后最终得到的目录。结果将充斥着数千个内部文件,路径非常长。长路径往往会“吸收”我在搜索中输入的任何字母,因此 fzf 很难将它们过滤掉。

解决方案

你可以选择 fzf 在后台使用的搜索工具。默认是标准的 linux find 命令,但你也可以使用 fd、ripgrep 或 silver searcher。除了比默认的 find 快得多之外,后面这些工具尊重 .ignore 文件。这意味着 fzf 将跳过 .ignore 文件中列出的任何文件或目录。我们可以利用此功能。

首先,我们安装 fd。如果你运行的是 Ubuntu 19.04 (Disco Dingo) 或更新版本,则可以安装官方维护的软件包:

sudo apt install fd-find

如果您使用旧版本的 Ubuntu,您可以从发布页面下载最新的 .deb 包并通过以下方式安装:

# adapt version number and architecture
sudo dpkg -i fd_8.2.1_amd64.deb

现在我们通过在 .bashrc 中添加以下行来配置 fzf 以使用 fd:

export FZF_DEFAULT_COMMAND="fdfind . $HOME"

如果你使用的是 Ubuntu 19.10 之前的版本,则需要像这样修改上面的行:

export FZF_DEFAULT_COMMAND="fd . $HOME"

现在 fzf 将始终从主目录递归搜索,并尊重任何 .ignore 文件:

touch ~/.ignore

我发现我可能 (~15) 想要用 fzf 递归搜索的目录列表比我永远不想搜索的目录列表要短。我想要搜索的目录中的文件总数约为 5000 个左右 - 用 fd 可以轻松处理。

在 .ignore 文件中,我首先列出我的所有主目录,每个目录后面都跟着一个“/”:

# start by igoring every home directory
anaconda3/
arch/
cache/
code/
Desktop/
  .
  .
  .

然后在这些目录下面放置您想要搜索的目录,每个目录前面都有一个“!”,后面跟着一个“/”:

# now un-ignore the ones I care about
!code/
!Desktop/
!documents/
!downloads/
  .
  .
  .

'!' 将“取消”先前的忽略命令。

就这样,我们就成功了。我们可以在文件系统的任何地方调用 fzf,开始输入我们想找的文件的模糊信息,fzf 会在一组预定义的目录中搜索并轻松找到它。这完全消除了思考文件可能在哪里以及它是如何精确命名的障碍。

注意:我注意到,由于某种原因,几个子目录没有出现在 fzf 搜索中,因此我在本节中明确创建了一些“!path/to/missed/directory/”行...

注意:您可能想知道“如果我发现自己处于不在列表中的常用目录中,并且想要使用 fzf,该怎么办?”。我也有同样的担忧,所以我在 .bashrc 中放了几个别名,可以随意打开和关闭上述配置(请确保在 Ubuntu 19.10+ 中使用“fdfind”,如上所述已弃用):

# restore fzf default options ('fzf clear')
alias fzfcl="export FZF_DEFAULT_COMMAND=''"

# reinstate fzf custom options ('fzf-' as in 'cd -' as in 'back to where I was')
alias fzf-="export FZF_DEFAULT_COMMAND='fd . $HOME'"

如果您使用 Vim 创建 .ignore 文件,获取主目录中所有目录的列表的简单方法是使用以下命令:

:.!ls ~/

将光标放在列表中的第一个目录上并输入以下命令,将“/”附加到所有行:

:.,$ norm A/

与上面类似,将光标放在列表中的第一个目录上并输入以下命令,在每个目录前插入“!”:

:.,$ norm I!

相关内容