假答案似乎不足以解决这个假问题。zsh对自动挂载目录的内置支持在目录(fake-files dir:names)上运行,而不是在其中的文件模式上运行。将特定的命名文件添加到目录很方便,这可能适用于automount或sshfsNetApp .snapshot类型设置,其中要安装的目录是已知的静态名称ALAS。
autoload -U compinit
compinit
zstyle ':completion:*' fake-files $HOME/.avfs:'ALAS POOR YORICK'
zshall(1)说“名称”是字符串,并且实验表明元字符(例如#或\#或'*(e:"echo hi":)')以各种方式“不起作用”,因此我不知道有什么方法可以将全局变量放到fake-files语句的名称部分。(钻研过Src/Zle/computil.c可能会透露确切的名称可能是什么,但是这将是更多的工作。)(另外,在目录中的位置来命名的存档文件也飞不使用递归的水珠,但同样会采取Ç潜水,看看有多少fake-files让你逃脱了。)
使用compdef,可以列出.avfs目录的完成情况:
compdef '_files -g $HOME/.avfs/\*' -p \^
function andthehash {
reply=($REPLY $REPLY\#)
}
compdef "_files -g $HOME/.avfs/'*(+andthehash)'" -p \^
除非失败,否则它将仅在#无关紧要时显示文件,因此无法在文件上完成文件。(尽管不是这种情况,但此表格有很多生产用途。)
使用zstyle以下内容可以拉近您的距离.zshrc:
autoload -U compinit
compinit
function UnderAVFS {
local pdir
[[ -z $1 ]] && return 1
pdir=$1:a
[[ ! -d $pdir ]] && pdir=$pdir:h
[[ ! -d $pdir || $pdir == . ]] && return 1
while [[ $pdir != / ]]; do
[[ $pdir == $HOME/.avfs ]] && return 0
pdir=$pdir:h
done
return 1
}
function AVFSExtras {
if UnderAVFS $REPLY; then
reply=($REPLY)
# TODO embiggen list of archive suffixes
[[ $REPLY == *.(bz2|tbz2) ]] && reply+=($REPLY\#)
fi
}
# Try to match avfs, otherwise the default pattern. Probably could greatly
# benefit from caching, to avoid hits on UnderAVFS function.
zstyle ':completion:*' file-patterns '*(+AVFSExtras):avfs-files' '%p:all-files'
但是,它只能完成最多的工作\#/(在使用默认avfs设置的debian压缩virt上),而不能完成存档的虚拟文件系统,因此,需要完成一些附加工作才能完全完成存档。我正在猜测是通过via _call_program ... ls还是类似的东西来完成\#,除非有一种更优雅的方法可以让您zsh相信不存在的目录可以完成。
坏消息!完成不会使_path_files伪目录通过;我怀疑这与zsh遍历有关。zsh 4.something和zsh 5.0.8都存在此问题。因此,我怀疑完整的修复程序将需要修补程序_path_files,或编写与其他伪造目录有关的其他内容。可以通过打字来生成完成调试跟踪ls /root/.avfs/root/sometar.gz\#/,然后在该打字结束control-x后?,假设bindkey -e和_complete_debug必然说keycombo,如果有人想通过深入研究为什么这种失败。