#!/usr/bin/env bash BASE_URL="https://gist.asfd.cn/jetsung/vscode/raw/HEAD/" LIST_FILE="index.txt" # 默认列表文件 DESC_FILE="README.md" # 描述 Markdown 文件 IDE_CMD="code" # 默认 VSCode FORCE=false EXTRA="" VERBOSE=false # -v: 只显示详细扩展信息,不安装 # 参数解析函数 parameters() { while getopts "s:f e:n:v" opt; do case $opt in s) IDE_CMD="$OPTARG" ;; f) FORCE=true ;; e) EXTRA="$OPTARG" ;; n) LIST_FILE="$OPTARG" ;; v) VERBOSE=true ;; \?) echo "无效参数: -$OPTARG" >&2; exit 1 ;; esac done shift $((OPTIND-1)) EXTRA="$EXTRA $@" } # 主函数 main() { parameters "$@" if $VERBOSE; then URL_DESC="${BASE_URL}${DESC_FILE}" # -v 模式:只下载并显示 README.md 中的扩展推荐表格(不依赖 ID 列表,也不安装) echo "正在获取扩展详细信息..." curl -s --fail "$URL_DESC" | sed -n '/## 扩展列表/,/Open VSX:/p' | sed '$d' # 提取从 ## 扩展列表 到 Open VSX 前的内容 echo "- **微软官方:** https://marketplace.visualstudio.com/" echo "- **Open VSX:** https://open-vsx.org/" exit 0 # 直接退出,不执行安装 fi # 处理 LIST_FILE:如果不包含 . 则自动添加 .txt(除非是 *.*) if [[ "$LIST_FILE" != "*.*" ]] && [[ "$LIST_FILE" != *.* ]]; then LIST_FILE="${LIST_FILE}.txt" fi URL="${BASE_URL}${LIST_FILE}" echo "从 $URL 下载扩展列表..." EXTENSIONS=$(curl -s --fail "$URL" | grep -v '^#' | grep -v '^$' | sed '/^$/d') if [ -z "$EXTENSIONS" ]; then echo "错误: 未获取到扩展列表或文件为空!请检查文件名(当前: $LIST_FILE)。" >&2 exit 1 fi BASE_CMD="$IDE_CMD --install-extension" # 添加 --force if $FORCE; then EXTRA="--force $EXTRA" fi echo "开始为 $IDE_CMD 安装扩展(命令: $BASE_CMD ... $EXTRA)" echo "扩展列表:" echo "$EXTENSIONS" | tr ' ' '\n' # 美化显示,每行一个 echo "-----------------" # 遍历安装(处理行内空格分隔或多行) echo "$EXTENSIONS" | tr ' ' '\n' | while read -r ext; do [ -z "$ext" ] && continue echo "安装: $ext" $BASE_CMD "$ext" $EXTRA || echo "警告: 安装 $ext 失败(可能已安装或 ID 不兼容)" done echo "-----------------" echo "所有扩展安装完成!请重启 IDE 以生效。" } main "$@"