我是编写 zsh 补全的新手。如何忽略由返回的完成中显示的符号链接_files -W /path/to/folder/
?
答案1
填充测试目录:
% cd && mkdir foo && cd foo
% touch file1 file2
% mkdir dir1
% ln -s file1 link1
% ln -s dir1 link2
对于非符号链接全局限定符,^
@
符号链接可能会被忽略。
% print *
dir1 file1 file2 link1 link2
% print *(^@)
dir1 file1 file2
然后,完成可以使用使用的-g
标志 ,许多 ZSH 完成函数和内置函数必须追踪此类间接:_path_files
_files
-g pattern 指定仅应完成与模式匹配的文件。
所以也许:
#compdef foo
_arguments "1:file:_files -W ~/foo -g '*(^@)'" && return 0
但是,这在指向目录的符号链接上完成:
% foo <<MASHTABKEY>>
dir1/ file1 file2 link2@
% ln -s /etc/passwd
% ln -s /etc
% foo <<MASHTABKEY>>
dir1/ etc@ file1 file2 link2@
~/foo
如果指向目录的符号链接存在问题,则需要对目录中的所有文件完成不同的攻击
#compdef foo
_arguments '1:file:_files -W ~/foo' && return 0
然后指定 的all-files
完成样式foo
:
% zstyle ':completion:*:*:foo:*:*' file-patterns '*(^@):all-files'
% foo <<MASHTABKEY>>
dir/ file1 file2