Який крок перемістити всі ваші dotfiles у каталоги XDG?


18

Специфікація базового каталогу XDG надає набір каталогів, який може використовуватися для зберігання даних, які використовувались для введення так званих точкових файлів / каталогів у папку користувача. Ця публікація має на меті допомогти користувачам, які бажають максимально використовувати ці каталоги.

Відповіді:


17

Дійсно, нинішню коротку відповідь на це питання ви не можете , оскільки деякі програми жорстко кодують шлях. Тим не менш, багато додатків, які спеціально не підтримують каталоги XDG, дозволяють встановлювати інші каталоги через змінні середовища. Деякий час потрібно мати змогу змінити конфігурацію системи, наприклад, з оболонкою, але більшу частину часу ви повинні мати можливість виконувати крок як непривілейований користувач.

Налаштування оболонки

# 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 під час запуску нового сеансу.

Вміст dotfile, ~/.swtймовірно, повинен зберігатися безпосередньо ${XDG_DATA_HOME}, оскільки обидва мають libкаталоги. Не знайдено жодної документації, як це зробити, якщо це можливо.

Продукти Mozilla не підтримують відповідну змінну середовища, див. Продукти Mozilla не дозволяють використовувати спеціальний каталог конфігурації користувача та підтримку специфікації базового каталогу Freedesktop.org XDG .

Інші корисні джерела


1
Якщо ви використовуєте bash як інтерактивну оболонку без входу (звичайне використання терміналу), чи не слід / etc / profile взагалі не читати? Чи не будуть тоді встановлені наші визначення?
Хашкен

1
Відповідно до сторінки сторінки в моїй системі, ви праві. Тепер я б запропонував вам просто протестувати, оскільки це може залежати від конфігурації системи за замовчуванням. Будь ласка, поверніть, дякую.
психослов

1
Я можу підтвердити, що / etc / profile не читається для оболонок без входу. Але, якщо ви відкриєте tmux, ваш / etc / профіль читається. Це тому, що 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 XDG Base Directory, яка постійно оновлюється.

GIT

Я просто переїхав мій .gitconfigTo XDG_CONFIG_HOMEна OSX. Відповідно до документації 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.

Я встановлюю змінну середовища, використовуючи інструкції в Налаштування загальносистемної змінної середовища PATH в Mavericks . Зауважте, що вам потрібно буде створити файл XDG_CONFIG_HOME/git/configсамостійно, і якщо ~/.gitconfigвін існує, він матиме перевагу.

VIM

Я використав статтю Тома Вінсента з Vim 2011 поваги до XDG і, здається, працює. Я не впевнений у наведеній відповіді; VIMDOTDIRздається, це не річ.


Примітка: я переходжу до використання nixos.org, що дає можливість повністю контролювати всю конфігурацію на елегантний спосіб
Бен Крізі

1

Zsh виконує дещо кращу роботу, ніж баш, дозволяючи вам знеструмити свій будинок за допомогою $ZDOTDIRзмінної. Щоб перемістити zsh з шляху, вам потрібно додати у ~/.zshenvфайл наступне :

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

Якщо у вас є кореневі привілеї, ви можете замість цього додати це /etc/zsh/zshenvта уникнути необхідності будь-яких zsh-точок у вашому $ HOME. Звідси всі ваші інші zsh точкові файли можна перемістити ~/.config/zsh, як .zshrc. Я також рекомендую додати свою історію ЗШ в $XDG_DATA_HOMEмісці: HISTFILE=$XDG_DATA_HOME/zsh/zsh_history.

Деякі програми за замовчуванням шукатимуть місця XDG, і ви можете навіть не усвідомлювати цього, оскільки у вашому каталозі $ HOME у вас є застарілий dotfile. Git - хороший приклад цього - якщо у вас є ~/.gitconfig, спробуйте перемістити його ~/.config/git/config. Мій особистий фаворит, Fish Shell , також використовує ~ / .config за замовчуванням.

Також перевірте свої інші додатки на їх власну версію нової змінної $ HOME. Багато хто підтримує його XDG через змінну:

  • Atom: 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. Те саме з пілінт . І Юлія . І список продовжується. Arch зберігає тут хороший список підтримки XDG .

Чесно кажучи, я не можу зрозуміти опір його підтримці. Користувачам потрібно чітко надіслати чітке повідомлення про те, що програми не повинні працювати просто над $ HOME. Це вже не нормально. Сучасна система використовує сотні програм, які забруднюють $ HOME, а не десятки, як це було 20 років тому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.