대부분의 경우 iTerm의 BSD 변형에서 zsh를 실행하는 것을 좋아하지만 (다른 한편으로는) 실행되지 않거나 실행하는 것만큼 의미가 없는 앱에 macOS 경험을 제공합니다. 터미널.
하지만 나를 미치게 만드는 한 가지 사실은 .DS_Store
macOS가 여기저기에 버려두는 끔찍한 파일들입니다.
예를 들어 를 입력하면 피하고 싶은 파일을 포함하지 않고 확장 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
사용해야 합니다 ._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.
저는 이 패치를 최소한으로만 테스트했습니다. 다른 것들이 망가질 수도 있습니다. 일부 구성에서는 작동하지 않을 수 있습니다. 파일 이름을 올바르게 인용하지 않을 수 있습니다.