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

たぶん:

#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

関連情報