¿Cuáles son los pasos para mover todos sus archivos de puntos a directorios XDG?

18

La especificación del directorio base de XDG proporciona un conjunto de directorios que uno puede usar para almacenar datos que solían ir en los llamados archivos / directorio de puntos en la carpeta del usuario. Esta publicación tiene como objetivo ayudar a los usuarios que desean utilizar estos directorios tanto como sea posible.

psicoslave
fuente

Respuestas:

17

De hecho, la respuesta corta actual a la pregunta es que no puedes , ya que algunas aplicaciones codifican la ruta. Sin embargo, muchas aplicaciones que no admiten específicamente directorios XDG permiten configurar otros directorios a través de variables de entorno. En algún momento debe poder cambiar la configuración de todo el sistema, por ejemplo, con shell, pero la mayoría de las veces, debe poder realizar el paso como un usuario sin privilegios.

Poniendo tu caparazón

# 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 usa varios shell, por ejemplo zsh para shell interactivo, pero otro para scripting, es posible que desee $XDG_CONFIG_HOME/profilearchivar, que obtendrá en el script de inicialización de shell relevante.

Establecer variables de entorno

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

Solución alterna

SSH

SSH proporciona una forma de cambiar el archivo de configuración del cliente, pero, por lo que encontré, solo a través de la línea de comandos. Entonces, una solución para invocar siempre a los clientes con un emplazamiento no predeterminado puede ser:

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"

Y ${XDG_CONFIG_HOME}/ssh/configdebería contener algo como:

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

Lo que aún no funciona

Aunque GNUPGHOMEes una variable documentada, bajo Fedora 21 terminarás con la creación de un nuevo ~/.gnupgdirectorio cuando inicies una nueva sesión.

Aunque ICEauthorityes una variable documentada, bajo Fedora 21 terminará con la creación de una nueva cookie cuando inicie una nueva sesión.

El ~/.swtcontenido del archivo de puntos probablemente debería almacenarse directamente ${XDG_DATA_HOME}, ya que ambos tienen libdirectorios. No se encontró documentación sobre cómo hacerlo si es posible.

Los productos de Mozilla no admiten una variable de entorno adecuada; consulte los productos de Mozilla no permiten utilizar un directorio de configuración de usuario personalizado y Soporte para la especificación de directorio base XDG de Freedesktop.org .

Otras fuentes utiles

psicoslave
fuente
1
Al usar bash como shell interactivo sin inicio de sesión (uso normal de terminal), ¿no debería / etc / profile no leerse en absoluto? ¿No se establecerán nuestras definiciones entonces?
Hashken
1
Según la página de manual de mi sistema, tienes razón. Ahora lo que sugeriría es que simplemente pruebe, ya que puede depender de la configuración predeterminada de su sistema. Por favor retroalimente, gracias.
psychoslave
1
Puedo confirmar que / etc / profile no se lee para shells que no son de inicio de sesión. Pero, si abre tmux, se lee su / etc / profile. Esto se debe a que tmux abre todos sus shells como shells de inicio de sesión.
Hashken
1
cosas como archivos de historial deben almacenarse en$XDG_CACHE_HOME
1) Agregar: export XAUTHORITY="$XDG_CACHE_HOME/Xauthority"2) ¡Por favor, indique sus variables! (ver (1) para un ejemplo) 3) Para mi bash, necesitaba:export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"}
Tom Hale
6

Recomiendo consultar el soporte del Directorio base XDG de la página wiki de Arch Linux que se actualiza continuamente.

GIT

Me acabo de mudar a mi .gitconfiga XDG_CONFIG_HOMEen OSX. Según la documentación de git-config (enlace omitido debido a la reputación).

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.

Configuré la variable de entorno usando las instrucciones en Configuración de la variable de entorno PATH de todo el sistema en Mavericks . Tenga en cuenta que deberá crear el archivo XDG_CONFIG_HOME/git/configusted mismo y, si ~/.gitconfigexiste, tendrá prioridad.

EMPUJE

Utilicé el artículo de Tom Vincent de 2011, Vim respect XDG, y parece funcionar. No estoy seguro de la respuesta anterior; VIMDOTDIRno parece ser una cosa

Ben Creasy
fuente
Nota: Me estoy moviendo para usar nixos.org que hace posible controlar completamente toda la configuración de una manera elegante
Ben Creasy
1

Zsh hace un trabajo un poco mejor que bash, lo que le permite ordenar su casa usando la $ZDOTDIRvariable. Para mover zsh fuera del camino, debe agregar lo siguiente a su ~/.zshenvarchivo:

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

Si tiene privilegios de root, puede agregar esto /etc/zsh/zshenvy evitar la necesidad de cualquier archivo de puntos zsh en su $ HOME. Desde aquí, todos sus otros archivos de puntos zsh se pueden mover a ~/.config/zsh, como .zshrc. También se recomienda la adición de su historia zsh a la $XDG_DATA_HOMEubicación: HISTFILE=$XDG_DATA_HOME/zsh/zsh_history.

Algunas aplicaciones buscarán las ubicaciones XDG de manera predeterminada y es posible que ni siquiera se dé cuenta porque todavía tiene un archivo de puntos heredado en su directorio $ HOME. Git es un buen ejemplo de esto: si tiene un ~/.gitconfig, intente moverlo a ~/.config/git/config. Mi favorito personal, Fish Shell , también usa ~ / .config por defecto.

Además, verifique sus otras aplicaciones para ver su propia versión de una variable de $ HOME. Muchos lo admiten XDG a través de una variable:

  • Átomo: export ATOM_HOME=$XDG_CONFIG_HOME/atom
  • lpass: export LPASS_HOME=$XDG_CONFIG_HOME/lpass
  • rupa / z tiene uno: export _Z_DATA=$XDG_DATA_HOME/z/z.txt

Pero todavía hay un muro de vergüenza XDG bastante extenso. Tmux ha sido activamente hostil para apoyar la eliminación de su $ HOME. Lo mismo con pylint . Y Julia . Y la lista continúa. Arch mantiene una buena lista de soporte de XDG aquí .

Honestamente, no puedo entender la resistencia para apoyarlo. Los usuarios deben enviar claramente un mensaje claro de que las aplicaciones no deberían estar funcionando mal en su $ HOME. Ya no está bien. Un sistema moderno utiliza cientos de aplicaciones que contaminan $ HOME, no decenas como solía ser hace 20 años.

mattmc3
fuente