Skip to content

Instantly share code, notes, and snippets.

@LuisPalacios
Last active February 5, 2026 09:56
Show Gist options
  • Select an option

  • Save LuisPalacios/16c7da5667cf49314ebd8bcafc364e32 to your computer and use it in GitHub Desktop.

Select an option

Save LuisPalacios/16c7da5667cf49314ebd8bcafc364e32 to your computer and use it in GitHub Desktop.
Script para importar extensiones de VSCode
#!/bin/bash
# Reinstalar extensiones de VSCode desde Gist
# Autor: Luis Palacios
# Gist: https://gist.github.com/LuisPalacios/9bccecf260cf4cc73d74fe9d500f7e94
#
# Uso: ./load_extensions_vscode_from_gist.sh [opciones] [binario]
# Ejemplos:
# ./load_extensions_vscode_from_gist.sh # Usa 'code' por defecto
# ./load_extensions_vscode_from_gist.sh cursor
# ./load_extensions_vscode_from_gist.sh --sync # Sincroniza (ofrece borrar extras)
# ./load_extensions_vscode_from_gist.sh --sync cursor
# Configuración
GIST_URL="https://gist.githubusercontent.com/LuisPalacios/9bccecf260cf4cc73d74fe9d500f7e94/raw/"
SYNC_MODE=false
CODE_BIN="code"
# Función para mostrar ayuda
show_help() {
cat << EOF
Uso: $(basename "$0") [opciones] [binario]
Instala extensiones de VSCode desde un Gist de GitHub.
OPCIONES:
--help, -h Muestra esta ayuda
--sync Sincroniza extensiones (ofrece eliminar las que no están en el gist)
ARGUMENTOS:
binario Comando del editor (por defecto: code)
Ejemplos: code, cursor, antigravity, code-insiders
EJEMPLOS:
$(basename "$0") # Instala extensiones faltantes usando 'code'
$(basename "$0") cursor # Instala extensiones faltantes usando 'cursor'
$(basename "$0") --sync # Sincroniza extensiones usando 'code'
$(basename "$0") --sync cursor # Sincroniza extensiones usando 'cursor'
GIST:
https://gist.github.com/LuisPalacios/9bccecf260cf4cc73d74fe9d500f7e94
AUTOR:
Luis Palacios
EOF
exit 0
}
# Procesar argumentos
while [[ $# -gt 0 ]]; do
case $1 in
--help|-h)
show_help
;;
--sync)
SYNC_MODE=true
shift
;;
-*)
echo "Error: Opción desconocida '$1'" >&2
echo "Usa '$(basename "$0") --help' para ver las opciones disponibles." >&2
exit 1
;;
*)
CODE_BIN="$1"
shift
;;
esac
done
# Verificar que el binario existe
if ! command -v "$CODE_BIN" &> /dev/null; then
echo "Error: El comando '$CODE_BIN' no está disponible." >&2
echo "Usa '$(basename "$0") --help' para ver las opciones disponibles." >&2
exit 1
fi
echo "Usando binario: $CODE_BIN"
[[ "$SYNC_MODE" == true ]] && echo "Modo sincronización: activado"
echo "Obteniendo extensiones instaladas actualmente..."
# Obtener lista de extensiones instaladas
mapfile -t installed < <("$CODE_BIN" --list-extensions)
echo "Extensiones instaladas: ${#installed[@]}"
echo ""
echo "Descargando lista de extensiones desde gist..."
# Descargar el contenido del gist
gist_content=$(curl -sL "$GIST_URL")
if [[ -z "$gist_content" ]]; then
echo "Error: No se pudo descargar el contenido del gist." >&2
exit 1
fi
# Crear arrays para tracking
declare -a to_install=()
declare -a already_installed=()
declare -a gist_extensions=()
# Leer todas las extensiones del gist
while IFS= read -r ext; do
# Saltar líneas vacías y comentarios
[[ -z "$ext" || "$ext" =~ ^[[:space:]]*# ]] && continue
# Limpiar espacios en blanco
ext=$(echo "$ext" | xargs)
[[ -z "$ext" ]] && continue
gist_extensions+=("$ext")
done <<< "$gist_content"
# Comparar instaladas vs gist
for ext in "${installed[@]}"; do
if printf '%s\n' "${gist_extensions[@]}" | grep -q "^${ext}$"; then
already_installed+=("$ext")
fi
done
# Determinar cuáles instalar
for ext in "${gist_extensions[@]}"; do
if ! printf '%s\n' "${installed[@]}" | grep -q "^${ext}$"; then
to_install+=("$ext")
fi
done
# Determinar cuáles son extra (solo en modo sync)
declare -a to_remove=()
if [[ "$SYNC_MODE" == true ]]; then
for ext in "${installed[@]}"; do
if ! printf '%s\n' "${gist_extensions[@]}" | grep -q "^${ext}$"; then
to_remove+=("$ext")
fi
done
fi
# Mostrar resumen
echo ""
echo "=== RESUMEN ==="
echo "Extensiones en el gist: ${#gist_extensions[@]}"
echo "Ya instaladas: ${#already_installed[@]}"
echo "Por instalar: ${#to_install[@]}"
[[ "$SYNC_MODE" == true ]] && echo "Extra (no en gist): ${#to_remove[@]}"
echo ""
# Crear lista unificada de todas las extensiones
declare -A all_extensions
# Marcar las del gist
for ext in "${gist_extensions[@]}"; do
all_extensions["$ext"]="gist"
done
# Marcar las instaladas
for ext in "${installed[@]}"; do
if [[ -n "${all_extensions[$ext]}" ]]; then
all_extensions["$ext"]="both" # Está en ambos
else
all_extensions["$ext"]="installed" # Solo instalada
fi
done
# Mostrar lista unificada ordenada
echo "Extensiones:"
for ext in $(printf '%s\n' "${!all_extensions[@]}" | sort); do
status="${all_extensions[$ext]}"
printf " - %-50s" "$ext"
case "$status" in
both)
echo "Está en Gist - ✅ Ya instalada"
;;
gist)
echo "Está en Gist - ⚠️ Pendiente de instalarse"
;;
installed)
if [[ "$SYNC_MODE" == true ]]; then
echo "No en Gist - ℹ️ Se va a desinstalar (--sync)"
else
echo "No en Gist - ℹ️ Usa --sync para desinstalarla"
fi
;;
esac
done
echo ""
# Instalar las que faltan
if [[ ${#to_install[@]} -gt 0 ]]; then
echo "↓ Instalando extensiones faltantes..."
echo ""
declare -a failed_installs=()
for ext in "${to_install[@]}"; do
printf "Instalando: %-38s " "$ext"
# Capturar salida y código de error
output=$("$CODE_BIN" --install-extension "$ext" 2>&1)
exit_code=$?
if [[ $exit_code -eq 0 ]]; then
echo -e "[\e[32mOk\e[0m]"
else
# Determinar causa del error y mostrar en la misma línea
if echo "$output" | grep -qi "not found"; then
echo -e "[\e[31mError\e[0m] - No disponible en el marketplace de $CODE_BIN"
elif echo "$output" | grep -qi "network\|timeout\|ENOTFOUND"; then
echo -e "[\e[31mError\e[0m] - Error de conectividad"
elif echo "$output" | grep -qi "already installed"; then
echo -e "[\e[33mAdvertencia\e[0m] - Ya instalada"
else
echo -e "[\e[31mError\e[0m] - Falló la instalación"
fi
failed_installs+=("$ext")
fi
done
echo ""
if [[ ${#failed_installs[@]} -eq 0 ]]; then
echo "✓ Instalación completa."
else
echo "⚠️ Instalación completada con ${#failed_installs[@]} errores."
fi
else
echo "✓ Todas las extensiones ya están instaladas."
fi
# Ofrecer desinstalar extensiones extra (solo en modo sync)
if [[ "$SYNC_MODE" == true && ${#to_remove[@]} -gt 0 ]]; then
echo ""
echo "⚠️ EXTENSIONES NO PRESENTES EN EL GIST:"
for ext in "${to_remove[@]}"; do
echo " - $ext"
done
echo ""
read -p "¿Deseas desinstalar estas extensiones? (s/N): " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Ss]$ ]]; then
echo ""
echo "↓ Desinstalando extensiones extra..."
echo ""
declare -a failed_uninstalls=()
for ext in "${to_remove[@]}"; do
printf "Desinstalando: %-35s " "$ext"
# Capturar salida y código de error
output=$("$CODE_BIN" --uninstall-extension "$ext" 2>&1)
exit_code=$?
if [[ $exit_code -eq 0 ]]; then
echo -e "[\e[32mOk\e[0m]"
else
# Determinar causa del error y mostrar en la misma línea
if echo "$output" | grep -qi "not installed\|not found"; then
echo -e "[\e[31mError\e[0m] - No está instalada"
else
echo -e "[\e[31mError\e[0m] - Falló la desinstalación"
fi
failed_uninstalls+=("$ext")
fi
done
echo ""
if [[ ${#failed_uninstalls[@]} -eq 0 ]]; then
echo "✓ Desinstalación completa."
else
echo "⚠️ Desinstalación completada con errores (${#failed_uninstalls[@]} fallidas)."
fi
else
echo "Desinstalación cancelada."
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment