假答案似乎不足以解决这个假问题。zsh对自动挂载目录的内置支持在目录(fake-files dir:names
)上运行,而不是在其中的文件模式上运行。将特定的命名文件添加到目录很方便,这可能适用于automount
或sshfs
NetApp .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,如果有人想通过深入研究为什么这种失败。