zsh:忽略 _files 返回的完成列表中的符号链接

zsh:忽略 _files 返回的完成列表中的符号链接

我是编写 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

相关内容