Extensã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 Ctrl+S para salvar onde você quiser.
Sumário
- Início rápido
- Como usar
- Referência rápida
- Onde configurar
- Configuração
- Exemplos completos
- Variáveis disponíveis
- Ordem de processamento
- Fluxo de execução
- Tratamento de erros
- Configurações da extensão (VS Code)
Início rápido
- Abra a paleta de comandos (
Ctrl+Shift+P) e execute Combina Arquivos: Abrir configuração global. Na primeira vez, um arquivo já preenchido é criado e aberto. Ajuste o que quiser e salve — vale em todos os projetos. - No Explorer, selecione dois ou mais arquivos (use
Ctrl/Shiftpara multiseleção). - Clique com o botão direito e escolha Combinar arquivos.
- Preencha as variáveis solicitadas (se houver).
- O resultado abre em uma aba não salva. Salve com
Ctrl+S.
Funciona sem configurar nada: sem arquivo de configuração, os padrões internos já combinam os arquivos com uma linha em branco entre eles.
Como usar
A 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ápida
Propriedades globais (e que cada grupo pode sobrescrever)
encoding—string(padrão"utf8"). Codificação para ler os arquivos e gravar a saída. Aceita qualquer valor doiconv-lite:utf8,utf16le,windows-1252,cp1252,iso-8859-1,windows-1250,cp850…order—string(padrão"selection"). Ordem em que os arquivos são combinados. Valores:selection,name-asc,name-desc,path-asc,path-desc,extension,mtime-asc,mtime-desc,size-asc,size-desc.separator—string(padrão"\n\n"). Conteúdo inserido entre um arquivo e outro.header—string[](padrão[]). Linhas inseridas uma vez no início do resultado (unidas por\n;""= linha em branco).footer—string[](padrão[]). Linhas inseridas uma vez no fim do resultado.fileHeader—string[](padrão[]). Linhas inseridas antes do conteúdo de cada arquivo.fileFooter—string[](padrão[]). Linhas inseridas depois do conteúdo de cada arquivo.removals—objeto[](padrão[]). Regras de remoção aplicadas a cada arquivo, na ordem declarada.variables—objeto[](padrão[]). Variáveis pedidas ao usuário no início (também válidas dentro de grupos).output—objeto(padrão{ "mode": "untitled" }). Configuração de saída.groups—objeto[](padrão[]). Grupos específicos por padrão de caminho, aplicados em cascata.
Item de removals
type—"literal"|"regex". Tipo da remoção. Obrigatório.value—string. Texto exato a remover (quandotype=literal).pattern—string. Expressão regular (quandotype=regex).flags—string(padrão"g"). Flags da regex (ex.:gi,gm).
Item de variables
name—string. Nome usado na substituição, ex.:${autor}. Obrigatório.prompt—string. Texto exibido na caixa de entrada.description—string. Texto auxiliar (placeholder).default—string. Valor padrão pré-preenchido.required—boolean(padrãofalse). Aborta se o valor ficar vazio.password—boolean(padrãofalse). Esconde o valor digitado.options—string[]. Exibe um seletor de opções em vez de texto livre.
Objeto output
mode—"untitled"|"file"|"ask"(padrão"untitled").untitledabre aba não salva (Ctrl+S);filegrava direto;askpergunta o local.path—string. Caminho de saída (modosfile/ask); relativo ao workspace ou absoluto. Suporta variáveis.fileName—string. Nome sugerido do arquivo. Suporta variáveis.language—string. Linguagem da aba para realce de sintaxe (ex.:sql,markdown,typescript).
Item de groups
name—string. Nome do grupo (usado em mensagens). Obrigatório.patterns—string[]. Padrões glob de caminho que ativam o grupo (**,*,?). Obrigatório.priority—number(padrão0). Quanto maior, mais específico (aplicado por último na cascata, vence).- + qualquer propriedade global —
encoding,order,separator,header,footer,fileHeader,fileFooter,removals,output,variables. Sobrescrevem o que definirem; o resto é herdado.
Setting do VS Code
combinaArquivos.configPath—string(padrão""). Opcional. Caminho de um arquivo.jsonc/.jsonque sobrescreve a config global só naquele projeto. Vazio = usar a configuração global.
Onde configurar
-
Configuração global (recomendado). Comando Combina Arquivos: Abrir configuração global. É um arquivo
.jsoncúnico, guardado na área global da extensão (globalStorage), que vale em qualquer pasta/projeto.- Aceita comentários (JSONC) e tem autocomplete + validação ao editar (via JSON Schema).
- Como é um arquivo seu, dá para versionar/fazer backup à parte.
-
Override por projeto (opcional). Comando Combina Arquivos: Criar configuração de projeto (override) gera um
.combina-arquivos.jsoncna raiz do workspace (a partir da config atual) e oferece ativá-lo automaticamente emcombinaArquivos.configPath. Quando ativo, ele sobrescreve a global apenas naquele projeto.
Precedência: override de projeto (
configPath) ➜ arquivo global ➜ padrões internos. O primeiro que existir é usado.
Configuração
O arquivo (global ou de projeto) é JSONC (aceita comentários). Estrutura geral:
{
// Propriedades globais (usadas quando nenhum grupo corresponde)
"encoding": "utf8",
"order": "name-asc",
"separator": "\n\n",
"header": ["// Projeto: ${workspaceName} — ${datetime}", ""],
"footer": ["", "// Fim — ${total} arquivo(s)."],
"fileHeader": ["// ===== ${relativePath} (${index}/${total}) =====", ""],
"fileFooter": [],
"removals": [],
"variables": [],
"output": { "mode": "untitled" },
"groups": []
}
Cabeçalhos e rodapés são listas de strings. Cada item da lista é uma linha; os itens são unidos por
\n. Para inserir uma linha em branco, adicione"". Uma lista vazia ([]) não insere nada.
Propriedades globais
| 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) |