Combina ArquivosExtensão para VS Code que combina vários arquivos selecionados no Explorer em um único arquivo, com todo o comportamento controlado por um arquivo de configuração global — único por usuário, válido em qualquer projeto, com autocomplete e validação ao editar. O resultado é aberto em uma aba não salva — basta pressionar Sumário
Início rápido
Como usarA extensão adiciona um item Combinar arquivos ao menu de contexto do Explorer. Você pode selecionar arquivos ou pastas (pastas são percorridas recursivamente). Toda a lógica de combinação — cabeçalhos, rodapés, separadores, remoções, ordem e codificação — vem do arquivo de configuração (global ou override de projeto). Referência rápidaPropriedades globais (e que cada grupo pode sobrescrever)
Item de
|
| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
encoding |
string | utf8 |
Codificação para ler os arquivos e gravar a saída (veja Codificação). |
order |
string | selection |
Estratégia de ordenação (veja Ordem). |
separator |
string | \n\n |
Conteúdo inserido entre os arquivos. |
header |
string[] | [] |
Linhas inseridas uma vez no início do resultado. |
footer |
string[] | [] |
Linhas inseridas uma vez no fim do resultado. |
fileHeader |
string[] | [] |
Linhas inseridas antes do conteúdo de cada arquivo. |
fileFooter |
string[] | [] |
Linhas inseridas depois do conteúdo de cada arquivo. |
removals |
lista | [] |
Regras de remoção de conteúdo. |
variables |
lista | [] |
Variáveis solicitadas ao usuário. |
output |
objeto | {untitled} |
Configuração de saída. |
groups |
lista | [] |
Grupos de configuração específicos. |
Todas as propriedades de texto suportam variáveis.
Codificação
A codificação pode ser definida globalmente (encoding) ou por grupo (a do grupo
sobrescreve a global). São aceitas todas as codificações reconhecidas pelo
iconv-lite, incluindo Windows-1252.
Exemplos de valores válidos:
| Valor | Descrição |
|---|---|
utf8 |
UTF-8 (padrão) |
utf16le / utf16be |
UTF-16 |
windows-1252 / cp1252 |
Windows-1252 (Europa Ocidental, com €, —, " ") |
windows-1250 / cp1250 |
Windows-1250 (Europa Central) |
iso-8859-1 / latin1 |
ISO-8859-1 (Latin-1) |
iso-8859-15 |
Latin-9 (Latin-1 com €) |
cp850 |
DOS Europa Ocidental |
Para salvar em Windows-1252:
{
"encoding": "windows-1252",
"output": { "mode": "file", "path": "dist", "fileName": "saida.txt" }
}
⚠️ Importante sobre o modo
untitled. Aencodingé sempre usada para ler os arquivos de entrada. Para gravar no encoding escolhido, useoutput.modeigual afileouask— aí a extensão grava os bytes diretamente em Windows-1252. No modountitled(aba não salva), o editor mantém o texto em UTF-8 até você salvar; ao pressionarCtrl+So VS Code salva em UTF-8 por padrão. Para salvar a aba em Windows-1252, use "Salvar com codificação" (paleta de comandos → Save with Encoding → Western (Windows 1252)) ou prefiramode: "file".
Grupos de configuração
Grupos permitem comportamentos diferentes por caminho. Cada grupo tem um name,
uma lista de patterns (glob) e, opcionalmente, qualquer propriedade global para
sobrescrever.
"groups": [
{
"name": "TypeScript",
"patterns": ["**/*.ts", "**/*.tsx"],
"priority": 10,
"output": { "language": "typescript" },
"fileHeader": ["// --- ${fileName} ---", ""]
}
]
Regras de seleção (herança em cascata):
- Um grupo é considerado apenas quando todos os arquivos selecionados
correspondem a pelo menos um de seus
patterns. - Todos os grupos compatíveis são aplicados em cascata, do menor para o maior
priority(padrão0). Cada propriedade usa o valor do grupo mais específico (maior priority) que a define; o que ele não define é herdado dos grupos de prioridade menor e, por fim, das propriedades globais do topo. - Em empate de
priority, vale a ordem de declaração (o declarado depois vence). outputé mesclado em profundidade (campo a campo); as listas (header,footer,removals, etc.) são substituídas inteiras pelo grupo mais específico que as define.- Se nenhum grupo corresponder, usam-se as propriedades globais.
Os patterns aceitam glob: ** (vários segmentos), * (um segmento) e ? (um caractere).
Os caminhos comparados são relativos à raiz do workspace.
Exemplo de herança: um "SQL Global" + grupos específicos
"groups": [
{
// Base comum a TODO arquivo .sql (menor priority).
"name": "SQL Global",
"patterns": ["**/*.sql"],
"priority": 10,
"encoding": "windows-1252",
"order": "name-asc",
"separator": "\n",
"removals": [
{ "type": "regex", "pattern": "USE\\s*\\[AB_EFINANCEIRA\\]\\s*GO" }
],
"header": ["USE AB_EFINANCEIRA", ""],
"fileHeader": ["/* ${fileName} (${index}/${total}) */"],
"fileFooter": ["GO"],
"output": { "mode": "file", "path": "unificados", "language": "sql" }
},
{
// Específico: herda tudo do SQL Global e só ajusta o necessário.
"name": "Procedures SQL",
"patterns": ["**/PROCEDURES/**/*.sql", "**/PROC/**/*.sql"],
"priority": 30,
// Pede ${versao} apenas quando você combina procedures.
"variables": [{ "name": "versao", "prompt": "Versão do script?", "required": true }],
"footer": ["", "INSERT INTO VERSAO_SISTEMA (...) VALUES ('RN', '${versao}', ...)", "GO"],
"output": { "fileName": "procedure-${date}.sql" }
},
{
"name": "Tabelas SQL",
"patterns": ["**/Tabelas/**/*.sql", "**/TAB/**/*.sql"],
"priority": 12,
"footer": ["", "INSERT INTO VERSAO_SISTEMA (...) VALUES (...)", "GO"],
"output": { "fileName": "tabelas-${date}.sql" }
}
]
Ao combinar arquivos em PROCEDURES/, a cascata é SQL Global → Procedures SQL. O resultado herda
encoding, order, separator, removals, header, fileHeader, fileFooter do SQL Global, e
do Procedures SQL vêm o footer e o output.fileName — com output mesclado, virando
{ mode: "file", path: "unificados", language: "sql", fileName: "procedure-${date}.sql" }.
Remoção de conteúdo
Aplicadas a cada arquivo, na ordem declarada, antes da montagem do resultado.
"removals": [
{ "type": "literal", "value": "// TODO" },
{ "type": "regex", "pattern": "console\\.log\\(.*\\);?", "flags": "g" }
]
literal— remove todas as ocorrências do texto exato (value).regex— remove conforme a expressão regular (pattern+flags, padrãog).
Variáveis de entrada
Solicitadas ao usuário no início da execução. Os valores ficam disponíveis em qualquer campo que suporte substituição.
"variables": [
{ "name": "autor", "prompt": "Nome do autor?", "required": true },
{ "name": "versao", "default": "1.0.0" },
{ "name": "ambiente", "options": ["dev", "prod"] }
]
| Campo | Descrição |
|---|---|
name |
Nome usado na substituição (ex.: ${autor}). Obrigatório. |
prompt |
Texto exibido na caixa de entrada. |
description |
Texto auxiliar (placeholder). |
default |
Valor padrão pré-preenchido. |
required |
Se true, aborta quando o valor ficar vazio. |
password |
Esconde o valor digitado. |
options |
Exibe uma lista de opções em vez de texto livre. |
Variáveis também funcionam dentro de grupos. Declare
variablesno topo e/ou em qualquer grupo. As variáveis do global e de todos os grupos aplicáveis são reunidas e solicitadas uma única vez (sem duplicar porname). Se o mesmonameaparecer em mais de um lugar, vale a definição do grupo mais específico (maiorpriority). Assim, por exemplo, um grupo "Procedures SQL" pode pedir${versao}só quando você combina procedures.
Saída
"output": {
"mode": "untitled", // "untitled" (padrão) | "file" | "ask"
"path": "dist", // usado em "file"/"ask"; relativo ao workspace ou absoluto
"fileName": "combinado-${date}.txt",
"language": "markdown" // linguagem da aba (realce de sintaxe)
}
untitled(padrão) — abre uma aba não salva. Salve comCtrl+Sonde quiser.file— grava diretamente no caminho resolvido (path+fileName).ask— abre o diálogo "Salvar como" no momento da execução.
Exemplos completos
Exemplo genérico
Configuração mínima e direta, sem grupos. Combina qualquer seleção, ordena por nome, adiciona um cabeçalho e identifica cada arquivo. O resultado abre em uma aba não salva.
{
"encoding": "utf8",
"order": "name-asc",
"separator": "\n\n",
"header": [
"/* ==================================================",
" * Projeto : ${workspaceName}",
" * Gerado : ${datetime}",
" * Autor : ${autor}",
" * Arquivos: ${total}",
" * ================================================== */",
""
],
"footer": [
"",
"/* Fim do arquivo combinado — ${total} arquivo(s). */"
],
"fileHeader": [
"// ----- INÍCIO: ${relativePath} (${index}/${total}) -----",
""
],
"fileFooter": [
"",
"// ----- FIM: ${fileName} -----"
],
"removals": [
{ "type": "regex", "pattern": "^\\s*//\\s*TODO.*$", "flags": "gm" }
],
"variables": [
{ "name": "autor", "prompt": "Nome do autor?", "required": true }
],
"output": {
"mode": "untitled",
"language": "plaintext"
}
}
Exemplo com grupo
Configuração com grupos: arquivos .ts/.tsx recebem realce TypeScript e um
cabeçalho próprio; arquivos .md da pasta docs/ são gravados diretamente em disco.
Qualquer outra seleção cai nas propriedades globais.
{
// ----- Propriedades globais (fallback) -----
"encoding": "utf8",
"order": "path-asc",
"separator": "\n\n",
"header": ["// ${workspaceName} — combinado em ${date}", ""],
"fileHeader": ["// >>> ${relativePath}", ""],
"variables": [
{ "name": "autor", "prompt": "Autor?", "default": "Equipe" }
],
"output": { "mode": "untitled" },
// ----- Grupos específicos -----
"groups": [
{
"name": "TypeScript",
"patterns": ["**/*.ts", "**/*.tsx"],
"priority": 20,
"encoding": "utf8",
"output": { "language": "typescript" },
"header": [
"/* Fontes TypeScript de ${workspaceName} */",
"/* Autor: ${autor} — ${datetime} */",
""
],
"fileHeader": [
"// ===== ${fileName} (${index}/${total}) =====",
""
],
"removals": [
{ "type": "regex", "pattern": "console\\.log\\(.*\\);?", "flags": "g" }
]
},
{
"name": "Documentação",
"patterns": ["docs/**/*.md", "**/README.md"],
"priority": 10,
"separator": "\n\n---\n\n",
"header": ["# Documentação combinada — ${workspaceName}", ""],
"fileHeader": ["## ${fileBaseName}", ""],
"output": {
"mode": "file",
"path": "dist",
"fileName": "docs-${date}.md",
"language": "markdown"
}
}
]
}
Lembre-se das regras de seleção de grupo: todos os arquivos da seleção precisam casar com os
patternsdo grupo. Todos os grupos compatíveis são aplicados em cascata (menor → maiorpriority). Selecionar arquivos.tse.mdjuntos cai nas propriedades globais, pois nenhum grupo cobre os dois tipos ao mesmo tempo.
Variáveis disponíveis
Use a sintaxe ${nome}. Tokens desconhecidos são mantidos literalmente.
Globais (em qualquer campo):
| Variável | Valor |
|---|---|
${workspaceName} |
Nome do workspace |
${workspaceFolder} / ${workspacePath} |
Caminho do workspace |
${date} |
Data atual (AAAA-MM-DD) |
${time} |
Hora atual (HH:mm:ss) |
${datetime} |
Data e hora |
${isoDate} |
Data/hora em ISO 8601 |
${year} ${month} ${day} |
Componentes da data |
${hour} ${minute} ${second} |
Componentes da hora |
${total} |
Quantidade de arquivos combinados |
${suaVariavel} |
Qualquer variável de entrada declarada |
Por arquivo (apenas em fileHeader e fileFooter):
| Variável | Valor |
|---|---|
${fileName} |
Nome do arquivo com extensão |
${fileBaseName} |
Nome sem extensão |
${fileExt} |
Extensão sem ponto (ts) |
${fileExtension} |
Extensão com ponto (.ts) |
${filePath} |
Caminho absoluto |
${fileDir} |
Diretório do arquivo |
${relativePath} |
Caminho relativo ao workspace |
${index} |
Posição do arquivo (1-based) |
${indexZero} |
Posição do arquivo (0-based) |
${fileSize} |
Tamanho em bytes |
${lines} |
Número de linhas (após remoções) |
Ordem de processamento
Defina em order:
| Valor | Ordenação |
|---|---|
selection |
Ordem da seleção (padrão) |
name-asc |
Nome do arquivo (A→Z) |
name-desc |
Nome do arquivo (Z→A) |
path-asc |
Caminho relativo (A→Z) |
path-desc |
Caminho relativo (Z→A) |
extension |
Por extensão, depois por nome |
mtime-asc |
Modificação mais antiga primeiro |
mtime-desc |
Modificação mais recente primeiro |
size-asc |
Menor primeiro |
size-desc |
Maior primeiro |
Fluxo de execução
- Identifica os arquivos selecionados (pastas são expandidas).
- Carrega a configuração (Settings do VS Code + override por arquivo, se houver).
- Determina o grupo aplicável (ou usa o global).
- Aplica as sobrescritas do grupo sobre as propriedades globais.
- Solicita os valores das variáveis de entrada.
- Ordena e processa os arquivos (decodifica, aplica remoções).
- Aplica cabeçalhos, rodapés e separadores.
- Monta o conteúdo final.
- Entrega conforme
output.mode(aba não salva por padrão).
Tratamento de erros
A configuração é validada antes da execução. A extensão exibe mensagens claras para:
- Erros de sintaxe no JSON (no arquivo de override).
configPathapontando para um arquivo inexistente.- Variáveis obrigatórias não preenchidas.
- Codificações inválidas.
- Expressões regulares ou regras de remoção mal formadas.
- Grupos sem
nameou sempatterns.
Diante de um erro crítico, a execução não continua.
Configurações da extensão (VS Code)
A configuração em si fica no arquivo global (ou no override de projeto). A única setting do VS Code é o caminho do override:
| Configuração | Padrão | Descrição |
|---|---|---|
combinaArquivos.configPath |
"" (vazio) |
Opcional. Caminho de um arquivo .jsonc/.json que sobrescreve a config global neste projeto. Relativo à raiz do workspace ou absoluto. Vazio = usar a configuração global. |
Comandos
| Comando | Onde |
|---|---|
| Combina Arquivos: Combinar arquivos | Menu de contexto do Explorer |
| Combina Arquivos: Abrir configuração global | Paleta de comandos (Ctrl+Shift+P) |
| Combina Arquivos: Criar configuração de projeto (override) | Paleta de comandos (Ctrl+Shift+P) |