如何在$XDG_CONFIG_HOME中搜索zsh配置

11

为了让我的~更加整洁,我想将尽可能多的用户配置文件移动到$XDG_CONFIG_HOME中,默认情况下是~/.config。因此,我想把所有的zsh用户文件存储在$XDG_CONFIG_HOME/zsh/中。目前已经做到了这一点:

% ls $XDG_CONFIG_HOME/zsh/
histfile  zsh_cache zshrc

简单,您只需要填写您的~/.zshrc文件。现在最棘手的部分似乎是让zsh直接读取$XDG_CONFIG_HOME/zsh/zshrc,而不是从~/.zshrc中进行源代码引用。您将如何处理?

4个回答

13

你可以编辑/etc/zsh/zshenv文件来设置$XDG_CONFIG_HOME目录和$ZDOTDIR。但是这需要对这些文件具有写入权限。

因此,假设在zsh读取时定义了$HOME(我不知道是否符合情况),你可以添加以下内容到/etc/zsh/zshenv

if [[ -z "$XDG_CONFIG_HOME" ]]
then
        export XDG_CONFIG_HOME="$HOME/.config/"
fi

if [[ -d "$XDG_CONFIG_HOME/zsh" ]]
then
        export ZDOTDIR="$XDG_CONFIG_HOME/zsh/"
fi

2
请注意,位于$XDG_CONFIG_HOME/zsh/中的文件必须以前导点命名,例如.zshrc,这样zsh才能自动读取它们。我不知道zsh是否可以使用变量(如$ZSHRC)来更改此设置。 - psychoslave

8

最好不要在保存某个路径的变量末尾添加/

例如,$XDG_CONFIG_HOME/zsh翻译成"$HOME/.config//zsh",因为XDG_CONFIG_HOME/结尾,所以/会重复出现。

因此,我认为你的答案应该是 -

if [[ -z "$XDG_CONFIG_HOME" ]]
then
        export XDG_CONFIG_HOME="$HOME/.config"
fi

if [[ -d "$XDG_CONFIG_HOME/zsh" ]]
then
        export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
fi

然而,zshbash也是如此)会自动将一组连续的正斜杠替换为一个。所以$HOME/.config//zsh并不完全是错误的。 - nomad
你能提供任何证据支持你的说法,即如果是目录,则在变量末尾加上斜杠是一种不好的做法吗?对我来说,这表明路径是一个目录而不是文件,并且向其他程序员(包括我自己)发出信号总是件好事。我在POSIX中阅读了4.11中的路径名解析,它只简要提到了尾随斜杠,没有提到如何存储这些变量。尽管如此,在3.266(路径名)中明确指出,尾随反斜杠是可选的。 - mazunki

4
使用${HOME}/.zshenv来初始化环境的psychoslave答案的变体。不需要root访问权限。
export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:=${HOME}/.config}
export ZDOTDIR=${ZDOTDIR:=${XDG_CONFIG_HOME}/zsh}
source $ZDOTDIR/.zshenv

关于这个话题,可以查看 zsh-users邮件列表中的这个讨论

您可能想要考虑将历史记录保存在XDG_DATA_HOME中。您可以在XDG基础目录规范中找到具体规定。


谢谢。但是这并不符合从“~”目录中删除所有配置文件的方向。 :( - psychoslave

0

谢谢您提供的链接,我认为结合在/etc/zsh/编辑文件,这应该能解决问题。 - psychoslave
但它确实消除了在维护各种机器上的配置时编辑根目录 /etc 文件的需要,您的 ~/.zshenv 可以简单地是指向 Dropbox 同步文件的符号链接。 - RichieHH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接