Skip to content

About

Select files, folders, or code snippets and merge them into a single live markdown preview — with a project tree, per-file headers, item counts, and configurable ignore rules. Perfect for feeding context to LLMs (ChatGPT, Claude, Copilot) or sharing code snapshots with your team.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

Code Merge

Select files, folders, or code snippets and merge them into a single live markdown preview — with a project tree, per-file headers, item counts, and configurable ignore rules. Perfect for feeding context to LLMs (ChatGPT, Claude, Copilot) or sharing code snapshots with your team.

GitHub License: MIT VS Code VS Code Marketplace Open VSX


✨ Features

  • 📁 Add files / folders / selections — right-click in the Explorer, select code in the editor, or use a keyboard shortcut. Folder scans follow smart ignore rules (node_modules, .git, dist, binaries, lockfiles, secrets, …) and skip symlinks.
  • 🌲 Project tree — every merged output starts with an ASCII tree of the selected items, including line ranges for selections.
  • 🪟 Virtual preview — a live, in-memory document. Nothing is written to disk; the preview updates as you add, remove, or edit items.
  • 🔄 Live sync — edits (including unsaved ones) and external changes (git pull, other editors) are picked up automatically. Deleted, oversized, unreadable, or binary files are dropped from the list. In rare cases, tools that replace files atomically (write-to-temp + rename — prettier --write, sed -i, some codemods) can make VS Code report a delete-and-create pair and the item may be dropped by mistake — just re-add it if that happens.
  • 🛡️ Preview size guard — the preview closes itself if the merged output grows past code-merge.maxPreviewSizeChars while you're editing, so a runaway edit can't freeze the editor. Reopen it manually, or use Copy Merged Content.
  • 📋 One-click copy — copy the entire merged content to the clipboard.
  • 🔒 Workspace isolation — each workspace folder gets its own item list; the preview follows the active workspace as you switch between multi-root folders.
  • 🗂️ Workspaces view — a sidebar view below Selected Items listing every workspace with tracked items. Click one to make it active, or hit 🗑 to clear only that workspace.
  • ⚙️ Configurable ignore rules — extend the built-in lists via VS Code settings, a .code-mergeignore file (gitignore syntax), or by enabling .gitignore support.
  • 🚀 Auto-open preview — opens beside the current editor the first time you add an item. Disable with code-merge.autoOpenPreview.
  • 💾 Session-only state — the selection list lives entirely in memory and resets when VS Code restarts.

🚀 Usage

Adding items

Action How
Add a file Right-click file in Explorer → Code Merge: Add File
Add a folder Right-click folder in Explorer → Code Merge: Add Folder
Add a selection Select code → right-click → Code Merge: Add Selection

Viewing & exporting

Open the Code Merge view from the Activity Bar to see all selected items. From there:

  • Preview ($(open-preview)) — opens the merged output as a read-only virtual document beside the current editor.
  • Copy ($(copy)) — copies the full merged output to the clipboard.
  • Clear ($(clear-all)) — removes every item for the active workspace.

Clicking any item in the tree opens its source file. For selections, the file opens scrolled to and highlighting the recorded range.

In a multi-root workspace, the Workspaces view (below Selected Items) lists every folder with tracked items. The active workspace is shown first with a · active marker. Click a workspace to switch to it; hit 🗑 to clear only that workspace. A workspace disappears from this list once it has no tracked items left.

Managing ignore rules

Action How
Open ignore settings Command Palette → Code Merge: Open Ignore Settings
Reload ignore rules Command Palette or view title → Code Merge: Reload Ignore Rules
Ignore a path Right-click file/folder in Explorer → Code Merge: Ignore This Path
Edit .code-mergeignore Add gitignore-style patterns manually at the workspace root.

Sensitive files are skipped by default. On top of binaries and lockfiles, folder scans skip files that look like credentials or secrets:

  • Certificate / key extensions — *.pem, *.key, *.p12, *.pfx, *.crt, *.cer, *.der, *.jks, *.keystore.
  • Exact credential filenames — id_rsa, id_dsa, id_ecdsa, id_ed25519, .netrc, .htpasswd, .npmrc, .pypirc, service-account.json.
  • Config-extension files whose name contains a secret keyword — files with .json / .yaml / .env / .txt / .toml / .ini / .cfg / .conf / .xml / … (or no extension) that contain secret / credential / password / token / apikey as a whole word — secrets.yaml, api_token.json, credentials.json, db_password.txt. Source files like password-validator.ts or secret_loader.py are not affected: only files that can plausibly hold a value are checked.

Use Add File explicitly if you really need to include one — it still asks for confirmation first.

Editing .code-mergeignore doesn't reload rules by itself. The file is read on startup, when you switch workspaces, when settings change, and when you add a file or folder — but not when you edit the file in place. After changing it by hand, run Code Merge: Reload Ignore Rules from the Command Palette.

Ignore files are read from each workspace folder's root only. .code-mergeignore and .gitignore (when code-merge.ignore.useGitignore is enabled) are resolved against the root of the workspace folder that owns the file being added. Nested ignore files are not read.

Multi-root workspaces: Add File works on one workspace folder at a time — selecting files from more than one folder in a single action is rejected.

Add Anyway and pattern-ignored folders: If a folder is ignored by a name (node_modules, dist, additionalDirs, non-allowlisted dot-dirs), Add Anyway adds the non-ignored files inside it. If the folder is ignored by a pattern (from .code-mergeignore, .gitignore, or additionalFilePatterns), Add Anyway can't add anything — the pattern matches every file underneath. Use Code Merge: Add File on specific files instead.

Adding a path to your ignore rules doesn't remove items already in the list. Re-run Add Folder on an ancestor to prune — the status bar reports how many were removed (e.g. removed 3 now-ignored).

Example output

// ────────────────────────────────────────────────────────────
// Project structure — my-api (3 files, 2 selections)
// ────────────────────────────────────────────────────────────

my-api/
├── src/
│   ├── index.ts  [full]
│   ├── routes/
│   │   └── auth.ts  [L10-L25, L40-L50]
│   └── db.ts  [full]
└── README.md  [full]

// ────────────────────────────────────────────────────────────
// src/index.ts (ts) — file
// ────────────────────────────────────────────────────────────
import express from 'express';
...

// ────────────────────────────────────────────────────────────
// src/routes/auth.ts [L10-L25] (typescript) — selection
// ────────────────────────────────────────────────────────────
export function login(req, res) {
  ...
}

⌨️ Keyboard shortcuts

Command Windows / Linux macOS
Add Selection Ctrl+Alt+M Cmd+Alt+M
Add File Ctrl+Alt+F Cmd+Alt+F
Add Folder Ctrl+Alt+Shift+F Cmd+Alt+Shift+F
Open Preview Ctrl+Alt+P Cmd+Alt+P
Copy Merged Content Ctrl+Alt+C Cmd+Alt+C

All shortcuts can be rebound from Keyboard Shortcuts (Ctrl+K Ctrl+S).


⚙️ Configuration

Setting Type Default Description
code-merge.ignore.additionalDirs string[] [] Extra directory names to skip on top of the built-in list.
code-merge.ignore.additionalExtensions string[] [] Extra file extensions to skip, e.g. pdf, zip, parquet.
code-merge.ignore.additionalFilePatterns string[] [] Extra gitignore-style patterns, e.g. *.log, secrets/*.
code-merge.ignore.dotDirAllowlist string[] [".github", ".gitlab", ".devcontainer"] Dot-directories that should be traversed instead of skipped.
code-merge.ignore.file string .code-mergeignore Per-project ignore file (gitignore syntax). Leave empty to disable.
code-merge.ignore.useGitignore boolean false Also honor the workspace .gitignore file.
code-merge.maxFileSizeMB number 5 Maximum size (in MB) for a file or selection to be merged.
code-merge.autoOpenPreview boolean true Automatically open the merged preview when items are added, if it isn't already open.
code-merge.maxPreviewSizeChars number 1000000 Maximum total size (characters) of the merged output. If live edits push the content past this limit, the preview closes automatically to keep the editor responsive. It can be reopened manually.

⚡ Performance tips

  • Track selections, not whole files. Add Selection on the function or class you actually need is dramatically cheaper than Add File on a 3,000-line source file — and it's usually what you want to feed to an LLM anyway.
  • Keep a good ignore list. Add Folder walks the tree once and respects node_modules, .git, dist, lockfiles, binaries, and anything you add to .code-mergeignore. A well-maintained ignore file is the single biggest lever in a large repo.
  • Stay under the preview limit. The maxPreviewSizeChars guard closes the preview when live edits push the merged output past the limit. If you routinely hit it, split the work into modules and use Copy Merged Content — you don't have to keep the preview open.
  • Closing the preview isn't the same as clearing the list. If items are still tracked, edits in their files still trigger live-sync work. Use Clear All (or Clear Workspace) when you're done.

📋 Requirements

  • VS Code 1.85.0 or newer.
  • The extension bundles the ignore npm package; no user-installed dependencies are required.

About

Select files, folders, or code snippets and merge them into a single live markdown preview — with a project tree, per-file headers, item counts, and configurable ignore rules. Perfect for feeding context to LLMs (ChatGPT, Claude, Copilot) or sharing code snapshots with your team.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages