在 zsh 中完成 avfs 假目录

Gil*_*il' 37 zsh autocomplete filenames avfs

在某些情况下,如何调整 zsh 的完成系统以完成“假”文件?

更准确地说,AVFS文件系统通过在每个存档旁边创建一个“假目录”来将存档公开为目录。默认情况下,它复制其挂载点下的整个目录层次结构~/.avfs。此外,在 下~/.avfs,对于每个存档文件(例如 )/tmp/foo.zip,除了存档文件本身之外~/.avfs/tmp/foo.zip,还有一个称为~/.avfs/tmp/foo.zip#公开存档内容的目录。然而,这个额外的目录没有出现在 : 的列表中~/.avfs/tmp,它只在明确请求时才存在。(这类似于某些自动挂载器的操作方式。)

mountavfs
cd ~/.avfs/tmp/foo.zip\#
Run Code Online (Sandbox Code Playgroud)

当我键入类似上面的命令时,foo.zip#在 下不会显示为完成~/.avfs/tmp/,因为没有这样的目录。我怎么能告诉 zsh 每当有一个文件的完整路径$arc匹配~/.avfs/**/*.(tgz|zip)¹ 时,它应该假装有一个名为 的目录${arc}#

(请注意,我希望完成每次调用_filesor 时都可以使用_dirs,而不仅仅是cd命令。_files如果可能,我宁愿不必复制函数的代码。)

¹和所有其余的扩展

joe*_*dle 0

在 zsh 中,您可以使用compctl -K注册自己的函数来生成完成选项。例如:

compctl -f -c -u -r -K myAVFScompletion "*" -tn
Run Code Online (Sandbox Code Playgroud)

然后你需要定义你自己的函数:

myAVFScompletion () {
    read -c COMMAND ARGS

    # Decide what paths you want to suggest completion for
    # by looking inside the ~/.avfs folder.

    # Place your suggestions into an array:
    reply=( a_path b_path ... )
}
Run Code Online (Sandbox Code Playgroud)

显然,上述内容还需要做更多的工作,但这是一个开始。

可以为 bash 注册类似(但不同)的自定义完成函数。

这是bash 和 zsh 实现的示例。(它通过从命令的手册页中获取选项来完成命令行选项。)

以下是对完成函数中可能起作用的一些快速猜测:

if [[ -d "$ARGS#" ]]
then reply=( "$ARGS#" )
else reply=
fi
Run Code Online (Sandbox Code Playgroud)

或者也许是这样的:

reply=( $(find ~/.avfs -type f -name "*.tgz" -or -name "*.zip" | sed 's+$+#+') )
Run Code Online (Sandbox Code Playgroud)

祝你好运!