Initial commit of Zsh setup files

This commit is contained in:
Marco Gallegos
2025-11-08 15:33:58 -06:00
commit f36cc9e1ff
10 changed files with 2056 additions and 0 deletions

190
modules/apps.sh Executable file
View File

@@ -0,0 +1,190 @@
#!/usr/bin/env bash
# ===============================================================
# apps.sh - Instalación de aplicaciones esenciales
# ===============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
install_apps() {
log_step "Instalación de Aplicaciones"
# Paquetes base esenciales
log_info "Instalando herramientas base..."
sudo pacman -S --noconfirm --needed \
git curl wget base-devel unzip \
neofetch htop fastfetch btop \
vim nano tmux \
xdg-utils xdg-user-dirs stow || {
log_error "Error al instalar herramientas base"
return 1
}
# Aplicaciones multimedia
log_info "Instalando aplicaciones multimedia..."
sudo pacman -S --noconfirm --needed \
vlc vlc-plugins-all libdvdcss \
audacity inkscape \
ffmpeg gstreamer gst-plugins-good gst-plugins-bad gst-plugins-ugly \
yt-dlp || {
log_warning "Algunos paquetes multimedia no se pudieron instalar"
}
# Configurar VLC como reproductor predeterminado
log_info "Configurando VLC como reproductor predeterminado..."
xdg-mime default vlc.desktop audio/mpeg 2>/dev/null || true
xdg-mime default vlc.desktop audio/mp4 2>/dev/null || true
xdg-mime default vlc.desktop audio/x-wav 2>/dev/null || true
xdg-mime default vlc.desktop video/mp4 2>/dev/null || true
xdg-mime default vlc.desktop video/x-matroska 2>/dev/null || true
xdg-mime default vlc.desktop video/x-msvideo 2>/dev/null || true
xdg-mime default vlc.desktop video/x-ms-wmv 2>/dev/null || true
xdg-mime default vlc.desktop video/webm 2>/dev/null || true
# Aplicaciones de red y transferencia de archivos
log_info "Instalando aplicaciones de red..."
sudo pacman -S --noconfirm --needed \
filezilla telegram-desktop scrcpy || {
log_warning "Algunos paquetes de red no se pudieron instalar"
}
# Flatpak
log_info "Instalando Flatpak..."
sudo pacman -S --noconfirm --needed flatpak || {
log_warning "Flatpak no se pudo instalar"
}
# Drivers y codecs para Intel Iris Xe
log_info "Instalando drivers y codecs para Intel Iris Xe..."
# Instalar headers del kernel si son necesarios
KVER="$(uname -r)"
if [[ ! -d "/usr/lib/modules/${KVER}/build" ]]; then
log_info "Instalando headers de kernel..."
sudo pacman -S --noconfirm --needed linux-headers || {
log_warning "No se pudieron instalar headers de kernel"
}
fi
# Drivers de gráficos Intel
log_info "Instalando drivers de gráficos Intel..."
sudo pacman -S --noconfirm --needed \
mesa vulkan-intel \
lib32-mesa lib32-vulkan-intel || {
log_warning "Algunos drivers de gráficos no se pudieron instalar"
}
# Drivers de video y hardware acceleration
log_info "Instalando drivers de video Intel (VA-API/VDPAU)..."
sudo pacman -S --noconfirm --needed \
intel-media-driver \
libva-utils \
libvdpau-va-gl \
libva-mesa-driver || {
log_warning "Algunos drivers de video no se pudieron instalar"
}
# OpenCL para Intel
log_info "Instalando soporte OpenCL para Intel..."
sudo pacman -S --noconfirm --needed \
ocl-icd \
libclc \
clinfo || {
log_warning "Algunos paquetes OpenCL no se pudieron instalar"
}
# Verificar e instalar helper AUR si es necesario
AUR_HELPER=$(ensure_aur_helper)
# Intel Compute Runtime desde AUR (necesario para OpenCL en Intel)
log_info "Instalando Intel Compute Runtime desde AUR..."
if [ "$AUR_HELPER" = "yay" ]; then
yay -S --noconfirm intel-compute-runtime || {
log_warning "No se pudo instalar intel-compute-runtime desde AUR"
}
elif [ "$AUR_HELPER" = "paru" ]; then
paru -S --noconfirm intel-compute-runtime || {
log_warning "No se pudo instalar intel-compute-runtime desde AUR"
}
fi
# Configurar OpenCL para Intel
if [[ ! -f /etc/OpenCL/vendors/intel.icd ]] && [[ -f /usr/lib/intel-opencl/libigdrcl.so ]]; then
log_info "Configurando OpenCL para Intel..."
sudo mkdir -p /etc/OpenCL/vendors
echo "/usr/lib/intel-opencl/libigdrcl.so" | sudo tee /etc/OpenCL/vendors/intel.icd >/dev/null
fi
# Actualizar cache de librerías
sudo ldconfig || true
# Verificar instalación de drivers
log_info "Verificando drivers Intel instalados..."
if command_exists vainfo; then
log_info "Información de VA-API:"
vainfo 2>/dev/null | head -5 || true
fi
if command_exists clinfo; then
log_info "Información de OpenCL:"
clinfo 2>/dev/null | grep -E "Platform Name|Device Name" || true
fi
# Aplicaciones desde AUR
log_info "Instalando aplicaciones desde AUR..."
AUR_PACKAGES=(
"visual-studio-code-bin"
"cursor-bin"
"keyd"
"fragments"
"logiops"
"ltunify"
"teamviewer"
)
for pkg in "${AUR_PACKAGES[@]}"; do
log_info "Instalando ${pkg}..."
if [ "$AUR_HELPER" = "yay" ]; then
yay -S --noconfirm "$pkg" || {
log_warning "No se pudo instalar ${pkg} desde AUR"
}
elif [ "$AUR_HELPER" = "paru" ]; then
paru -S --noconfirm "$pkg" || {
log_warning "No se pudo instalar ${pkg} desde AUR"
}
fi
done
# Configurar servicios
log_info "Configurando servicios..."
# Habilitar keyd si está instalado
if command_exists keyd; then
log_info "Habilitando servicio keyd..."
sudo systemctl enable keyd.service 2>/dev/null || true
sudo systemctl start keyd.service 2>/dev/null || true
fi
# Habilitar logiops si está instalado
if command_exists logiops; then
log_info "Habilitando servicio logiops..."
sudo systemctl enable logiops.service 2>/dev/null || true
sudo systemctl start logiops.service 2>/dev/null || true
fi
# Habilitar TeamViewer daemon si está instalado
if command_exists teamviewer; then
log_info "Habilitando servicio TeamViewer..."
sudo systemctl enable teamviewerd.service 2>/dev/null || true
sudo systemctl start teamviewerd.service 2>/dev/null || true
log_success "TeamViewer daemon habilitado e iniciado"
fi
log_success "Aplicaciones instaladas correctamente"
return 0
}
# Ejecutar si se llama directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
install_apps "$@"
fi

78
modules/common.sh Executable file
View File

@@ -0,0 +1,78 @@
#!/usr/bin/env bash
# ===============================================================
# common.sh - Funciones comunes para los módulos
# ===============================================================
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
BOLD='\033[1m'
# Funciones de logging
log_info() {
echo -e "${BLUE}${NC} ${BOLD}$1${NC}"
}
log_success() {
echo -e "${GREEN}${NC} ${GREEN}$1${NC}"
}
log_warning() {
echo -e "${YELLOW}${NC} ${YELLOW}$1${NC}"
}
log_error() {
echo -e "${RED}${NC} ${RED}$1${NC}"
}
log_step() {
echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${CYAN}${BOLD} $1${NC}"
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
}
# Función para verificar si un comando existe
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Función para instalar helper AUR si no existe
ensure_aur_helper() {
if command_exists yay; then
echo "yay"
return 0
elif command_exists paru; then
echo "paru"
return 0
else
log_warning "No se detectó yay ni paru. Instalando yay..."
cd /tmp
git clone https://aur.archlinux.org/yay-bin.git
cd yay-bin
makepkg -si --noconfirm
echo "yay"
return 0
fi
}
# Función para actualizar sistema
update_system() {
log_step "Actualizando sistema"
log_info "Sincronizando repositorios y actualizando paquetes..."
sudo pacman -Syu --noconfirm
log_success "Sistema actualizado"
}
# Función para limpiar paquetes huérfanos
cleanup_orphans() {
log_step "Limpieza de paquetes huérfanos"
log_info "Buscando paquetes huérfanos..."
sudo pacman -Rns $(pacman -Qtdq) --noconfirm 2>/dev/null || true
log_success "Limpieza completada"
}

233
modules/davinci-resolve.sh Executable file
View File

@@ -0,0 +1,233 @@
#!/usr/bin/env bash
# ===============================================================
# davinci-resolve.sh - Instalador de DaVinci Resolve (Intel Edition)
# ===============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
install_davinci_resolve() {
log_step "Instalación de DaVinci Resolve (Intel Edition)"
# Comprobar que el ZIP está en Downloads
ZIP_DIR="${HOME}/Downloads"
RESOLVE_ZIP="$(ls -1t "${ZIP_DIR}"/DaVinci_Resolve*_Linux.zip 2>/dev/null | head -n1 || true)"
if [[ -z "${RESOLVE_ZIP}" ]]; then
log_error "No se encontró ningún ZIP de DaVinci Resolve en ${ZIP_DIR}."
log_info "Ve al sitio de descargas de Blackmagic Design:"
log_info "https://www.blackmagicdesign.com/support/"
log_info "Descarga el archivo Linux ZIP y colócalo en ${ZIP_DIR}"
return 1
fi
log_info "Usando ZIP: ${RESOLVE_ZIP}"
# Instalación de paquetes básicos
log_info "Instalando paquetes básicos..."
sudo pacman -S --needed --noconfirm \
unzip patchelf libarchive xdg-user-dirs desktop-file-utils \
file gtk-update-icon-cache rsync clinfo qt5-base qt5-svg qt5-x11extras \
libpng libtiff libcurl || true
# Configurar OpenCL / Intel GPU
log_info "Configurando runtime OpenCL de Intel y drivers de video..."
# Eliminar posibles paquetes NVIDIA conflictivos
if pacman -Qi nvidia &>/dev/null; then
log_warning "Quitando paquetes NVIDIA para evitar conflictos..."
sudo pacman -Rns --noconfirm nvidia nvidia-utils nvidia-settings opencl-nvidia || true
fi
# Instalar headers del kernel si son necesarios
KVER="$(uname -r)"
if [[ ! -d "/usr/lib/modules/${KVER}/build" ]]; then
log_info "Instalando headers de kernel..."
sudo pacman -S --needed --noconfirm linux-headers linux-zen-headers || true
fi
# Instalar runtime OpenCL (compute runtime), desde AUR si es necesario
if ! pacman -Qi intel-compute-runtime &>/dev/null; then
log_info "Instalando intel-compute-runtime (puede venir del AUR)..."
AUR_HELPER=$(ensure_aur_helper)
if [ "$AUR_HELPER" = "yay" ]; then
yay -S --noconfirm intel-compute-runtime || {
log_error "No se pudo instalar intel-compute-runtime"
return 1
}
elif [ "$AUR_HELPER" = "paru" ]; then
paru -S --noconfirm intel-compute-runtime || {
log_error "No se pudo instalar intel-compute-runtime"
return 1
}
else
if ! sudo pacman -S --needed --noconfirm intel-compute-runtime; then
log_error "No se pudo instalar intel-compute-runtime desde pacman."
log_error "Asegúrate de tener un helper AUR como yay o paru"
return 1
fi
fi
fi
# Instalar otros paquetes Intel / VA-API / OpenCL
log_info "Instalando paquetes Intel / VA-API / OpenCL..."
sudo pacman -S --needed --noconfirm \
intel-media-driver \
ocl-icd \
libxcrypt-compat \
ffmpeg \
glu \
gtk2 \
fuse2 \
libva-utils libvdpau-va-gl || true
# Asegurar el archivo ICD para OpenCL de Intel
if [[ ! -f /etc/OpenCL/vendors/intel.icd ]]; then
log_info "Creando vendor file de OpenCL para Intel..."
sudo mkdir -p /etc/OpenCL/vendors
echo "/usr/lib/intel-opencl/libigdrcl.so" | sudo tee /etc/OpenCL/vendors/intel.icd >/dev/null
fi
# Crear enlace /etc/pki/tls si es necesario
if [[ ! -e /etc/pki/tls ]]; then
log_info "Creando enlace /etc/pki/tls → /etc/ssl"
sudo mkdir -p /etc/pki
sudo ln -sf /etc/ssl /etc/pki/tls
fi
sudo ldconfig || true
# Verificaciones
log_info "Verificando OpenCL instalado..."
clinfo | grep -E "Platform Name|Device Name" || true
log_info "Verificando soporte de decodificación VA-API para H264 / HEVC..."
vainfo | grep -E "H264|HEVC" || true
# Extraer DaVinci Resolve
log_info "Extrayendo DaVinci Resolve del ZIP..."
NEEDED_GB=10
FREE_KB=$(df --output=avail -k "${ZIP_DIR}" | tail -n1)
FREE_GB=$((FREE_KB / 1024 / 1024))
if (( FREE_GB < NEEDED_GB )); then
log_error "No hay suficiente espacio libre en ${ZIP_DIR}: ${FREE_GB} GiB < ${NEEDED_GB} GiB"
return 1
fi
WORKDIR="$(mktemp -d -p "${ZIP_DIR}" .resolve-extract-XXXXXXXX)"
trap 'rm -rf "${WORKDIR}"' EXIT
unzip -q "${RESOLVE_ZIP}" -d "${WORKDIR}"
RUN_FILE="$(find "${WORKDIR}" -maxdepth 2 -type f -name 'DaVinci_Resolve_*_Linux.run' | head -n1 || true)"
if [[ -z "${RUN_FILE}" ]]; then
log_error "No se encontró el archivo .run dentro del ZIP."
return 1
fi
chmod +x "${RUN_FILE}"
EX_DIR="$(dirname "${RUN_FILE}")"
( cd "${EX_DIR}" && "./$(basename "${RUN_FILE}")" --appimage-extract >/dev/null )
APPDIR="${EX_DIR}/squashfs-root"
if [[ ! -d "${APPDIR}" ]]; then
log_error "No se extrajo correctamente la carpeta squashfs-root."
return 1
fi
chmod -R u+rwX,go+rX,go-w "${APPDIR}"
if [[ ! -s "${APPDIR}/bin/resolve" ]]; then
log_error "El binario resolve no existe o está vacío."
return 1
fi
# Reemplazar librerías glib/gio/gmodule
log_info "Ajustando bibliotecas glib/gio/gmodule para usar las del sistema..."
pushd "${APPDIR}" >/dev/null
rm -f libs/libglib-2.0.so.0 libs/libgio-2.0.so.0 libs/libgmodule-2.0.so.0 || true
ln -sf /usr/lib/libglib-2.0.so.0 libs/libglib-2.0.so.0
ln -sf /usr/lib/libgio-2.0.so.0 libs/libgio-2.0.so.0
ln -sf /usr/lib/libgmodule-2.0.so.0 libs/libgmodule-2.0.so.0
popd >/dev/null
# Aplicar RPATH
log_info "Aplicando RPATH con patchelf..."
RPATH_DIRS=(
"libs"
"libs/plugins/sqldrivers"
"libs/plugins/xcbglintegrations"
"libs/plugins/imageformats"
"libs/plugins/platforms"
"libs/Fusion"
"plugins"
"bin"
)
RPATH_ABS=""
for p in "${RPATH_DIRS[@]}"; do
RPATH_ABS+="/opt/resolve/${p}:"
done
RPATH_ABS+="\$ORIGIN"
if command -v patchelf &>/dev/null; then
find "${APPDIR}" -type f -exec bash -c '
file -b "$1" | grep -q ELF && sudo patchelf --set-rpath "'"${RPATH_ABS}"'" "$1"
' _ {} \; || true
fi
# Instalar en /opt/resolve
log_info "Instalando DaVinci Resolve en /opt/resolve..."
sudo rm -rf /opt/resolve
sudo mkdir -p /opt/resolve
sudo rsync -a --delete "${APPDIR}/" /opt/resolve/
sudo mkdir -p /opt/resolve/.license
# Enlazar libcrypt legado si es necesario
sudo pacman -S --needed --noconfirm libxcrypt-compat || true
sudo ldconfig || true
if [[ -e /usr/lib/libcrypt.so.1 ]]; then
sudo ln -sf /usr/lib/libcrypt.so.1 /opt/resolve/libs/libcrypt.so.1
fi
# Crear wrapper + acceso en escritorio
log_info "Creando wrapper y acceso para DaVinci Resolve..."
cat << 'EOF' | sudo tee /usr/local/bin/resolve-intel >/dev/null
#!/usr/bin/env bash
set -euo pipefail
find /tmp -maxdepth 1 -type f -name "qtsingleapp-DaVinci*lockfile" -delete 2>/dev/null || true
export QT_QPA_PLATFORM=xcb
export QT_AUTO_SCREEN_SCALE_FACTOR=1
export OCL_ICD_VENDORS=/etc/OpenCL/vendors
exec /opt/resolve/bin/resolve "$@"
EOF
sudo chmod +x /usr/local/bin/resolve-intel
mkdir -p "${HOME}/.local/share/applications"
cat > "${HOME}/.local/share/applications/davinci-resolve-wrapper.desktop" << EOF
[Desktop Entry]
Type=Application
Name=DaVinci Resolve (Intel)
Comment=DaVinci Resolve usando OpenCL de Intel
Exec=/usr/local/bin/resolve-intel %U
TryExec=/usr/local/bin/resolve-intel
Terminal=false
Icon=davinci-resolve
Categories=AudioVideo;Video;Graphics;
StartupWMClass=resolve
X-GNOME-UsesNotifications=true
EOF
update-desktop-database "${HOME}/.local/share/applications" >/dev/null 2>&1 || true
sudo gtk-update-icon-cache -f /usr/share/icons/hicolor >/dev/null 2>&1 || true
log_success "DaVinci Resolve (Intel Edition) instalado en /opt/resolve"
log_info "Usa 'resolve-intel' para lanzar la aplicación"
log_info "Para verificar OpenCL: clinfo | grep -E 'Platform Name|Device Name'"
return 0
}
# Ejecutar si se llama directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
install_davinci_resolve "$@"
fi

67
modules/docker.sh Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
# ===============================================================
# docker.sh - Configuración de Docker y Portainer
# ===============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
install_docker() {
log_step "Configuración de Docker y Portainer"
# Instalar Docker
log_info "Instalando Docker y Docker Compose..."
sudo pacman -S --noconfirm --needed \
docker docker-compose || {
log_error "Error al instalar Docker"
return 1
}
# Habilitar y iniciar Docker
log_info "Habilitando servicio de Docker..."
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
sudo systemctl start docker.service
# Agregar usuario al grupo docker (si no está ya)
if ! groups "$USER" | grep -q docker; then
log_info "Agregando usuario al grupo docker..."
sudo usermod -aG docker "$USER"
log_warning "Necesitarás cerrar sesión y volver a iniciar para usar Docker sin sudo"
fi
# Instalar Portainer
log_info "Configurando Portainer..."
# Verificar si Portainer ya está corriendo
if sudo docker ps -a --format '{{.Names}}' | grep -q "^portainer$"; then
log_info "Portainer ya existe. Reiniciando contenedor..."
sudo docker stop portainer 2>/dev/null || true
sudo docker rm portainer 2>/dev/null || true
fi
# Crear volumen y contenedor de Portainer
sudo docker volume create portainer_data 2>/dev/null || true
if sudo docker run -d -p 8000:8000 -p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest; then
log_success "Portainer instalado y ejecutándose"
log_info "Accede a Portainer en: https://localhost:9443"
else
log_error "Error al instalar Portainer"
return 1
fi
log_success "Docker y Portainer configurados correctamente"
return 0
}
# Ejecutar si se llama directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
install_docker "$@"
fi

48
modules/printer.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env bash
# ===============================================================
# printer.sh - Configuración de impresoras (CUPS)
# ===============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
install_printer() {
log_step "Configuración de Impresoras (CUPS)"
# Instalar CUPS y drivers comunes
log_info "Instalando CUPS y drivers de impresora..."
sudo pacman -S --noconfirm --needed \
cups cups-pdf \
ghostscript gsfonts \
gutenprint foomatic-db-engine foomatic-db foomatic-db-ppds foomatic-db-nonfree-ppds foomatic-db-nonfree \
system-config-printer \
avahi || {
log_error "Error al instalar CUPS"
return 1
}
# Habilitar y iniciar servicios
log_info "Habilitando servicios de impresora..."
sudo systemctl enable cups.service
sudo systemctl enable avahi-daemon.service
sudo systemctl start cups.service
sudo systemctl start avahi-daemon.service
# Agregar usuario al grupo lp (si no está ya)
if ! groups "$USER" | grep -q lp; then
log_info "Agregando usuario al grupo lp..."
sudo usermod -aG lp "$USER"
fi
log_success "CUPS instalado y configurado"
log_info "Accede a la interfaz web de CUPS en: http://localhost:631"
log_info "O usa: system-config-printer para configurar impresoras"
return 0
}
# Ejecutar si se llama directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
install_printer "$@"
fi

35
modules/zerotier.sh Executable file
View File

@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# ===============================================================
# zerotier.sh - Configuración de ZeroTier
# ===============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
install_zerotier() {
log_step "Configuración de ZeroTier"
# Instalar ZeroTier
log_info "Instalando ZeroTier..."
sudo pacman -S --noconfirm --needed zerotier-one || {
log_error "Error al instalar ZeroTier"
return 1
}
# Habilitar y iniciar servicio
log_info "Habilitando servicio de ZeroTier..."
sudo systemctl enable zerotier-one.service
sudo systemctl start zerotier-one.service
log_success "ZeroTier instalado y servicio iniciado"
log_info "Para unirte a una red, ejecuta: sudo zerotier-cli join <NETWORK_ID>"
log_info "Para ver tu ID de ZeroTier: sudo zerotier-cli info"
return 0
}
# Ejecutar si se llama directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
install_zerotier "$@"
fi

76
modules/zsh-config.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
# ===============================================================
# zsh-config.sh - Configuración de Zsh y shell
# ===============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
# Usar REPO_BASE si está definido, sino usar el valor por defecto
REPO_BASE="${REPO_BASE:-https://raw.githubusercontent.com/marcogll/scripts_mg/refs/heads/main/omarchy_zsh_setup}"
install_zsh() {
log_step "Configuración de Zsh"
# Instalar Zsh y plugins
log_info "Instalando Zsh y complementos..."
sudo pacman -S --noconfirm --needed \
zsh zsh-completions zsh-syntax-highlighting zsh-autosuggestions || {
log_error "Error al instalar Zsh"
return 1
}
# Descargar configuración personalizada
log_info "Descargando configuración de Zsh desde GitHub..."
if curl -fsSL "${REPO_BASE}/.zshrc" -o ~/.zshrc; then
log_success "Configuración de Zsh descargada"
else
log_warning "No se pudo descargar .zshrc desde GitHub"
log_info "Creando configuración básica de Zsh..."
cat > ~/.zshrc << 'EOF'
# Zsh básico
autoload -U compinit
compinit
# Plugins
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
# Historial
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt SHARE_HISTORY
setopt HIST_IGNORE_DUPS
# Aliases útiles
alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
EOF
fi
# Configurar Zsh como shell predeterminada
if [ "$SHELL" != "/bin/zsh" ] && [ "$SHELL" != "/usr/bin/zsh" ]; then
log_info "Configurando Zsh como shell predeterminada..."
if chsh -s /bin/zsh 2>/dev/null || chsh -s /usr/bin/zsh 2>/dev/null; then
log_success "Zsh configurado como shell predeterminada"
log_warning "Los cambios surtirán efecto en la próxima sesión"
else
log_warning "No se pudo cambiar la shell. Ejecuta manualmente: chsh -s /bin/zsh"
fi
else
log_success "Zsh ya es la shell predeterminada"
fi
log_success "Configuración de Zsh completada"
return 0
}
# Ejecutar si se llama directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
install_zsh "$@"
fi