我经常使用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!