AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 693084
Accepted
iconoclast
iconoclast
Asked: 2022-03-06 15:36:12 +0800 CST2022-03-06 15:36:12 +0800 CST 2022-03-06 15:36:12 +0800 CST

如何让 zsh globbing 忽略 .DS_Store 之类的文件

  • 772

大多数时候,我喜欢(一方面)在 iTerm 的 BSD 变体上运行 zsh 的组合,但(另一方面)让 macOS 体验可用于不运行或不生产的应用程序感觉在终端中运行。

但让我发疯的一件事是.DS_StoremacOS 到处转储的可怕文件。

我可以配置 zsh 以便如果我键入(例如)nvim *tab,*扩展 而不包括我希望避免的任何文件?(这可能包括.DS_Store,Icon?以及我现在想不到的其他可能。)

我不是在问如何在现场构建一个排除某些文件的模式(示例here、here和here),而是如何让所有 glob 始终排除某些文件。

zsh wildcards
  • 1 1 个回答
  • 117 Views

1 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2022-03-08T12:55:07+08:002022-03-08T12:55:07+08:00

    dot_glob除了选项之外,您不能自定义 globbing 本身。这是 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命令,上面的代码片段定义了一个空的忽略列表,它会覆盖默认值。
    • 它们适用于命令行上的任何位置。
    • 它们适用于收集文件名(通过 tag_files或 tag _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.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.

    请注意,我只对这个补丁进行了最低限度的测试。它可能会破坏其他东西。它可能不适用于某些配置。它可能无法正确引用文件名。

    • 1

相关问题

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

  • mv *.cache.{js,woff} sub_folder - 作为 shell 命令工作,但不在 Makefile 内

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve