Skip to content

Instantly share code, notes, and snippets.

@joeblackwaslike
Last active February 7, 2026 00:17
Show Gist options
  • Select an option

  • Save joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0 to your computer and use it in GitHub Desktop.

Select an option

Save joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0 to your computer and use it in GitHub Desktop.

Revisions

  1. joeblackwaslike revised this gist Feb 7, 2026. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c5f05ca395817a952e692931c380e82bf5d1dd48/get-ms-exts.sh" | bash -s -- --input-file "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/42791d3e90ebc51d31e9632e78e13f4afc6c209a/vscode-exts.txt"
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/3437a6f70517432fb339134a1036f0841fa08816/get-ms-exts-cursor.sh" | bash -s -- --input-file "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/42791d3e90ebc51d31e9632e78e13f4afc6c209a/vscode-exts.txt"
    ```
  2. joeblackwaslike renamed this gist Feb 7, 2026. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. joeblackwaslike revised this gist Feb 7, 2026. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c5f05ca395817a952e692931c380e82bf5d1dd48/get-ms-exts.sh" | bash -s -- --input-file vscode-exts.txt
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c5f05ca395817a952e692931c380e82bf5d1dd48/get-ms-exts.sh" | bash -s -- --input-file "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/42791d3e90ebc51d31e9632e78e13f4afc6c209a/vscode-exts.txt"
    ```
  4. joeblackwaslike revised this gist Feb 7, 2026. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/24e8b0e627d9520d40480000d548f9cdc3e96ed8/install-vscode-exts.sh" | bash -s -- --helper code-insiders
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c5f05ca395817a952e692931c380e82bf5d1dd48/get-ms-exts.sh" | bash -s -- --input-file vscode-exts.txt
    ```
  5. joeblackwaslike revised this gist Feb 7, 2026. 3 changed files with 177 additions and 195 deletions.
    170 changes: 170 additions & 0 deletions get-ms-exts.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,170 @@
    #!/usr/bin/env bash

    # ============================================================================
    # Maintainer: Joe Black
    # Contact: https://github.com/joeblackwaslike
    #
    # Copyright (c) 2025 Joe Black
    #
    # License: MIT
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in all
    # copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    # SOFTWARE.
    #
    # In short: Do what you want, just credit Joe Black. For questions, suggestions,
    # or contributions, reach out via GitHub.
    # ============================================================================

    # This script is 99% POSIX compliant and should be portable across macos and linux environments.

    # WARNING:
    # This script requires GNU grep (ggrep) on macOS because BSD grep does not support the -P (Perl regex) flag.
    # If you see errors related to grep or -P, install GNU grep with:
    # brew install grep
    # This will provide 'ggrep', which the script will use automatically if available.
    #
    # On Linux, the standard 'grep' is usually GNU grep and works out of the box.


    # Function to display usage/help message
    show_usage() {
    local script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>]"
    echo -e "\n--input-file <file>: Path to a file containing one VS Code extension ID per line (default: vscode-exts.txt)."
    echo -e "\nThis script downloads the latest VSIX for each extension ID listed in the input file."
    }

    # Function to display error and usage, then exit
    error_and_usage() {
    echo "Error: $1"
    show_usage
    exit 1
    }

    # Default values for CLI flags
    input_file="vscode-exts.txt"

    # Parse arguments
    if [[ "$1" == "--help" ]]; then
    show_usage
    exit 0
    fi

    # Parse CLI flags
    while [[ $# -gt 0 ]]; do
    case "$1" in
    --input-file)
    input_file="$2"
    shift 2
    ;;
    *)
    error_and_usage "Unknown argument: $1"
    ;;
    esac
    done

    # Choose the right grep command: use ggrep if available (for Mac), else fallback to grep
    if command -v ggrep >/dev/null 2>&1; then
    GREP_CMD="ggrep"
    else
    GREP_CMD="grep"
    fi

    # Check if input file exists
    if [[ ! -f "$input_file" ]]; then
    error_and_usage "File '$input_file' not found!"
    fi

    # Create output directory if it doesn't exist
    output_dir="tmp-vsix-files"
    mkdir -p "$output_dir"

    # Array to keep track of failed downloads
    FAILED_EXTENSIONS=()

    # Read file line by line and process each extension ID
    while IFS= read -r extensionId; do
    # Skip empty lines and lines starting with # (comments)
    if [[ -z "$extensionId" || "$extensionId" =~ ^# ]]; then
    continue
    fi

    # Validate extensionId format (should be publisher.name)
    if ! [[ "$extensionId" =~ ^[^.]+\.[^.]+$ ]]; then
    echo "Warning: Skipping invalid extension ID: $extensionId"
    continue
    fi

    echo "Downloading VSIX from marketplace: $extensionId"
    publisher="${extensionId%%.*}"
    name="${extensionId#*.}"
    downloadUrl="https://$publisher.gallery.vsassets.io/_apis/public/gallery/publisher/$publisher/extension/$name/latest/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"

    # Retry mechanism for curl (up to 3 attempts)
    success=0
    for attempt in {1..3}; do
    if curl -L "$downloadUrl" -o "$output_dir/$name.vsix"; then
    success=1
    break
    else
    echo "Warning: Download attempt $attempt for $extensionId failed."
    sleep 2
    fi
    done
    if [[ $success -ne 1 ]]; then
    echo "Error: Failed to download $extensionId after 3 attempts."
    rm -f "$output_dir/$name.vsix"
    FAILED_EXTENSIONS+=("$extensionId")
    continue
    fi

    # Extract version from the VSIX manifest
    version=$(unzip -p "$output_dir/$name.vsix" extension.vsixmanifest | $GREP_CMD -oP '<Identity[^>]+Version="\K[^"]+')
    if [[ -z "$version" ]]; then
    echo "Error: Could not extract version for $extensionId"
    rm -f "$output_dir/$name.vsix"
    FAILED_EXTENSIONS+=("$extensionId")
    continue
    fi

    # Rename the VSIX file to include extensionId and version
    mv "$output_dir/$name.vsix" "$output_dir/${extensionId}-${version}.vsix"
    if [[ $? -ne 0 ]]; then
    echo "Error: Failed to rename $output_dir/$name.vsix to $output_dir/${extensionId}-${version}.vsix"
    rm -f "$output_dir/$name.vsix"
    FAILED_EXTENSIONS+=("$extensionId")
    continue
    fi

    cursor --install-extension "$output_dir/${extensionId}-${version}.vsix"

    done < "$input_file"

    # Print a summary report of failed downloads
    if [[ ${#FAILED_EXTENSIONS[@]} -gt 0 ]]; then
    echo -e "\n==============================="
    echo "Download Summary:"
    echo "The following extensions failed to download:"
    for ext in "${FAILED_EXTENSIONS[@]}"; do
    echo " - $ext"
    done
    echo "==============================="
    else
    echo -e "\nAll extensions installed successfully."
    fi

    /bin/rm -rf "$output_dir"
    136 changes: 0 additions & 136 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -1,136 +0,0 @@
    #!/usr/bin/env bash

    # ============================================================================
    # Maintainer: Joe Black
    # Contact: https://github.com/joeblackwaslike
    #
    # Copyright (c) 2025 Joe Black
    #
    # License: MIT
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in all
    # copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    # SOFTWARE.
    #
    # In short: Do what you want, just credit Joe Black. For questions, suggestions,
    # or contributions, reach out via GitHub.
    # ============================================================================

    # Function to display usage/help message
    show_usage() {
    local script_name
    script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>] [--helper <helper>]"
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/f6d50ca759f5ac0d5182c2701bb6f9586917f76c/vscode-exts.txt)."
    echo -e "\n--helper <helper>: CLI helper command to use for installing extensions (default: code)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }

    # Function to display error and usage, then exit
    error_and_usage() {
    echo "Error: $1"
    show_usage
    exit 1
    }

    # Default values for CLI flags
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/f6d50ca759f5ac0d5182c2701bb6f9586917f76c/vscode-exts.txt"
    helper="code"

    # Temp directory for remote downloads. Empty means no temp dir used.
    temp_dir=""

    # Parse arguments
    if [[ "$1" == "--help" ]]; then
    show_usage
    exit 0
    fi

    # Parse CLI flags
    while [[ $# -gt 0 ]]; do
    case "$1" in
    --input-file)
    input_file="$2"
    shift 2
    ;;

    --helper)
    helper="$2"
    shift 2
    ;;

    *)
    error_and_usage "Unknown argument: $1"
    ;;
    esac
    done


    # If input_file is an https URL, download it to a temp directory and use that file
    # We clean up the temp directory on exit (success or failure).
    if [[ "$input_file" =~ ^https:// ]]; then
    # Ensure curl exists. We use curl for simple, reliable downloads.
    if ! command -v curl >/dev/null 2>&1; then
    error_and_usage "curl is required to fetch remote input files over https"
    fi

    # Create a temp directory. We store the fetched file here.
    temp_dir="$(mktemp -d -t vscode-exts.XXXXXXXX)" || error_and_usage "Failed to create temporary directory"

    # Define cleanup function and register EXIT trap right after we create temp_dir
    cleanup() {
    # Only remove if we actually created it
    if [[ -n "$temp_dir" && -d "$temp_dir" ]]; then
    rm -rf "$temp_dir"
    fi
    }
    trap cleanup EXIT

    # Destination path for the downloaded list
    remote_list="$temp_dir/vscode-exts.txt"

    # Fetch the URL. -f fails on HTTP errors. -s silent. -S shows errors. -L follows redirects.
    if ! curl -fSsL "$input_file" -o "$remote_list"; then
    error_and_usage "Failed to download input file from URL: $input_file"
    fi

    # Point input_file to the downloaded local file
    input_file="$remote_list"
    fi

    # Check if input file exists
    if [[ ! -f "$input_file" ]]; then
    error_and_usage "File '$input_file' not found!"
    fi

    # Read file line by line and process each extension ID
    while IFS= read -r extensionId; do

    # Skip empty lines and lines starting with # (comments)
    if [[ -z "$extensionId" || "$extensionId" =~ ^# ]]; then
    continue
    fi

    # Validate extensionId format (should be publisher.name)
    if ! [[ "$extensionId" =~ ^[^.]+\.[^.]+$ ]]; then
    echo "Warning: Skipping invalid extension ID: $extensionId"
    continue
    else
    echo "Installing extension from marketplace: $extensionId"
    $helper --install-extension "$extensionId"
    fi

    done < "$input_file"
    66 changes: 7 additions & 59 deletions vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -1,78 +1,26 @@
    # Codeium.codeium
    # GitHub.copilot
    # GitHub.copilot-chat
    alefragnani.Bookmarks
    alefragnani.project-manager
    Amerey.markdown-math-snippets
    antfu.vite
    Anthropic.claude-code
    # Note these are just my extensions which are only available in the official Microsoft marketplace. Take what you want and leave what you dont. :)

    bierner.markdown-checkbox
    bierner.markdown-emoji
    bierner.markdown-footnotes
    bierner.markdown-mermaid
    bierner.markdown-preview-github-styles
    bierner.markdown-yaml-preamble
    bradlc.vscode-tailwindcss
    burkeholland.simple-react-snippets
    charliermarsh.ruff
    christian-kohler.npm-intellisense
    Codeium.codeium
    ConradLudgate.rust-playground
    DavidAnson.vscode-markdownlint
    dbaeumer.vscode-eslint
    donjayamanne.githistory
    eamodio.gitlens
    EditorConfig.EditorConfig
    esbenp.prettier-vscode
    fill-labs.dependi
    deerawan.vscode-dash
    frhtylcn.pythonsnippets
    gel.edgedb
    GitHub.github-vscode-theme
    github.vscode-github-actions
    GitHub.vscode-pull-request-github
    golang.go
    Gruntfuggly.todo-tree
    Jacano.vscode-pnpm
    jannchie.ruff-ignore-explainer
    JScearcy.rust-doc-viewer
    jacano.vscode-pnpm
    kaih2o.python-resource-monitor
    KevinRose.vsc-python-indent
    leighlondon.eml
    lextudio.restructuredtext
    linear.linear-connect
    LyonSyonII.rust-syntax
    matt-meyers.vscode-dbml
    mechatroner.rainbow-csv
    MeshIntelligentTechnologiesInc.pieces-vscode
    mhutchie.git-graph
    ms-azuretools.vscode-containers
    ms-python.debugpy
    ms-toolsai.jupyter
    ms-python.vscode-python-envs
    ms-vscode-remote.remote-containers
    ms-vscode-remote.remote-ssh
    ms-vscode.cpptools
    ms-vscode.cpptools-extension-pack
    ms-vscode.makefile-tools
    ms-vscode.remote-server
    ms-vscode.vscode-speech
    ms-vscode.vscode-typescript-next
    mtxr.sqltools
    mtxr.sqltools-driver-mysql
    mtxr.sqltools-driver-pg
    nortakales.flipper-zero-syntax-highlighting
    redhat.vscode-xml
    redhat.vscode-yaml
    Redis.redis-for-vscode
    reduckted.vscode-gitweblinks
    remcohaszing.schemastore
    rust-lang.rust-analyzer
    samuelcolvin.jinjahtml
    SanjulaGanepola.github-local-actions
    Supabase.vscode-supabase-extension
    tamasfe.even-better-toml
    timonwong.shellcheck
    tomoki1207.pdf
    trond-snekvik.simple-rst
    vitest.explorer
    vsls-contrib.gistfs
    supabase.vscode-supabase-extension
    wilsonsio.color-vision
    zhouronghui.propertylist
  6. joeblackwaslike revised this gist Dec 2, 2025. 1 changed file with 13 additions and 7 deletions.
    20 changes: 13 additions & 7 deletions vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,21 @@
    # Codeium.codeium
    # GitHub.copilot
    # GitHub.copilot-chat
    alefragnani.Bookmarks
    alefragnani.project-manager
    Amerey.markdown-math-snippets
    antfu.vite
    Anthropic.claude-code
    bierner.markdown-checkbox
    bierner.markdown-emoji
    bierner.markdown-footnotes
    bierner.markdown-mermaid
    bierner.markdown-preview-github-styles
    bierner.markdown-yaml-preamble
    bradlc.vscode-tailwindcss
    burkeholland.simple-react-snippets
    charliermarsh.ruff
    Codeium.codeium
    christian-kohler.npm-intellisense
    ConradLudgate.rust-playground
    DavidAnson.vscode-markdownlint
    dbaeumer.vscode-eslint
    @@ -20,28 +26,26 @@ esbenp.prettier-vscode
    fill-labs.dependi
    frhtylcn.pythonsnippets
    gel.edgedb
    GitHub.copilot
    GitHub.copilot-chat
    GitHub.github-vscode-theme
    github.vscode-github-actions
    GitHub.vscode-pull-request-github
    golang.go
    Gruntfuggly.todo-tree
    Jacano.vscode-pnpm
    jannchie.ruff-ignore-explainer
    JScearcy.rust-doc-viewer
    kaih2o.python-resource-monitor
    KevinRose.vsc-python-indent
    leighlondon.eml
    lextudio.restructuredtext
    linear.linear-connect
    LyonSyonII.rust-syntax
    matt-meyers.vscode-dbml
    mechatroner.rainbow-csv
    MeshIntelligentTechnologiesInc.pieces-vscode
    mhutchie.git-graph
    ms-azuretools.vscode-containers
    ms-python.debugpy
    ms-python.python
    ms-python.vscode-pylance
    ms-toolsai.jupyter
    ms-vscode-remote.remote-containers
    ms-vscode-remote.remote-ssh
    @@ -54,19 +58,21 @@ ms-vscode.vscode-typescript-next
    mtxr.sqltools
    mtxr.sqltools-driver-mysql
    mtxr.sqltools-driver-pg
    nortakales.flipper-zero-syntax-highlighting
    redhat.vscode-xml
    redhat.vscode-yaml
    Redis.redis-for-vscode
    reduckted.vscode-gitweblinks
    remcohaszing.schemastore
    RooVeterinaryInc.roo-cline
    rust-lang.rust-analyzer
    samuelcolvin.jinjahtml
    SanjulaGanepola.github-local-actions
    Tailscale.vscode-tailscale
    Supabase.vscode-supabase-extension
    tamasfe.even-better-toml
    timonwong.shellcheck
    tomoki1207.pdf
    trond-snekvik.simple-rst
    vitest.explorer
    vsls-contrib.gistfs
    wilsonsio.color-vision
    zhouronghui.propertylist
  7. joeblackwaslike revised this gist Oct 24, 2025. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -59,7 +59,6 @@ redhat.vscode-yaml
    reduckted.vscode-gitweblinks
    remcohaszing.schemastore
    RooVeterinaryInc.roo-cline
    rust-lang.rust
    rust-lang.rust-analyzer
    samuelcolvin.jinjahtml
    SanjulaGanepola.github-local-actions
  8. joeblackwaslike revised this gist Oct 24, 2025. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c9b9d9f49ff71dd2f0175042756a2a56d9d1da73/install-vscode-exts.sh" | bash -s -- --helper code-insiders
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/24e8b0e627d9520d40480000d548f9cdc3e96ed8/install-vscode-exts.sh" | bash -s -- --helper code-insiders
    ```
  9. joeblackwaslike revised this gist Oct 24, 2025. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -34,7 +34,7 @@ show_usage() {
    local script_name
    script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>] [--helper <helper>]"
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/27c47c9f9e6c2376e9b7193be7178eb77c2a428c/vscode-exts.txt)."
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/f6d50ca759f5ac0d5182c2701bb6f9586917f76c/vscode-exts.txt)."
    echo -e "\n--helper <helper>: CLI helper command to use for installing extensions (default: code)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }
    @@ -47,7 +47,7 @@ error_and_usage() {
    }

    # Default values for CLI flags
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/27c47c9f9e6c2376e9b7193be7178eb77c2a428c/vscode-exts.txt"
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/f6d50ca759f5ac0d5182c2701bb6f9586917f76c/vscode-exts.txt"
    helper="code"

    # Temp directory for remote downloads. Empty means no temp dir used.
  10. joeblackwaslike revised this gist Oct 24, 2025. 2 changed files with 10 additions and 3 deletions.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -SL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c9b9d9f49ff71dd2f0175042756a2a56d9d1da73/install-vscode-exts.sh" | bash
    curl -fsSL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c9b9d9f49ff71dd2f0175042756a2a56d9d1da73/install-vscode-exts.sh" | bash -s -- --helper code-insiders
    ```
    11 changes: 9 additions & 2 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -33,8 +33,9 @@
    show_usage() {
    local script_name
    script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>]"
    echo "Usage: $script_name [--input-file <file>] [--helper <helper>]"
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/27c47c9f9e6c2376e9b7193be7178eb77c2a428c/vscode-exts.txt)."
    echo -e "\n--helper <helper>: CLI helper command to use for installing extensions (default: code)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }

    @@ -47,6 +48,7 @@ error_and_usage() {

    # Default values for CLI flags
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/27c47c9f9e6c2376e9b7193be7178eb77c2a428c/vscode-exts.txt"
    helper="code"

    # Temp directory for remote downloads. Empty means no temp dir used.
    temp_dir=""
    @@ -65,6 +67,11 @@ while [[ $# -gt 0 ]]; do
    shift 2
    ;;

    --helper)
    helper="$2"
    shift 2
    ;;

    *)
    error_and_usage "Unknown argument: $1"
    ;;
    @@ -123,7 +130,7 @@ while IFS= read -r extensionId; do
    continue
    else
    echo "Installing extension from marketplace: $extensionId"
    code --install-extension "$extensionId"
    $helper --install-extension "$extensionId"
    fi

    done < "$input_file"
  11. joeblackwaslike revised this gist Oct 23, 2025. 1 changed file with 0 additions and 4 deletions.
    4 changes: 0 additions & 4 deletions vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -13,7 +13,6 @@ Codeium.codeium
    ConradLudgate.rust-playground
    DavidAnson.vscode-markdownlint
    dbaeumer.vscode-eslint
    deerawan.vscode-dash
    donjayamanne.githistory
    eamodio.gitlens
    EditorConfig.EditorConfig
    @@ -27,8 +26,6 @@ GitHub.github-vscode-theme
    github.vscode-github-actions
    GitHub.vscode-pull-request-github
    golang.go
    google.geminicodeassist
    google.gemini-cli-vscode-ide-companion
    Gruntfuggly.todo-tree
    jannchie.ruff-ignore-explainer
    JScearcy.rust-doc-viewer
    @@ -54,7 +51,6 @@ ms-vscode.makefile-tools
    ms-vscode.remote-server
    ms-vscode.vscode-speech
    ms-vscode.vscode-typescript-next
    ms-windows-ai-studio.windows-ai-studio
    mtxr.sqltools
    mtxr.sqltools-driver-mysql
    mtxr.sqltools-driver-pg
  12. joeblackwaslike revised this gist Oct 18, 2025. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -28,6 +28,7 @@ github.vscode-github-actions
    GitHub.vscode-pull-request-github
    golang.go
    google.geminicodeassist
    google.gemini-cli-vscode-ide-companion
    Gruntfuggly.todo-tree
    jannchie.ruff-ignore-explainer
    JScearcy.rust-doc-viewer
    @@ -61,6 +62,7 @@ redhat.vscode-xml
    redhat.vscode-yaml
    reduckted.vscode-gitweblinks
    remcohaszing.schemastore
    RooVeterinaryInc.roo-cline
    rust-lang.rust
    rust-lang.rust-analyzer
    samuelcolvin.jinjahtml
    @@ -70,5 +72,6 @@ tamasfe.even-better-toml
    timonwong.shellcheck
    tomoki1207.pdf
    trond-snekvik.simple-rst
    vsls-contrib.gistfs
    wilsonsio.color-vision
    zhouronghui.propertylist
  13. joeblackwaslike revised this gist Oct 14, 2025. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -SL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0362be75ab14032826cbd21a21be58d83cda8b4a/install-vscode-exts.sh" | bash
    curl -SL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/c9b9d9f49ff71dd2f0175042756a2a56d9d1da73/install-vscode-exts.sh" | bash
    ```
  14. joeblackwaslike revised this gist Oct 14, 2025. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -34,7 +34,7 @@ show_usage() {
    local script_name
    script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>]"
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt)."
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/27c47c9f9e6c2376e9b7193be7178eb77c2a428c/vscode-exts.txt)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }

    @@ -46,7 +46,7 @@ error_and_usage() {
    }

    # Default values for CLI flags
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt"
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/27c47c9f9e6c2376e9b7193be7178eb77c2a428c/vscode-exts.txt"

    # Temp directory for remote downloads. Empty means no temp dir used.
    temp_dir=""
  15. joeblackwaslike revised this gist Oct 14, 2025. 3 changed files with 66 additions and 31 deletions.
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,5 @@
    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -SL
    curl -SL "https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0362be75ab14032826cbd21a21be58d83cda8b4a/install-vscode-exts.sh" | bash
    ```
    40 changes: 38 additions & 2 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -31,9 +31,10 @@

    # Function to display usage/help message
    show_usage() {
    local script_name="$(basename "$0")"
    local script_name
    script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>]"
    echo -e "\n--input-file <file>: Path to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt)."
    echo -e "\n--input-file <file|https-url>: Path or https URL to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }

    @@ -47,6 +48,9 @@ error_and_usage() {
    # Default values for CLI flags
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt"

    # Temp directory for remote downloads. Empty means no temp dir used.
    temp_dir=""

    # Parse arguments
    if [[ "$1" == "--help" ]]; then
    show_usage
    @@ -68,6 +72,38 @@ while [[ $# -gt 0 ]]; do
    done


    # If input_file is an https URL, download it to a temp directory and use that file
    # We clean up the temp directory on exit (success or failure).
    if [[ "$input_file" =~ ^https:// ]]; then
    # Ensure curl exists. We use curl for simple, reliable downloads.
    if ! command -v curl >/dev/null 2>&1; then
    error_and_usage "curl is required to fetch remote input files over https"
    fi

    # Create a temp directory. We store the fetched file here.
    temp_dir="$(mktemp -d -t vscode-exts.XXXXXXXX)" || error_and_usage "Failed to create temporary directory"

    # Define cleanup function and register EXIT trap right after we create temp_dir
    cleanup() {
    # Only remove if we actually created it
    if [[ -n "$temp_dir" && -d "$temp_dir" ]]; then
    rm -rf "$temp_dir"
    fi
    }
    trap cleanup EXIT

    # Destination path for the downloaded list
    remote_list="$temp_dir/vscode-exts.txt"

    # Fetch the URL. -f fails on HTTP errors. -s silent. -S shows errors. -L follows redirects.
    if ! curl -fSsL "$input_file" -o "$remote_list"; then
    error_and_usage "Failed to download input file from URL: $input_file"
    fi

    # Point input_file to the downloaded local file
    input_file="$remote_list"
    fi

    # Check if input file exists
    if [[ ! -f "$input_file" ]]; then
    error_and_usage "File '$input_file' not found!"
    55 changes: 27 additions & 28 deletions vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -2,16 +2,27 @@ alefragnani.Bookmarks
    alefragnani.project-manager
    Amerey.markdown-math-snippets
    Anthropic.claude-code
    bierner.markdown-checkbox
    bierner.markdown-emoji
    bierner.markdown-footnotes
    bierner.markdown-mermaid
    bierner.markdown-preview-github-styles
    bierner.markdown-yaml-preamble
    charliermarsh.ruff
    Codeium.codeium
    ConradLudgate.rust-playground
    DavidAnson.vscode-markdownlint
    dbaeumer.vscode-eslint
    deerawan.vscode-dash
    donjayamanne.githistory
    eamodio.gitlens
    EditorConfig.EditorConfig
    esbenp.prettier-vscode
    fill-labs.dependi
    frhtylcn.pythonsnippets
    gel.edgedb
    GitHub.copilot
    GitHub.copilot-chat
    GitHub.github-vscode-theme
    github.vscode-github-actions
    GitHub.vscode-pull-request-github
    @@ -20,21 +31,36 @@ google.geminicodeassist
    Gruntfuggly.todo-tree
    jannchie.ruff-ignore-explainer
    JScearcy.rust-doc-viewer
    kaih2o.python-resource-monitor
    KevinRose.vsc-python-indent
    leighlondon.eml
    lextudio.restructuredtext
    LyonSyonII.rust-syntax
    matt-meyers.vscode-dbml
    mechatroner.rainbow-csv
    MeshIntelligentTechnologiesInc.pieces-vscode
    mhutchie.git-graph
    ms-azuretools.vscode-containers
    ms-python.debugpy
    ms-python.python
    ms-python.vscode-pylance
    ms-toolsai.jupyter
    ms-vscode-remote.remote-containers
    ms-vscode-remote.remote-ssh
    ms-vscode.cpptools
    ms-vscode.cpptools-extension-pack
    ms-vscode.makefile-tools
    ms-vscode.remote-server
    ms-vscode.vscode-speech
    ms-vscode.vscode-typescript-next
    ms-windows-ai-studio.windows-ai-studio
    mtxr.sqltools
    mtxr.sqltools-driver-mysql
    mtxr.sqltools-driver-pg
    redhat.vscode-xml
    redhat.vscode-yaml
    reduckted.vscode-gitweblinks
    remcohaszing.schemastore
    rust-lang.rust
    rust-lang.rust-analyzer
    samuelcolvin.jinjahtml
    @@ -44,32 +70,5 @@ tamasfe.even-better-toml
    timonwong.shellcheck
    tomoki1207.pdf
    trond-snekvik.simple-rst

    bierner.markdown-checkbox
    bierner.markdown-emoji
    bierner.markdown-footnotes
    bierner.markdown-yaml-preamble
    ConradLudgate.rust-playground
    dbaeumer.vscode-eslint
    deerawan.vscode-dash
    frhtylcn.pythonsnippets
    kaih2o.python-resource-monitor
    leighlondon.eml
    matt-meyers.vscode-dbml
    ms-python.python
    ms-python.vscode-pylance
    ms-python.debugpy
    ms-vscode-remote.remote-containers
    ms-vscode-remote.remote-ssh
    ms-vscode.cpptools
    ms-vscode.cpptools-extension-pack
    ms-vscode.remote-server
    ms-vscode.vscode-typescript-next
    wilsonsio.color-vision
    zhouronghui.propertylist
    remcohaszing.schemastore
    ms-windows-ai-studio.windows-ai-studio
    Codeium.codeium
    GitHub.copilot
    GitHub.copilot-chat
    ms-vscode.vscode-speech
    zhouronghui.propertylist
  16. joeblackwaslike revised this gist Oct 14, 2025. 2 changed files with 9 additions and 2 deletions.
    7 changes: 7 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    # VSCode Extension Installer

    ## Usage
    ### Remote (no download necessary)
    ```sh
    curl -SL
    ```
    4 changes: 2 additions & 2 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -33,7 +33,7 @@
    show_usage() {
    local script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>]"
    echo -e "\n--input-file <file>: Path to a file containing one VS Code extension ID per line (default: vscode-exts.txt)."
    echo -e "\n--input-file <file>: Path to a file containing one VS Code extension ID per line (default: https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }

    @@ -45,7 +45,7 @@ error_and_usage() {
    }

    # Default values for CLI flags
    input_file="vscode-exts.txt"
    input_file="https://gist.githubusercontent.com/joeblackwaslike/2767cc00b6aa45a15f5369f7189260a0/raw/0b92ffc2c65b130e2581ba1763858af497fe6751/vscode-exts.txt"

    # Parse arguments
    if [[ "$1" == "--help" ]]; then
  17. joeblackwaslike created this gist Oct 14, 2025.
    93 changes: 93 additions & 0 deletions install-vscode-exts.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,93 @@
    #!/usr/bin/env bash

    # ============================================================================
    # Maintainer: Joe Black
    # Contact: https://github.com/joeblackwaslike
    #
    # Copyright (c) 2025 Joe Black
    #
    # License: MIT
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in all
    # copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    # SOFTWARE.
    #
    # In short: Do what you want, just credit Joe Black. For questions, suggestions,
    # or contributions, reach out via GitHub.
    # ============================================================================

    # Function to display usage/help message
    show_usage() {
    local script_name="$(basename "$0")"
    echo "Usage: $script_name [--input-file <file>]"
    echo -e "\n--input-file <file>: Path to a file containing one VS Code extension ID per line (default: vscode-exts.txt)."
    echo -e "\nThis script installs the latest extension from the microsoft marketplace for each extension ID listed in the input file."
    }

    # Function to display error and usage, then exit
    error_and_usage() {
    echo "Error: $1"
    show_usage
    exit 1
    }

    # Default values for CLI flags
    input_file="vscode-exts.txt"

    # Parse arguments
    if [[ "$1" == "--help" ]]; then
    show_usage
    exit 0
    fi

    # Parse CLI flags
    while [[ $# -gt 0 ]]; do
    case "$1" in
    --input-file)
    input_file="$2"
    shift 2
    ;;

    *)
    error_and_usage "Unknown argument: $1"
    ;;
    esac
    done


    # Check if input file exists
    if [[ ! -f "$input_file" ]]; then
    error_and_usage "File '$input_file' not found!"
    fi

    # Read file line by line and process each extension ID
    while IFS= read -r extensionId; do

    # Skip empty lines and lines starting with # (comments)
    if [[ -z "$extensionId" || "$extensionId" =~ ^# ]]; then
    continue
    fi

    # Validate extensionId format (should be publisher.name)
    if ! [[ "$extensionId" =~ ^[^.]+\.[^.]+$ ]]; then
    echo "Warning: Skipping invalid extension ID: $extensionId"
    continue
    else
    echo "Installing extension from marketplace: $extensionId"
    code --install-extension "$extensionId"
    fi

    done < "$input_file"
    75 changes: 75 additions & 0 deletions vscode-exts.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    alefragnani.Bookmarks
    alefragnani.project-manager
    Amerey.markdown-math-snippets
    Anthropic.claude-code
    bierner.markdown-mermaid
    bierner.markdown-preview-github-styles
    charliermarsh.ruff
    DavidAnson.vscode-markdownlint
    donjayamanne.githistory
    eamodio.gitlens
    EditorConfig.EditorConfig
    esbenp.prettier-vscode
    fill-labs.dependi
    gel.edgedb
    GitHub.github-vscode-theme
    github.vscode-github-actions
    GitHub.vscode-pull-request-github
    golang.go
    google.geminicodeassist
    Gruntfuggly.todo-tree
    jannchie.ruff-ignore-explainer
    JScearcy.rust-doc-viewer
    KevinRose.vsc-python-indent
    lextudio.restructuredtext
    LyonSyonII.rust-syntax
    mechatroner.rainbow-csv
    MeshIntelligentTechnologiesInc.pieces-vscode
    mhutchie.git-graph
    ms-azuretools.vscode-containers
    ms-toolsai.jupyter
    ms-vscode.makefile-tools
    mtxr.sqltools
    mtxr.sqltools-driver-mysql
    mtxr.sqltools-driver-pg
    redhat.vscode-xml
    redhat.vscode-yaml
    reduckted.vscode-gitweblinks
    rust-lang.rust
    rust-lang.rust-analyzer
    samuelcolvin.jinjahtml
    SanjulaGanepola.github-local-actions
    Tailscale.vscode-tailscale
    tamasfe.even-better-toml
    timonwong.shellcheck
    tomoki1207.pdf
    trond-snekvik.simple-rst

    bierner.markdown-checkbox
    bierner.markdown-emoji
    bierner.markdown-footnotes
    bierner.markdown-yaml-preamble
    ConradLudgate.rust-playground
    dbaeumer.vscode-eslint
    deerawan.vscode-dash
    frhtylcn.pythonsnippets
    kaih2o.python-resource-monitor
    leighlondon.eml
    matt-meyers.vscode-dbml
    ms-python.python
    ms-python.vscode-pylance
    ms-python.debugpy
    ms-vscode-remote.remote-containers
    ms-vscode-remote.remote-ssh
    ms-vscode.cpptools
    ms-vscode.cpptools-extension-pack
    ms-vscode.remote-server
    ms-vscode.vscode-typescript-next
    wilsonsio.color-vision
    zhouronghui.propertylist
    remcohaszing.schemastore
    ms-windows-ai-studio.windows-ai-studio
    Codeium.codeium
    GitHub.copilot
    GitHub.copilot-chat
    ms-vscode.vscode-speech