![zsh:如何更改Mac终端中所有不可见文件名的颜色?](https://linux22.com/image/219104/zsh%EF%BC%9A%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9Mac%E7%BB%88%E7%AB%AF%E4%B8%AD%E6%89%80%E6%9C%89%E4%B8%8D%E5%8F%AF%E8%A7%81%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E9%A2%9C%E8%89%B2%EF%BC%9F.png)
我正在使用 Mac Silicon 和文图拉苹果系统。在终端应用程序中,所有文件名都具有相同的颜色。请注意,默认 shell 是桀骜在文图拉,这是我想使用的。目前,我的.zshrc配置文件具有以下内容(因此目录在终端中都以某种颜色显示。我不想更改此内容):
PROMPT='%U%B%F{red}%n%u: ~%f%b'
alias ls="ls -G"
alias ll="ls -lG"
-G
BSD 中的选项(ls
也在 macOS 上使用)打开彩色输出。
我想在其中添加一些内容来更改用于显示隐藏文件(名称以 a 开头的文件.
)的颜色,当使用这样ls
的选项时-A
会显示它们。我希望所有隐藏文件(但不是目录)在终端中以鲜艳的红色显示(例如洋红色)。请注意,我是终端命令的菜鸟(我只知道一些基本的 Unix 命令),所以我需要一些简单的东西,没有花哨的技巧。
那么我应该怎么做呢?我应该将哪些命令添加到上面的 .zshrc 文件中?
答案1
该ls
命令是唯一对其打印内容的外观负责的。ls
运行时,zsh
只需等待ls
退出即可。 (不同的颜色zsh
选项涉及zsh
打印内容)。
在 MacOS 上,设置不同颜色的方法ls
如下:https://www.cyberciti.biz/faq/apple-mac-osx-terminal-color-ls-output-option/请参阅“了解 LSCOLORS 值”(man ls
还显示如何处理颜色)。
不幸的是,您无法处理文件/目录名称,但只有文件类型(目录、套接字、符号链接等)会根据您提供的调色板更改颜色。
一种解决方案是使用其他ls
命令,但 GNU 中的命令似乎不处理.*
模式(关于颜色处理)。仅有的*.extension
。类似的东西LS_COLORS='.*=01;33' ls -a
表示无法识别的前缀。 (根据http://www.bigsoft.co.uk/blog/2008/04/11/configuring-ls_colors)
答案2
请注意,虽然 GNUls
着色只能基于文件元数据或固定后缀完成($LS_COLORS
通常通过实用程序的帮助进行设置),dircolors
zsh补全着色可配置基于任何模式。
它ls
通过.$LS_COLORS
=pattern=attributes
所以:
# set LS_COLORS for GNU ls
eval "$(dircolors)"
# use same colouring for completions, but also specify magenta for hidden files
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} '=.*=35'
或者,如果您没有 GNUls
和dircolors
,只需:
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} '=.*=35'
(其余部分使用与 GNU 类似的默认颜色ls
)。
这是使用更现代的列表颜色 zstyle,但语法与 ) 相同$ZLS_COLORS
。
然后假设您已通过compinstall
或手动启用了彩色补全,您将看到洋红色的隐藏文件。
您可能还需要启用globdots
akadotglob
选项(它会影响所有 glob 扩展),或者添加:
zstyle ':completion:*' file-patterns '*(D)'
默认情况下,隐藏文件包含在完成列表中。
至少~/.zshrc
要测试如下:
zstyle ':completion:*' menu select=2
zstyle ':completion:*:default' list-colors '=.*=35'
zstyle ':completion:*' file-patterns '*(D)'
autoload -Uz compinit
compinit -i
但同样,最好是根据compinstall
您的口味调整完成系统,并分别添加这两个list-colors
和file-patterns
样式。
无论如何,这仅适用于 zsh 完成列表,不会影响ls
输出。