如何从与当前工作目录不同的目录启动 fzf?

Shu*_*eng 13 filesystems directory bash fzf vim-fzf

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

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

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

我已经尝试过fzf <dir>,但它会导致错误(未知选项)。另外,我找不到任何选项,例如-C <dir>指定起始目录。

mat*_*ttb 7

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

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

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

问题

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

这样做的问题是,您最终会搜索很多目录,而您知道这些目录没有您想要的文件。主要的罪魁祸首是安装 anaconda3 时最终得到的目录。结果将被数千个内部文件淹没,并且路径很长。长路径往往会“吸收”我在搜索中输入的所有字母,因此 fzf 很难将它们过滤掉。

解决方案

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

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

sudo apt install fd-find
Run Code Online (Sandbox Code Playgroud)

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

# adapt version number and architecture
sudo dpkg -i fd_8.2.1_amd64.deb
Run Code Online (Sandbox Code Playgroud)

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

export FZF_DEFAULT_COMMAND="fdfind . $HOME"
Run Code Online (Sandbox Code Playgroud)

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

export FZF_DEFAULT_COMMAND="fd . $HOME"
Run Code Online (Sandbox Code Playgroud)

现在,fzf 将始终从主目录递归搜索,并尊重任何 .ignore 文件。那么让我们在主目录中创建一个:

touch ~/.ignore
Run Code Online (Sandbox Code Playgroud)

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

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

# start by igoring every home directory
anaconda3/
arch/
cache/
code/
Desktop/
  .
  .
  .
Run Code Online (Sandbox Code Playgroud)

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

# now un-ignore the ones I care about
!code/
!Desktop/
!documents/
!downloads/
  .
  .
  .
Run Code Online (Sandbox Code Playgroud)

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

我们终于得到它了。我们可以在文件系统中的任何位置调用 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='fd .'"

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

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

:.!ls ~/
Run Code Online (Sandbox Code Playgroud)

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

:.,$ norm A/
Run Code Online (Sandbox Code Playgroud)

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

:.,$ norm I!
Run Code Online (Sandbox Code Playgroud)


sti*_*ijn 5

假设您使用的是 bash 或类似的,这是内置于与 fzf 一起安装的默认完成选项中的: https: //github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh

太棒了;输入起始文件或目录,追加**并点击Tab. 因此,如果您输入,cd /foo/**则选项卡将打开 fzf,并以 /foo 作为起始目录。

在编写此命令时进行编辑,该命令适用于fzf 的 bash 帮助程序中的硬编码,这就是为什么此命令适用于catandcd但不适用于tacor nano。这是完整的列表:

awk cat diff diff3
emacs emacsclient ex file ftp g++ gcc gvim head hg java
javac ld less more mvim nvim patch perl python ruby
sed sftp sort source tail tee uniq vi view vim wc xdg-open
basename bunzip2 bzip2 chmod chown curl cp dirname du
find git grep gunzip gzip hg jar
ln ls mv open rm rsync scp
svn tar unzip zip
Run Code Online (Sandbox Code Playgroud)

要添加其他命令,请在 .bashrc 中使用此命令,在 fzf 获取来源的位置之后(类似于[ -f ~/.fzf.bash ] && source ~/.fzf.bash):

__fzf_defc "tac" _fzf_path_completion "-o default -o bashdefault"
Run Code Online (Sandbox Code Playgroud)

或者:打开一个问题询问您想要默认添加到 fzf 的命令,无论如何,像 tac 和 nano 这样的命令是非常常见的。


Sam*_*uel 5

你可以这样做:

  • find <dir> | fzf
  • fd . <dir> | fzf

来源