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}#
?
(请注意,我希望完成每次调用_files
or 时都可以使用_dirs
,而不仅仅是cd
命令。_files
如果可能,我宁愿不必复制函数的代码。)
¹和所有其余的扩展
在 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)
祝你好运!
归档时间: |
|
查看次数: |
1490 次 |
最近记录: |