zsh globbingが.DS_Storeのようなファイルを無視するようにする方法

zsh globbingが.DS_Storeのようなファイルを無視するようにする方法

ほとんどの場合、iTermのBSDバリアントでzshを実行するのが好きですが(一方では)実行されていない、または実行するのと同じくらい意味のないアプリにmacOSエクスペリエンスを提供します。ターミナル。

しかし、私を狂わせる1つの事実は、.DS_StoremacOSがあちこちに捨てる恐ろしいファイルです。

たとえば、と入力すると、避けたいファイルを含まずに拡張するnvim *tabようにzshを設定できますか?*(ここには、、.DS_StoreおよびIcon?現在としては考えられないその他の可能性が含まれることがあります。)

特定のファイルを除外するパターンをインスタントでどのように構築するかを尋ねるものではありません(例ここここここ)しかし、すべてのグローバルオブジェクトが常に特定のファイルを除外するようにするにはどうすればよいですか?

答え1

このオプション以外では、ワイルドカード自体をカスタマイズすることはできませんdot_glob。これはATT kshとbashにはありますがzshにはないいくつかの機能の1つです。だからecho *常に表示されますIcon1

完了するとパターンは無視できますが、ワイルドカードを含めると状況が複雑になります。簡単なものから始めましょう。つまり、ワイルドカードを使わない完成です。次の.zshrcファイルの場合、一致するものがないと完了情報は提供されません.DS_StoreIcon1

autoload -zU compinit
compinit
zstyle ':completion::complete:*:*:files' ignored-patterns '.DS_Store' 'Icon?'
zstyle ':completion::complete:*:*:globbed-files' ignored-patterns '.DS_Store' 'Icon?'
zstyle ':completion::complete:rm:*:globbed-files' ignored-patterns

説明: 私が定義する完全なスタイル:

  • 完了するたびに適用されます。
  • 「関数」が空の場合に適用されます(一部の特殊ウィジェットは除外されます)。
  • 通常の完了時に適用されます(_complete)、例えば修正_ingore
  • を除くすべてのコマンドに適用されますrm。このrmコマンドの場合、上記のコードスニペットはデフォルト値をオーバーライドする空の無視リストを定義します。
  • これはコマンドラインのどこにでも適用されます。
  • ファイル名を収集するときに適用されます(タグを介して)。_filesまたはタグ_globbed-files)。

これらのスタイルはワイルドカード拡張では機能しません。デフォルトでは、ワイルドカード拡張はTab完了コードをバイパスします。特に完了コードを使用するには_expand完成者、タグを使用する完成機をバインドしてTab使用complete-wordする必要があります。_expandexpansions

autoload -zU compinit
compinit
bindkey '^I' complete-word
zstyle ':completion:::::' completer _expand _complete _ignored
zstyle ':completion::expand:*:*:expansions' ignored-patterns '.DS_Store' 'Icon?'
zstyle ':completion::expand:*:*:all-expansions' ignored-patterns '.DS_Store' 'Icon?'

このようにして、 と を含むディレクトリで 、.zshrcと を繰り返します。ラベルのスタイルにより、個々の拡張を繰り返すと無視されます。一致リストに展開すると機能するタグがありますが、残念ながらサポートされていません。 (実際にはサポートされていますが役に立ちません。このタグは、個々の要素を削除するのではなく、一致リスト全体を削除するために使用できます。).DOH.DS_Store.zshrcecho .*Tab.DOH.zshrc.DOH .DS_Store .zshrc.*ignored-patternsexpansions.DS_Storeall-expansionsignored-patterns

すべての拡張リストで一致をフィルタリングする唯一の方法は、パッチを適用することです。_expand機能

diff --git a/Completion/Base/Completer/_expand b/Completion/Base/Completer/_expand
index e5e4f9b39..df6f55a7d 100644
--- a/Completion/Base/Completer/_expand
+++ b/Completion/Base/Completer/_expand
@@ -107,7 +107,13 @@ subd=("$exp[@]")
 integer done_quote
 local -a orig_exp=( $exp )
 if [[ "$force" = *g* ]] || zstyle -T ":completion:${curcontext}:" glob; then
-  eval 'exp=( ${~exp//(#b)\\([     \"'"\'"'
+  local -a exps igns
+  exps=($~exp)
+  zstyle -a ":completion:${curcontext}:all-expansions" ignored-patterns igns
+  if (($#igns)); then
+    eval "exps=(\${exps:#(${(j:|:)igns})})"
+  fi
+  eval 'exp=( ${exps//(#b)\\([     \"'"\'"'
 ])/$match[1]} ); exp=( ${(q)exp} )' 2>/dev/null && (( $#exp )) && done_quote=1
 fi
 # If the globbing failed, or we didn't try globbing, we'll do

このパッチと.zshrc上記のパッチでは、all-expansionsタグは実際に.DS_Store無視されますecho .* Tab

私はこのパッチを最小限にテストしました。他のものが壊れる可能性があります。一部の構成では機能しない場合があります。ファイル名を正しく引用しない可能性があります。

関連情報