Zsh

zsh:忽略 _files 返回的完成列表中的符號連結

  • September 8, 2022

我是編寫 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

引用自:https://unix.stackexchange.com/questions/716574