ほとんどの場合、iTermのBSDバリアントでzshを実行するのが好きですが(一方では)実行されていない、または実行するのと同じくらい意味のないアプリにmacOSエクスペリエンスを提供します。ターミナル。
しかし、私を狂わせる1つの事実は、.DS_Store
macOSがあちこちに捨てる恐ろしいファイルです。
たとえば、と入力すると、避けたいファイルを含まずに拡張するnvim *
tabようにzshを設定できますか?*
(ここには、、.DS_Store
およびIcon?
現在としては考えられないその他の可能性が含まれることがあります。)
特定のファイルを除外するパターンをインスタントでどのように構築するかを尋ねるものではありません(例ここ、こことここ)しかし、すべてのグローバルオブジェクトが常に特定のファイルを除外するようにするにはどうすればよいですか?
答え1
このオプション以外では、ワイルドカード自体をカスタマイズすることはできませんdot_glob
。これはATT kshとbashにはありますがzshにはないいくつかの機能の1つです。だからecho *
常に表示されますIcon1
。
完了するとパターンは無視できますが、ワイルドカードを含めると状況が複雑になります。簡単なものから始めましょう。つまり、ワイルドカードを使わない完成です。次の.zshrc
ファイルの場合、一致するものがないと完了情報は提供されません.DS_Store
。Icon1
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
する必要があります。_expand
expansions
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
.zshrc
echo .*
Tab.DOH
.zshrc
.DOH .DS_Store .zshrc
.*
ignored-patterns
expansions
.DS_Store
all-expansions
ignored-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。
私はこのパッチを最小限にテストしました。他のものが壊れる可能性があります。一部の構成では機能しない場合があります。ファイル名を正しく引用しない可能性があります。