将所有点文件移至XDG目录的步骤是什么?


18

XDG基本目录规范提供了一组目录中的一个可用于所使用去在所谓的点文件/目录中的用户文件夹存储数据。这篇文章旨在帮助希望使用此目录的用户尽可能多地使用。

Answers:


17

确实,当前对该问题的简短回答是您不能,因为某些应用程序对路径进行了硬编码。但是,许多不专门支持XDG目录的应用程序都可以通过环境变量来设置其他目录。有时您需要能够更改系统范围的配置,例如使用Shell,但是大多数时候,您应该能够以非特权用户的身份执行该步骤。

设置你的外壳

# Setting bash to use $XDG_CONFIG_HOME/bash, defaults to ~/.config/bash
confdir=${XDG_CONFIG_HOME:-$HOME/.config}/bash

### Moving existing files
mkdir -p -- "$confdir"
for file in "$HOME"/.bash*; do
    dest=$confdir/$(basename "${file:1}") 
    mv -i -- "$file" "$dest" # don't overwrite without permission
done

### Sourcing and setting variables
sudo sh -c 'cat >>/etc/profile.d/bash_in_xdg_config_home.sh <<CONF
# Make bash follow the XDG_CONFIG_HOME convention
_confdir=\${XDG_CONFIG_HOME:-\$HOME/.config}/bash
if [ -d "$_confdir" ] &&  [ "\$0" = "bash" ]
then
    . "\$_confdir"/bash_profile
    . "\$_confdir"/bashrc
    HISTFILE=\$_confdir/bash_history
fi
unset _confdir
CONF
'

sudo sh -c 'cat >>/etc/bash.bash_logout <<CONF
if [ -s "\${XDG_CONFIG_HOME:-\$HOME/.config}/bash/bash_logout" ]
then
    . "\${XDG_CONFIG_HOME:-\$HOME/.config}/bash/bash_logout"
fi
CONF
'

# Setting zsh
## System wide configuration (using xdg directories)
sudo sh -c 'cat >>/etc/zshenv <<CONF
if [[ -d "\${XDG_CONFIG_HOME:-\$HOME/.config}"/zsh ]]
then
        export ZDOTDIR=\${XDG_CONFIG_HOME:-\$HOME/.config}/zsh
fi
CONF
'

如果您使用多个外壳程序(例如,zsh用于交互式外壳程序,而另一个用于脚本编写),则可能需要$XDG_CONFIG_HOME/profile归档,将在相关的外壳程序初始化脚本中提供源代码。

设置环境变量

# bazaar
export BZRPATH=$XDG_CONFIG_HOME/bazaar
export BZR_PLUGIN_PATH=$XDG_DATA_HOME/bazaar
export BZR_HOME=$XDG_CACHE_HOME/bazaar

# gnupg
export GNUPGHOME=${XDG_CONFIG_HOME}/gnupg

# ICEauthority
export ICEAUTHORITY=${XDG_CACHE_HOME}/ICEauthority

#  less
export LESSHISTFILE="${XDG_CONFIG_HOME}/less/history"
export LESSKEY="${XDG_CONFIG_HOME}/less/keys"



# mplayer
export MPLAYER_HOME=$XDG_CONFIG_HOME/mplayer

# subversion
export SUBVERSION_HOME=$XDG_CONFIG_HOME/subversion


# vim
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'
export VIMDOTDIR="$XDG_CONFIG_HOME/vim"

解决

SSH协议

SSH确实提供了一种更改客户端配置文件的方法,但据我所知,它只能通过命令行。因此,始终使用无默认设置来调用客户端的一种解决方案可能是:

if [ -s "${XDG_CONFIG_HOME}/ssh/config" ]
then
    SSH_CONFIG="-F ${XDG_CONFIG_HOME}/ssh/config"
fi
if [ -s "${XDG_CONFIG_HOME}/ssh/id_dsa" ]
then
    SSH_ID="-i ${XDG_CONFIG_HOME}/ssh/id_dsa"
fi

alias ssh="ssh $SSH_CONFIG $SSH_ID "
alias ssh-copy-id="ssh-copy-id $SSH_ID"

并且您${XDG_CONFIG_HOME}/ssh/config应该包含以下内容:

Host *
    IdentityFile /home/user/.config/ssh/id_dsa

什么还行不通

尽管这GNUPGHOME是一个已记录的变量,但是在Fedora 21下~/.gnupg,启动新会话时最终会创建一个新目录。

尽管这ICEauthority是有据可查的变量,但是在Fedora 21下,启动新会话时最终会创建一个新cookie。

点文件的~/.swt内容可能应该直接存储到中${XDG_DATA_HOME},因为两者都有lib目录。找不到有关如何执行此操作的文档。

Mozilla产品不支持适当的环境变量,请参见Mozilla产品不允许使用自定义用户配置目录,以及对Freedesktop.org XDG基本目录规范的支持

其他有用的资料


1
当使用bash作为交互式非登录外壳程序(正常使用终端)时,是否根本不读取/ etc / profile?那我们就不设置定义吗?
哈什肯

1
根据我系统上的手册,您是正确的。现在,我建议您只是进行测试,因为这可能取决于您的系统默认配置。请反馈,谢谢。
心理奴隶制

1
我可以确认非登录外壳程序未读取/ etc / profile。但是,如果打开tmux,则会读取/ etc / profile。这是因为tmux将其所有外壳作为登录外壳打开。
哈什肯

1
诸如历史记录文件之类的东西应存储在$XDG_CACHE_HOME

1)添加:export XAUTHORITY="$XDG_CACHE_HOME/Xauthority"2)请引用您的变量!(有关示例,请参见(1))3)对于我而言bash,我需要:export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"}
汤姆·黑尔

6

我建议咨询Arch Linux Wiki页面XDG基本目录支持,该支持会不断更新。

GIT

我刚刚将其转移.gitconfigXDG_CONFIG_HOMEOSX上。根据git-config文档(由于信誉而省略链接)。

Second user-specific configuration file. If $XDG_CONFIG_HOME is not set or
empty, $HOME/.config/git/config will be used. Any single-valued variable 
set in this file will be overwritten by whatever is in ~/.gitconfig. It is
a good idea not to create this file if you sometimes use older versions of
Git, as support for this file was added fairly recently.

我使用在Mavericks设置系统范围的PATH环境变量中的说明来设置环境变量。请注意,您将需要自己创建文件XDG_CONFIG_HOME/git/config,如果~/.gitconfig存在该文件将具有优先权。

VIM

我使用了汤姆·文森特(Tom Vincent)在2011年发表的文章Vim尊重XDG,它似乎有用。我不确定上述答案;VIMDOTDIR似乎不是一回事。


注意:我将使用nixos.org,它可以优雅地完全控制所有配置
Ben Creasy

1

Zsh比bash的工作要好一些,它使您可以使用$ZDOTDIR变量来整理房屋。要移开zsh,您需要在~/.zshenv文件中添加以下内容:

# ~/.zshenv contents
# this is the bare bones setup to move everything to XDG dir
ZDOTDIR=$HOME/.config/zsh

如果您具有root特权,则可以将此/etc/zsh/zshenv特权添加到其中,并避免$ HOME中需要任何zsh dotfile。从这里,所有其他zsh点文件都可以移至~/.config/zsh,如.zshrc。我还建议将您的zsh历史记录添加到以下$XDG_DATA_HOME位置:HISTFILE=$XDG_DATA_HOME/zsh/zsh_history

某些应用程序默认会查找XDG位置,您可能甚至没有意识到,因为您在$ HOME目录中仍然有旧的点文件。Git是一个很好的例子-如果您有~/.gitconfig,请尝试将其移至~/.config/git/config。我个人最喜欢的Fish Shell默认也使用〜/ .config。

另外,请检查其他应用程序是否具有自己的re- $ HOME-ing变量版本。许多人通过变量支持XDG:

  • 原子: export ATOM_HOME=$XDG_CONFIG_HOME/atom
  • lpass: export LPASS_HOME=$XDG_CONFIG_HOME/lpass
  • rupa / z具有以下一项: export _Z_DATA=$XDG_DATA_HOME/z/z.txt

但是,仍然有相当多的XDG耻辱墙。Tmux一直对支持将您的$ HOME弄乱表示敌意与pylint相同还有朱莉娅。而这样的例子不胜枚举。Arch在这里保留了很好的XDG支持列表

老实说,我无法理解支持它的阻力。用户需要明确发送明确的消息,即应用程序不应在其$ HOME上运行。不好了。现代系统使用数百种污染$ HOME的应用程序,而不是二十年前的几十种。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.