Zsh
zsh:忽略 _files 返回的完成列表中的符號連結
我是編寫 zsh 完成的新手。如何忽略符號連結以完成返回的顯示
_files -W /path/to/folder/
?
填充了一個測試目錄:
% cd && mkdir foo && cd foo % touch file1 file2 % mkdir dir1 % ln -s file1 link1 % ln -s dir1 link2
並且使用非符號連結 glob 限定符
^
@
可以忽略符號連結。% print * dir1 file1 file2 link1 link2 % print *(^@) dir1 file1 file2
補全然後可以使用使用的
-g
標誌_path_files
,_files
許多 ZSH 補全函式和內置函式必須追查這樣的間接:-g 模式 指定只應完成與模式匹配的文件。
所以也許:
#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