私は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パターンは、パターンと一致するファイルのみが完了することを指定します。
たぶん:
#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