Copy Fences (+Language)
Fork of mefengl/vscode-copy-folder-content that copies with triple backticks and a language tag inferred from the file extension (e.g., .dart
→ ```dart).
✨ Features
Copy contents of folders and/or selected files to the clipboard as Markdown code blocks:
- Uses ``` (triple backticks) instead of six.
- Adds a language after the opening fence, inferred from file extension (e.g.,
.ts
→ typescript
, .dart
→ dart
).
Optional: strip comments before copying.
Recursive copy and filter by extensions.
Dedupes files and detects encoding (jschardet
+ iconv-lite
).
Each file is preceded by a separator line:
------ <relative-path> ------
📦 Installation
VS Code Marketplace
After you publish
- Command Palette → Extensions → search for Copy Fences (+Language) → Install
- Or via CLI:
code --install-extension SewaraDev.copy-fences-lang
Open VSX (VSCodium/OSS)
After you publish
Local VSIX (no publishing required)
npm i
npx @vscode/vsce package
code --install-extension ./copy-fences-lang-<version>.vsix
🧪 Development
- Clone and open:
git clone https://github.com/SewaraDev/vscode-copy-fences-lang
cd vscode-copy-fences-lang
npm i
- Press F5 to launch an Extension Development Host and test the context-menu commands.
Tip: for faster activation, you can add explicit activationEvents
in package.json
(e.g., onCommand:extension.copyFolderContent
).
🚀 Usage
Right‑click a folder or file(s) in the Explorer and choose a command:
UI Title |
Command ID |
Context |
Copy Folder Content (Markdown Fences + Lang) |
extension.copyFolderContent |
Folder (non‑recursive) |
Copy Folder Content Without Comments (Fences + Lang) |
extension.copyFolderContentWithoutComments |
Folder (non‑recursive, strips comments) |
Recursively Copy Folder Content (Fences + Lang) |
extension.copyFolderContentRecursively |
Folder (recursive) |
Recursively Copy Folder Content by Type (Fences + Lang) |
extension.copyFolderContentRecursivelyByType |
Folder (recursive, filter by extensions) |
Start New Collection with File |
extension.newCollectionAndAdd |
File |
Add File to Collection |
extension.addToCollection |
File |
Add File to Collection and Copy (Fences + Lang) |
extension.addToCollectionAndCopy |
File (copies immediately) |
Copy Collection and Clear (Fences + Lang) |
extension.copyCollectionAndClear |
File (over active collection) |
Copy Selected Files and Folders (Fences + Lang) |
extension.copySelectedFilesAndFolders |
Multi‑selection (files/folders) |
Copy Last Selection (Fences + Lang) |
extension.copyLastSelection |
Uses stored last selection |
🧾 Output example
------ lib/main.dart ------
```dart
void main() {
print('Hello, fences!');
}
```
------ src/app.ts ------
```typescript
export const hello = () => 'world';
```
Files without an extension get a plain fence (no language tag).
⚙️ Configuration
No settings required. If you want options (e.g., custom header/separator template, force a language), open an issue/PR.
📐 Technical details
Language by extension: simple mapping (e.g., .dart
→ dart
, .ts
→ typescript
, .yml
→ yaml
). Unknown types fall back to the raw extension string.
Encoding detection: attempts with jschardet
; if not utf-8
/ascii
and confidence > 0.5, decodes via iconv-lite
.
Strip comments: applies strip-comments
and collapses double blank lines.
Limits & safety:
- Selections with > 1000 files prompt for confirmation.
- Selections with > 5000 files are not stored as "Last Selection" to avoid huge state.
🧭 Roadmap
- Special‑case well‑known files without extension (e.g.,
Dockerfile
, Makefile
, .gitignore
).
- Configurable output template (header, separators, etc.).
- Optional keybindings.
🤝 Contributing
- Fork and branch:
feat/<something>
npm i
→ npm run watch
for incremental builds
- F5 to test in the dev host
- Use Conventional Commits (e.g.,
feat(copy): triple backticks + language tag
)
- Open a PR with description and examples
📝 License
MIT © SewaraDev.
Includes and credits the original work: mefengl/vscode-copy-folder-content.