Quali sono i passaggi per spostare tutti i tuoi dotfile nelle directory XDG?


18

Le specifiche della directory di base XDG forniscono un set di directory che è possibile utilizzare per archiviare i dati che un tempo andavano nella cosiddetta cartella / file dot nella cartella utente. Questo post ha lo scopo di aiutare gli utenti che desiderano utilizzare queste directory il più possibile.

Risposte:


17

In effetti, l'attuale breve risposta alla domanda è impossibile , poiché alcune applicazioni codificano il percorso. Tuttavia, molte applicazioni che non supportano specificamente le directory XDG consentono di impostare altre directory attraverso le variabili di ambiente. Qualche volta devi essere in grado di cambiare la configurazione dell'intero sistema, ad esempio con la shell, ma la maggior parte delle volte, dovresti essere in grado di eseguire il passaggio come utente senza privilegi.

Impostare la 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
'

Se si utilizzano più shell, ad esempio zsh per la shell interattiva, ma un'altra per gli script, è possibile che si desideri $XDG_CONFIG_HOME/profilearchiviare file che verranno generati nello script di inizializzazione della shell pertinente.

Impostazione delle variabili d'ambiente

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

Aggirare

SSH

SSH fornisce un modo per modificare il file di configurazione del client, ma - per quanto ho trovato - solo attraverso la riga di comando. Quindi una soluzione per invocare sempre i client con nessuna postazione di default non può essere:

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"

E ${XDG_CONFIG_HOME}/ssh/configdovresti contenere qualcosa come:

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

Cosa non funziona ancora

Sebbene GNUPGHOMEsia una variabile documentata, in Fedora 21 finirai con la creazione di una nuova ~/.gnupgdirectory quando avvii una nuova sessione.

Sebbene ICEauthoritysia una variabile documentata, in Fedora 21 finirai con la creazione di un nuovo cookie quando avvii una nuova sessione.

Il ~/.swtcontenuto del file dot dovrebbe probabilmente essere archiviato direttamente in ${XDG_DATA_HOME}, poiché entrambi hanno libdirectory. Non è stata trovata alcuna documentazione su come farlo, se possibile.

I prodotti Mozilla non supportano una variabile d'ambiente appropriata, consultare i prodotti Mozilla non consentono di utilizzare una directory di configurazione utente personalizzata e il supporto per le specifiche della directory di base XDG di Freedesktop.org .

Altre fonti utili


1
Quando si utilizza bash come shell interattiva non di accesso (normale utilizzo del terminale), il file / etc / profile non dovrebbe essere letto affatto? Le nostre definizioni non saranno impostate allora?
Hashken,

1
Secondo la manpage sul mio sistema, hai ragione. Ora quello che ti suggerirei è semplicemente testare, poiché potrebbe dipendere dalla configurazione predefinita del tuo sistema. Per favore, rispondi, grazie.
psicoslave,

1
Posso confermare che / etc / profile non viene letto per shell non di accesso. Ma se apri tmux il tuo profilo / etc / viene letto. Questo perché tmux apre tutte le sue shell come shell di login.
Hashken,

1
cose come i file della cronologia dovrebbero essere archiviati in$XDG_CACHE_HOME

1) Aggiungi: export XAUTHORITY="$XDG_CACHE_HOME/Xauthority"2) Cita le tue variabili! (vedi (1) per un esempio) 3) Per quanto mi riguarda bash, avevo bisogno di:export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"}
Tom Hale,

6

Consiglio di consultare la pagina wiki di Arch Linux per il supporto XDG Base Directory che viene continuamente aggiornato.

IDIOTA

Ho appena spostato il mio .gitconfiga XDG_CONFIG_HOMEsu OSX. Secondo la documentazione di git-config (link omesso a causa della reputazione).

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.

Ho impostato la variabile d'ambiente usando le istruzioni in Impostazione della variabile d'ambiente PATH a livello di sistema in Mavericks . Nota che dovrai creare XDG_CONFIG_HOME/git/configtu stesso il file e, se ~/.gitconfigesiste, avrà la precedenza.

VIM

Ho usato l'articolo di Tom Vincent del 2011 Vim rispetto a XDG e sembra funzionare. Non sono sicuro della risposta sopra; VIMDOTDIRnon sembra essere una cosa.


Nota: sto passando all'utilizzo di nixos.org che rende possibile controllare completamente tutte le configurazioni in modo elegante
Ben Creasy

1

Zsh fa un lavoro leggermente migliore rispetto a bash, permettendoti di disordinare la tua casa usando la $ZDOTDIRvariabile. Per spostare zsh di mezzo, è necessario aggiungere quanto segue al ~/.zshenvfile:

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

Se hai i privilegi di root, puoi invece aggiungerlo /etc/zsh/zshenved evitare la necessità di qualsiasi dotfile zsh nel tuo $ HOME. Da qui, tutti gli altri dotfile zsh possono essere spostati ~/.config/zsh, come .zshrc. Consiglio anche di aggiungere la vostra storia zsh alla $XDG_DATA_HOMEposizione: HISTFILE=$XDG_DATA_HOME/zsh/zsh_history.

Alcune app cercheranno le posizioni XDG per impostazione predefinita e potresti anche non rendertene conto perché hai ancora un dotfile legacy nella tua directory $ HOME. Git è un buon esempio di questo - se ne hai uno ~/.gitconfig, prova a spostarlo su ~/.config/git/config. Il mio preferito personale, Fish Shell , usa anche ~ / .config per impostazione predefinita.

Inoltre, controlla le altre tue app per la loro versione di una variabile $ HOME. Molti lo supportano XDG tramite una variabile:

  • Atomo: export ATOM_HOME=$XDG_CONFIG_HOME/atom
  • lpass: export LPASS_HOME=$XDG_CONFIG_HOME/lpass
  • rupa / z ne ha uno: export _Z_DATA=$XDG_DATA_HOME/z/z.txt

Ma c'è ancora un muro di vergogna XDG piuttosto esteso. Tmux è stato attivamente ostile a supportare il disordine di $ HOME. Lo stesso vale per il pylint . E Julia . E la lista continua.Arch mantiene una bella lista di supporto per XDG qui .

Onestamente, non riesco a capire la resistenza a sostenerlo. Gli utenti devono inviare in modo chiaro un messaggio chiaro che le app non dovrebbero essere in esecuzione su $ HOME. Non va più bene. Un sistema moderno utilizza centinaia di app che inquinano $ HOME, non decine come 20 anni fa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.