Quelles sont les étapes pour déplacer tous vos fichiers dot dans les répertoires XDG?

18

La spécification de répertoire de base XDG fournit un ensemble de répertoires que l'on peut utiliser pour stocker les données qui se trouvaient dans ce que l'on appelle les fichiers / répertoires de points dans le dossier utilisateur. Ce message vise à aider les utilisateurs qui souhaitent utiliser ces répertoires autant que possible.

psychoslave
la source

Réponses:

17

En effet, la réponse courte actuelle à la question est que vous ne pouvez pas , car certaines applications codent en dur le chemin. Néanmoins, de nombreuses applications qui ne prennent pas spécifiquement en charge les répertoires XDG permettent de définir d'autres répertoires via des variables d'environnement. Vous devez parfois modifier la configuration à l'échelle du système, par exemple avec le shell, mais la plupart du temps, vous devriez pouvoir effectuer l'étape en tant qu'utilisateur non privilégié.

Mettre sa coquille

# 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
'

Si vous utilisez plusieurs shell, par exemple zsh pour le shell interactif, mais un autre pour l'écriture de scripts, vous voudrez peut-être $XDG_CONFIG_HOME/profiledéposer, que vous allez trouver dans le script d'initialisation du shell approprié.

Définition des variables d'environnement

# 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"

Solution de contournement

SSH

SSH fournit un moyen de modifier le fichier de configuration client, mais - autant que je sache - uniquement via la ligne de commande. Ainsi, une solution pour toujours invoquer les clients avec un emplacement par défaut non peut être:

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"

Et votre ${XDG_CONFIG_HOME}/ssh/configdevrait contenir quelque chose comme:

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

Ce qui ne fonctionne pas encore

Bien qu'il s'agisse d' GNUPGHOMEune variable documentée, sous Fedora 21, vous vous retrouverez avec la création d'un nouveau ~/.gnupgrépertoire lorsque vous lancerez une nouvelle session.

Bien qu'il s'agisse d' ICEauthorityune variable documentée, sous Fedora 21, vous vous retrouverez avec la création d'un nouveau cookie lorsque vous lancerez une nouvelle session.

Le ~/.swtcontenu du fichier dot devrait probablement être stocké directement dans ${XDG_DATA_HOME}, car les deux ont des librépertoires. Aucune documentation n'a été trouvée sur la façon de procéder si cela est possible.

Les produits Mozilla ne prennent pas en charge une variable d'environnement appropriée, voir Les produits Mozilla ne permettent pas d'utiliser un répertoire de configuration utilisateur personnalisé et la prise en charge de la spécification de répertoire de base Freedesktop.org XDG .

Autres sources utiles

psychoslave
la source
1
Lors de l'utilisation de bash comme shell interactif sans connexion (utilisation normale du terminal), / etc / profile ne devrait-il pas être lu du tout? Nos définitions ne seront-elles pas alors définies?
Hashken
1
Selon la page de manuel de mon système, vous avez raison. Maintenant, ce que je vous suggère est de simplement tester, car cela peut dépendre de la configuration par défaut de votre système. Merci de donner votre feed-back, merci.
psychoslave
1
Je peux confirmer que / etc / profile n'est pas lu pour les shells sans connexion. Mais, si vous ouvrez tmux, votre profil / etc / est lu. En effet, tmux ouvre tous ses shells en tant que shells de connexion.
Hashken
1
des choses comme les fichiers d'historique doivent être stockées sous$XDG_CACHE_HOME
1) Ajoutez: export XAUTHORITY="$XDG_CACHE_HOME/Xauthority"2) Veuillez indiquer vos variables! (voir (1) pour un exemple) 3) Pour moi bash, je devais:export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"}
Tom Hale
6

Je recommande de consulter la page wiki d'Arch Linux Support du répertoire de base XDG qui est constamment mis à jour.

GIT

Je viens de déménager mon .gitconfigà XDG_CONFIG_HOMEOSX. Selon la documentation de git-config (lien omis en raison de la réputation).

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.

J'ai défini la variable d'environnement à l'aide des instructions de la section Définition de la variable d'environnement PATH à l'échelle du système dans Mavericks . Notez que vous devrez créer le fichier XDG_CONFIG_HOME/git/configvous-même et s'il ~/.gitconfigexiste, il aura priorité.

VIGUEUR

J'ai utilisé l'article 2011 de Tom Vincent Vim respect XDG et il semble fonctionner. Je ne suis pas sûr de la réponse ci-dessus; VIMDOTDIRne semble pas être une chose.

Ben Creasy
la source
Remarque: je passe à l'utilisation de nixos.org qui permet de contrôler complètement toutes les configurations de manière élégante
Ben Creasy
1

Zsh fait un travail légèrement meilleur que bash vous permettant de désencombrer votre maison en utilisant la $ZDOTDIRvariable. Pour éloigner zsh, vous devez ajouter ce qui suit à votre ~/.zshenvfichier:

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

Si vous avez des privilèges root, vous pouvez les ajouter à la place /etc/zsh/zshenvet éviter d'avoir besoin de tout fichier dot zsh dans votre $ HOME. À partir d'ici, tous vos autres fichiers dot zsh peuvent être déplacés vers ~/.config/zsh, comme .zshrc. Je recommande également d' ajouter votre histoire zsh à l' $XDG_DATA_HOMEemplacement: HISTFILE=$XDG_DATA_HOME/zsh/zsh_history.

Certaines applications rechercheront les emplacements XDG par défaut et vous ne le réaliserez peut-être même pas car vous avez toujours un fichier dot hérité dans votre répertoire $ HOME. Git en est un bon exemple - si vous en avez un ~/.gitconfig, essayez de le déplacer vers ~/.config/git/config. Mon préféré, Fish Shell , utilise également par défaut ~ / .config.

Vérifiez également vos autres applications pour leur propre version d'une variable re-HOME-ing. Beaucoup le supportent XDG via une variable:

  • Atome: export ATOM_HOME=$XDG_CONFIG_HOME/atom
  • lpass: export LPASS_HOME=$XDG_CONFIG_HOME/lpass
  • rupa / z en a un: export _Z_DATA=$XDG_DATA_HOME/z/z.txt

Mais il y a encore un mur de honte XDG assez étendu. Tmux a été activement hostile au soutien du désencombrement de votre $ HOME. Idem avec pylint . Et Julia . Et la liste continue. Arch conserve ici une belle liste de support XDG .

Honnêtement, je ne comprends pas la résistance à le soutenir. Les utilisateurs doivent clairement envoyer un message clair que les applications ne doivent pas exécuter de manière approximative leur $ HOME. Ce n'est plus correct. Un système moderne utilise des centaines d'applications qui polluent $ HOME, et non des dizaines comme il y a 20 ans.

mattmc3
la source