Saltar al contenido principal

Dotfiles: La Gestión Perfecta de tus Configuraciones 🏗️

Los dotfiles son el alma de tu entorno de desarrollo. Aprende a gestionarlos como un profesional para tener un setup portable, versionado y compartible.

🎯 ¿Qué son los dotfiles?

Definición

Los dotfiles son archivos de configuración del sistema que empiezan con punto (.) y normalmente están ocultos. Incluyen:

  • .vimrc - Configuración de Vim
  • .tmux.conf - Configuración de Tmux
  • .bashrc/.zshrc - Configuración de shell
  • .gitconfig - Configuración de Git

Por qué son importantes

  • Portabilidad: Lleva tu entorno a cualquier máquina
  • Versionado: Histórico de cambios en tus configuraciones
  • Backup: Nunca pierdas tus configuraciones
  • Compartir: Aprende de otros y comparte conocimiento

🏗️ Estructura de dotfiles

Organización recomendada

~/dotfiles/
├── README.md
├── install.sh
├── Makefile
├── vim/
│ ├── vimrc
│ ├── plugins.vim
│ └── mappings.vim
├── tmux/
│ └── tmux.conf
├── shell/
│ ├── bashrc
│ ├── zshrc
│ ├── aliases
│ └── exports
├── git/
│ └── gitconfig
├── scripts/
│ ├── setup.sh
│ ├── update.sh
│ └── backup.sh
└── config/
├── alacritty/
├── kitty/
└── i3/

Archivo principal: .vimrc modular

" ~/.dotfiles/vim/vimrc
" Configuración principal de Vim

" Cargar configuraciones modulares
source ~/.dotfiles/vim/plugins.vim
source ~/.dotfiles/vim/mappings.vim
source ~/.dotfiles/vim/settings.vim

" Configuración específica por SO
if has('macunix')
source ~/.dotfiles/vim/macos.vim
elseif has('unix')
source ~/.dotfiles/vim/linux.vim
endif

" Configuración local opcional
if filereadable(expand('~/.vimrc.local'))
source ~/.vimrc.local
endif

Configuración modular: plugins.vim

" ~/.dotfiles/vim/plugins.vim
" Gestión de plugins

call plug#begin('~/.vim/plugged')

" Core plugins
Plug 'tpope/vim-sensible'
Plug 'tpope/vim-surround'
Plug 'tpope/vim-commentary'

" File management
Plug 'preservim/nerdtree'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'mileszs/ack.vim'

" Git integration
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'

" Visual enhancements
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'morhetz/gruvbox'

" Tmux integration
if exists('$TMUX')
Plug 'christoomey/vim-tmux-navigator'
endif

" Language specific
if executable('node')
Plug 'pangloss/vim-javascript'
Plug 'mxw/vim-jsx'
endif

if executable('python')
Plug 'vim-scripts/indentpython.vim'
Plug 'nvie/vim-flake8'
endif

call plug#end()

⚙️ Scripts de instalación automatizados

Script principal: install.sh

#!/bin/bash
# ~/.dotfiles/install.sh

set -e

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Funciones auxiliares
info() {
echo -e "${GREEN}[INFO]${NC} $1"
}

warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}

error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}

# Detectar OS
detect_os() {
if [[ "$OSTYPE" == "darwin"* ]]; then
echo "macos"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo "linux"
else
echo "unknown"
fi
}

# Instalar dependencias
install_dependencies() {
local os=$(detect_os)

info "Installing dependencies for $os..."

case $os in
"macos")
# Homebrew
if ! command -v brew &> /dev/null; then
info "Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi

brew install vim tmux git curl wget
;;
"linux")
# Detect package manager
if command -v apt &> /dev/null; then
sudo apt update
sudo apt install -y vim tmux git curl wget build-essential
elif command -v yum &> /dev/null; then
sudo yum install -y vim tmux git curl wget
else
error "Unsupported package manager"
fi
;;
*)
error "Unsupported operating system"
;;
esac
}

# Crear symlinks
create_symlinks() {
info "Creating symlinks..."

# Backup existing files
backup_dir="$HOME/.dotfiles-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup_dir"

# List of dotfiles to symlink
declare -A dotfiles=(
["vim/vimrc"]="$HOME/.vimrc"
["tmux/tmux.conf"]="$HOME/.tmux.conf"
["git/gitconfig"]="$HOME/.gitconfig"
["shell/bashrc"]="$HOME/.bashrc"
["shell/zshrc"]="$HOME/.zshrc"
["shell/aliases"]="$HOME/.aliases"
)

for source in "${!dotfiles[@]}"; do
target="${dotfiles[$source]}"
source_path="$HOME/.dotfiles/$source"

# Backup existing file
if [[ -f "$target" && ! -L "$target" ]]; then
warn "Backing up existing $target"
cp "$target" "$backup_dir/"
fi

# Remove existing symlink or file
rm -f "$target"

# Create symlink
info "Linking $source_path -> $target"
ln -sf "$source_path" "$target"
done
}

# Instalar vim-plug
install_vim_plug() {
info "Installing vim-plug..."

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

info "Installing Vim plugins..."
vim +PlugInstall +qall
}

# Configurar Git
setup_git() {
info "Setting up Git configuration..."

read -p "Enter your Git username: " git_username
read -p "Enter your Git email: " git_email

git config --global user.name "$git_username"
git config --global user.email "$git_email"
}

# Main installation
main() {
info "Starting dotfiles installation..."

cd "$HOME/.dotfiles"

install_dependencies
create_symlinks
install_vim_plug
setup_git

info "✅ Dotfiles installation completed!"
info "Please restart your terminal or source your shell config"
}

# Run if executed directly
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi

Makefile para gestión

# ~/.dotfiles/Makefile

.PHONY: help install update backup clean test

# Default target
help: ## Show this help message
@echo 'Usage: make [target]'
@echo ''
@echo 'Targets:'
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-15s %s\n", $$1, $$2}' $(MAKEFILE_LIST)

install: ## Install dotfiles
@echo "Installing dotfiles..."
@./install.sh

update: ## Update dotfiles and plugins
@echo "Updating dotfiles..."
@git pull origin main
@vim +PlugUpdate +qall
@echo "✅ Update completed"

backup: ## Backup current configurations
@echo "Creating backup..."
@mkdir -p backups/$(shell date +%Y%m%d-%H%M%S)
@cp ~/.vimrc backups/$(shell date +%Y%m%d-%H%M%S)/ 2>/dev/null || true
@cp ~/.tmux.conf backups/$(shell date +%Y%m%d-%H%M%S)/ 2>/dev/null || true
@echo "✅ Backup created"

clean: ## Remove broken symlinks
@echo "Cleaning broken symlinks..."
@find ~ -maxdepth 1 -name ".*" -type l -exec test ! -e {} \; -delete
@echo "✅ Cleanup completed"

test: ## Test dotfiles configuration
@echo "Testing configurations..."
@vim --version > /dev/null && echo "✅ Vim OK" || echo "❌ Vim failed"
@tmux -V > /dev/null && echo "✅ Tmux OK" || echo "❌ Tmux failed"
@git --version > /dev/null && echo "✅ Git OK" || echo "❌ Git failed"

🔄 Sincronización y versionado

Repository setup

# Inicializar repositorio
cd ~/.dotfiles
git init
git add .
git commit -m "Initial dotfiles setup"

# Conectar con GitHub
git remote add origin git@github.com:username/dotfiles.git
git push -u origin main

Script de actualización

#!/bin/bash
# ~/.dotfiles/scripts/update.sh

info() {
echo -e "\033[0;32m[INFO]\033[0m $1"
}

# Actualizar dotfiles
info "Updating dotfiles from repository..."
git pull origin main

# Actualizar plugins de Vim
info "Updating Vim plugins..."
vim +PlugUpdate +PlugClean! +qall

# Actualizar Tmux plugins si usa TPM
if [[ -d ~/.tmux/plugins/tpm ]]; then
info "Updating Tmux plugins..."
~/.tmux/plugins/tpm/bin/update_plugins all
fi

info "✅ Update completed!"

🌍 Configuraciones por entorno

Detección automática de entorno

" ~/.dotfiles/vim/environments.vim

" Configuración específica por máquina
let hostname = substitute(system('hostname'), '\n', '', '')

if hostname == 'work-laptop'
" Configuración para trabajo
set background=light
colorscheme solarized

" Proxy settings si es necesario
let g:netrw_http_cmd = "curl --proxy http://proxy:8080"

elseif hostname == 'personal-desktop'
" Configuración personal
set background=dark
colorscheme gruvbox

" Configuraciones más agresivas
set relativenumber
set cursorline

else
" Configuración por defecto
set background=dark
colorscheme default
endif

" Configuración por tipo de conexión
if exists('$SSH_CONNECTION')
" Estamos en SSH
set mouse=
set clipboard=
else
" Sesión local
set mouse=a
set clipboard=unnamedplus
endif

Variables de entorno

# ~/.dotfiles/shell/exports

# Editor preferido
export EDITOR='vim'
export VISUAL='vim'

# Configuración de terminal
export TERM='xterm-256color'

# Historial
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoreboth

# Configuración específica por entorno
if [[ -n "$SSH_CONNECTION" ]]; then
export EDITOR='vim'
else
export EDITOR='vim'
fi

# Path personalizado
export PATH="$HOME/.dotfiles/bin:$PATH"
export PATH="$HOME/.local/bin:$PATH"

🔧 Gestión avanzada

Script de sincronización

#!/bin/bash
# ~/.dotfiles/scripts/sync.sh

# Sync dotfiles across multiple machines

REMOTE_HOSTS=(
"user@server1.com"
"user@server2.com"
)

sync_to_remote() {
local host=$1
echo "Syncing to $host..."

# Sync dotfiles directory
rsync -avz --exclude='.git' ~/.dotfiles/ "$host:~/.dotfiles/"

# Run installation on remote
ssh "$host" "cd ~/.dotfiles && ./install.sh"
}

# Sync to all hosts
for host in "${REMOTE_HOSTS[@]}"; do
sync_to_remote "$host"
done

Template para nuevas máquinas

#!/bin/bash
# Bootstrap script for new machines

# One-liner installation
curl -fsSL https://raw.githubusercontent.com/username/dotfiles/main/bootstrap.sh | bash

# Alternative with wget
wget -qO- https://raw.githubusercontent.com/username/dotfiles/main/bootstrap.sh | bash

📚 Mejores prácticas

Organización

  • Modularidad: Separa configuraciones por herramienta
  • Documentación: README detallado con instrucciones
  • Versionado: Commits descriptivos y tags para versiones estables
  • Testing: Scripts para verificar configuraciones

Seguridad

  • Secretos: Nunca commits tokens o passwords
  • Variables: Usa archivos locales para datos sensibles
  • Permisos: Configuración correcta de permisos de archivos

Mantenimiento

  • Actualizaciones: Script automatizado para updates
  • Limpieza: Eliminación regular de configuraciones obsoletas
  • Backup: Respaldo antes de cambios importantes

🎯 Ejercicios prácticos

Ejercicio 1: Setup básico

  1. Crea estructura de dotfiles
  2. Implementa script de instalación
  3. Configura versionado con Git

Ejercicio 2: Modularización

  1. Separa configuración de Vim en módulos
  2. Crea configuraciones específicas por entorno
  3. Implementa detección automática

Ejercicio 3: Automatización

  1. Crea Makefile para gestión
  2. Implementa scripts de actualización
  3. Configura sincronización multi-máquina

🚀 Inspiración y recursos

Dotfiles populares

Herramientas útiles

  • GNU Stow - Gestión de symlinks
  • Dotbot - Framework para dotfiles
  • rcm - Gestión de dotfiles

¡Con tus dotfiles bien organizados nunca más perderás tu configuración perfecta! 🎯