zsh globbing이 .DS_Store와 같은 파일을 무시하도록 만드는 방법

zsh globbing이 .DS_Store와 같은 파일을 무시하도록 만드는 방법

대부분의 경우 iTerm의 BSD 변형에서 zsh를 실행하는 것을 좋아하지만 (다른 한편으로는) 실행되지 않거나 실행하는 것만큼 의미가 없는 앱에 macOS 경험을 제공합니다. 터미널.

하지만 나를 미치게 만드는 한 가지 사실은 .DS_StoremacOS가 여기저기에 버려두는 끔찍한 파일들입니다.

예를 들어 를 입력하면 피하고 싶은 파일을 포함하지 않고 확장 nvim *tab되도록 zsh를 구성할 수 있습니까? *(여기에는 .DS_Store, Icon?, 및 현재로서는 생각할 수 없는 기타 가능성이 포함될 수 있습니다.)

특정 파일을 제외하는 패턴을 즉석에서 어떻게 구축하는지 묻는 것이 아닙니다(예제여기,여기, 그리고여기) 그러나 모든 전역 개체가 항상 특정 파일을 제외하도록 하려면 어떻게 해야 합니까?

답변1

이 옵션 외에는 와일드카드 자체를 사용자 정의할 수 없습니다 dot_glob. 이는 ATT ksh 및 bash에는 있지만 zsh에는 없는 몇 가지 기능 중 하나입니다. 그래서 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사용해야 합니다 ._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.

저는 이 패치를 최소한으로만 테스트했습니다. 다른 것들이 망가질 수도 있습니다. 일부 구성에서는 작동하지 않을 수 있습니다. 파일 이름을 올바르게 인용하지 않을 수 있습니다.

관련 정보