Jakie są kroki, aby przenieść wszystkie pliki dotfiles do katalogów XDG?

18

XDG Baza katalog Specyfikacja dostarczyć komplet jednym katalogu można stosować do przechowywania danych, które kiedyś pójść w tak zwane pliki punktów / katalogu w folderze użytkownika. Ten post ma pomóc użytkownikom, którzy chcą w jak największym stopniu korzystać z tych katalogów.

psychoslave
źródło

Odpowiedzi:

17

Rzeczywiście, obecna krótka odpowiedź na to pytanie jest niemożliwa , ponieważ niektóre aplikacje zakodowały ścieżkę. Niemniej jednak wiele aplikacji, które nie obsługują katalogów XDG, umożliwia ustawianie innych katalogów za pomocą zmiennych środowiskowych. Czasami musisz być w stanie zmienić konfigurację całego systemu, na przykład z powłoką, ale przez większość czasu powinieneś być w stanie wykonać ten krok jako użytkownik nieuprzywilejowany.

Ustawiam cię

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

Jeśli używasz kilku powłok, na przykład zsh dla powłoki interaktywnej, ale innej do tworzenia skryptów, możesz zechcieć utworzyć $XDG_CONFIG_HOME/profileplik, który uzyskasz w odpowiednim skrypcie inicjującym powłoki.

Ustawianie zmiennych środowiskowych

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

Obejść

SSH

SSH zapewnia sposób zmiany pliku konfiguracyjnego klienta, ale - o ile się dowiedziałem - tylko za pomocą wiersza poleceń. Tak więc jednym z rozwiązań, aby zawsze wywoływać klientów bez domyślnego położenia, może być:

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"

I ${XDG_CONFIG_HOME}/ssh/configpowinieneś zawierać coś takiego:

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

Co jeszcze nie działa

Chociaż GNUPGHOMEjest to udokumentowana zmienna, w Fedorze 21 skończysz z tworzeniem nowego ~/.gnupgkatalogu po uruchomieniu nowej sesji.

Chociaż ICEauthorityjest to udokumentowana zmienna, w Fedorze 21 skończysz z tworzeniem nowego pliku cookie po uruchomieniu nowej sesji.

Zawartość pliku kropkowego ~/.swtpowinna być prawdopodobnie przechowywana bezpośrednio ${XDG_DATA_HOME}, ponieważ oba mają libkatalogi. Nie znaleziono dokumentacji, jak to zrobić, jeśli jest to możliwe.

Produkty Mozilla nie obsługują odpowiedniej zmiennej środowiskowej, zobacz Produkty Mozilla nie zezwalają na korzystanie z niestandardowego katalogu konfiguracji użytkownika i wsparcie dla specyfikacji katalogu podstawowego Freedesktop.org XDG .

Inne przydatne źródła

psychoslave
źródło
1
Kiedy używasz bash jako interaktywnej powłoki niezalogowanej (normalne użycie terminala), czy w ogóle nie należy czytać / etc / profile? Czy zatem nasze definicje nie zostaną ustawione?
Hashken,
1
Według strony podręcznika w moim systemie masz rację. Sugeruję teraz, aby po prostu przetestować, ponieważ może to zależeć od domyślnej konfiguracji systemu. Proszę o informację zwrotną, dziękuję.
psychoslave
1
Mogę potwierdzić, że / etc / profile nie jest odczytywany dla powłok niezalogowanych. Ale jeśli otworzysz tmux, twój profil / etc / zostanie odczytany. Jest tak, ponieważ tmux otwiera wszystkie swoje powłoki jako powłoki logowania.
Hashken
1
rzeczy takie jak pliki historii powinny być przechowywane pod$XDG_CACHE_HOME
1) Dodaj: export XAUTHORITY="$XDG_CACHE_HOME/Xauthority"2) Podaj swoje zmienne! (patrz (1) przykład) 3) Dla mnie bashmusiałem:export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"}
Tom Hale
6

Polecam przejrzenie strony wiki Arch Linux XDG Base Directory, która jest stale aktualizowana.

GIT

I właśnie przeniesiony mój .gitconfigTO XDG_CONFIG_HOMEna OSX. Zgodnie z dokumentacją git-config (link pominięty z powodu reputacji).

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.

Ustawiam zmienną środowiskową, korzystając z instrukcji w Ustawianie systemowej zmiennej środowiskowej PATH w Mavericks . Pamiętaj, że musisz samodzielnie utworzyć plik, XDG_CONFIG_HOME/git/configa jeśli ~/.gitconfigistnieje, będzie miał pierwszeństwo.

WIGOR

Użyłem artykułu Tima Vincenta Vima z XDG i wydaje się, że działa. Nie jestem pewien co do powyższej odpowiedzi; VIMDOTDIRnie wydaje się być czymś.

Ben Creasy
źródło
Uwaga: przechodzę do korzystania z nixos.org, co pozwala całkowicie kontrolować całą konfigurację w elegancki sposób
Ben Creasy
1

Zsh wykonuje nieco lepszą pracę niż bash, pozwalając ci zaśmiecać dom za pomocą $ZDOTDIRzmiennej. Aby usunąć zsh z drogi, musisz dodać do ~/.zshenvpliku:

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

Jeśli masz uprawnienia roota, możesz dodać to zamiast tego /etc/zsh/zshenvi uniknąć potrzeby plików dot zsh w $ HOME. Odtąd wszystkie inne pliki zsh zsh mogą zostać przeniesione ~/.config/zsh, na przykład .zshrc. Ja również polecam dodawania zsh historię do $XDG_DATA_HOMElokalizacji: HISTFILE=$XDG_DATA_HOME/zsh/zsh_history.

Niektóre aplikacje domyślnie szukają lokalizacji XDG i możesz nawet nie zdawać sobie z tego sprawy, ponieważ nadal masz starszy plik kropkowy w katalogu $ HOME. Git jest dobrym tego przykładem - jeśli masz ~/.gitconfig, spróbuj przenieść go do ~/.config/git/config. Mój osobisty faworyt, Fish Shell , również domyślnie używa ~ / .config.

Sprawdź także w innych aplikacjach, czy mają własną wersję zmiennej $ HOME HOMEing. Wiele obsługuje XDG za pośrednictwem zmiennej:

  • Atom: export ATOM_HOME=$XDG_CONFIG_HOME/atom
  • lpass: export LPASS_HOME=$XDG_CONFIG_HOME/lpass
  • rupa / z ma jeden: export _Z_DATA=$XDG_DATA_HOME/z/z.txt

Ale wciąż jest dość obszerna ściana wstydu XDG. Tmux był aktywnie wrogo nastawiony do wspierania uporządkowania twojego $ HOME. To samo z pylintem . I Julia . Lista jest długa. Arch trzyma tutaj ładną listę bieżącą obsługi XDG .

Szczerze mówiąc, nie rozumiem oporu wobec wspierania tego. Użytkownicy muszą wyraźnie wysłać jasny komunikat, że aplikacje nie powinny działać z grubsza niż w ich $ HOME. To już nie jest w porządku. Nowoczesny system wykorzystuje setki aplikacji, które zanieczyszczają $ HOME, a nie dziesiątki, jak kiedyś 20 lat temu.

mattmc3
źródło