Emmet: Balancear, Pular e Selecionar
Nas aulas 14–15 você aprendeu Expandir e Envolver — as duas ações principais de "entrada" do Emmet. Mas no desenvolvimento real, você ainda precisa editar após expandir — alterar o conteúdo de 5 itens
<li>, adicionar comentários, remover tags externas. Esta aula ensina o "trio de edição" do Emmet: Balancear / Próximo Ponto de Edição / Selecionar Item, mais Alternar Comentário e Remover Tag. Estas 5 ações permitem continuar acelerando de 3 a 5 vezes após a expansão.
1. O Que Você Vai Aprender
- Balancear / Ir para Par Correspondente: Pular para tags HTML correspondentes (ou chaves CSS), suportando navegação bidirecional para dentro e para fora
- Próximo/Ponto de Edição Anterior: Navegar entre múltiplos tabstops (pontos editáveis) após a expansão do Emmet
- Selecionar Item: Selecionar o elemento atual em níveis progressivamente mais refinados (nome da tag → atributo completo → valor do atributo → classe distinta → elemento inteiro), sem cruzar elementos
- Alternar Comentário: Alternar entre comentários HTML
<!-- -->e comentários CSS/* */(sensível ao contexto) - Remover Tag: Remover a tag externa preservando o conteúdo (para renomear ou remover casca)
2. A História Real de Uma Desenvolvedora Front-End
(1) Ponto de Dor: Após Expandir 100 Linhas de HTML, Encontrar o Lugar para Editar Leva 30 Segundos
Alice escreveu o contêiner HTML para uma página de post de blog:
<article>
<header>
<h1>Hello World</h1>
<time>2026-07-31</time>
</header>
<section>
<p>...</p>
<p>...</p>
</section>
<footer>
<address>...</address>
</footer>
</article>
Ela agora precisa fazer 3 substituições em lote:
- Alterar
<h1>Hello World</h1>para<h1>Hello Emmet</h1> - Adicionar uma linha de texto placeholder lorem ipsum em cada uma das 2 tags
<p> - Adicionar um comentário ao
<footer>
Seu fluxo de trabalho:
- Encontrar
<h1>:Ctrl+F→ digitarHello World→ substituir porHello Emmet(5 segundos) - Encontrar 1º
<p>:Ctrl+F→ substituir (5 segundos); encontrar 2º<p>:Ctrl+Fnovamente (5 segundos) - Encontrar
<footer>:Ctrl+F→ adicionar comentário (5 segundos)
Total: 20 segundos, 9 operações Ctrl+F. Alice pensa: HTML é inerentemente uma estrutura de árvore — deveria haver atalhos de "navegação baseada em estrutura". Mover o cursor para <h1>, pressionar uma única tecla para pular diretamente para </h1>, pressionar uma tecla para pular para o <header> externo... O Emmet deveria ter esses "atalhos de estrutura de árvore".
(2) A Solução do Trio de Edição do Emmet
As 5 ações de edição do Emmet são "atalhos de estrutura de árvore" — transformando a estrutura de árvore HTML/CSS em sua ferramenta de navegação.
A solução da Alice:
- Balancear: Cursor dentro de
<h1>, pressioneCtrl+Alt+Bpara selecionar até a tag de fechamento</h1>→ 2 segundos - Próximo Ponto de Edição: Após expandir
ul>li*3, pressioneCtrl+Alt+→para pular para a posição de conteúdo de cada<li>→ 5 segundos - Selecionar Item: Cursor em
<p>, pressioneShift+Ctrl+.para selecionar o próximo<p>→ 3 segundos - Alternar Comentário: Cursor em
<footer>, pressioneCtrl+/para adicionar comentário<!-- -->→ 1 segundo - Remover Tag: Cursor em
<h1>, pressioneShift+Ctrl+;para excluir<h1>mas manter "Hello World" → 2 segundos
Total: 13 segundos, 5 operações de atalho. 35% mais rápido que substituição com Ctrl+F, com zero substituições falsas (Ctrl+F pode facilmente corresponder a múltiplos locais).
(3) Benefícios
O trio de edição reduz o tempo de "edição pós-expansão" de 20 segundos para 13 segundos e, mais importante, reduz operações incorretas — a substituição com Ctrl+F pode facilmente pular ou substituir demais; a navegação estrutural do Emmet se move ao longo da árvore HTML, nunca falhando. Após dominar estas 5 ações, o tempo total de edição da Alice para uma página de artigo de 5 parágrafos cai de 5 minutos para 2 minutos.
3. Definição Principal das 5 Ações de Edição
O Emmet fornece 5 ações de "aceleração de edição" cobrindo as 5 operações pós-expansão mais comuns: salto de tag, navegação de tabstop, seleção de elemento, alternância de comentário e remoção de tag externa.
| Ação | Propósito | Caso de Uso |
|---|---|---|
| Balancear | Selecionar conteúdo (balancear para dentro/fora) | Selecionar conteúdo da tag atual / externo |
| Ir para Par Correspondente | Pular para tag correspondente | Mover para </tag> ou <tag> |
| Próximo/Ponto de Edição Anterior | Pular para próximo tabstop/anterior | Navegar posições editáveis após expansão |
| Selecionar Item | Selecionar próximo elemento/anterior com mesmo nome | Selecionar em lote elementos semelhantes |
| Alternar Comentário | Alternar comentários | Comentário inteligente HTML/CSS |
| Remover Tag | Remover tag externa | Remover casca, manter conteúdo |
4. Comparação de Teclas de Acionamento Entre 4 Editores
As 5 ações têm teclas de acionamento significativamente diferentes entre 4 editores principais porque são ações relativamente novas e o progresso da implementação varia por editor. Fato chave: O VSCode tem apenas 1 atalho padrão para as ações integradas do Emmet — Tab aciona Expandir Abreviação (aula 14). Todas as outras ações Emmet (Balancear / Envolver / Selecionar Item / Remover Tag, etc.) não têm atalho padrão no VSCode e devem ser acionadas via Paleta de Comandos ou keybindings.json personalizado.
| Ação | VSCode | WebStorm | Sublime | Atom |
|---|---|---|---|---|
| Expandir Abreviação | Tab (padrão, aula 14) |
Tab |
Ctrl+E |
Tab |
| Balancear | Nenhum (Paleta de Comandos / keybindings.json personalizado) | Ctrl+] |
Ctrl+D |
Ctrl+Alt+B |
| Ir para Par Correspondente | Nenhum (Paleta de Comandos / keybindings.json personalizado) | Ctrl+M |
Ctrl+Alt+J |
Ctrl+Alt+J |
| Próximo Ponto de Edição | Nenhum (Paleta de Comandos / keybindings.json personalizado) | Ctrl+Alt+→ |
Ctrl+Alt+→ |
Ctrl+Alt+→ |
| Selecionar Item | Nenhum (Paleta de Comandos / keybindings.json personalizado) | Shift+Alt+. |
Shift+Ctrl+. |
Shift+Ctrl+. |
| Alternar Comentário | Sem padrão Emmet (Ctrl+/ nativo do VSCode comenta a linha atual) |
Ctrl+/ |
Ctrl+/ |
Ctrl+/ |
| Remover Tag | Nenhum (Paleta de Comandos / keybindings.json personalizado) | Ctrl+Shift+Delete |
Ctrl+Shift+; |
Ctrl+Shift+; |
Ctrl+Alt+B / Shift+Ctrl+. / Shift+Ctrl+;, etc.) devem ser declarados explicitamente no keybindings.json com comandos como "command": "editor.emmet.action.balance" / "editor.emmet.action.selectItem" / "editor.emmet.action.removeTag". O primeiro uso deve começar pela Paleta de Comandos (Ctrl+Shift+P → Emmet: Balancear, etc.) — isso verifica o suporte do editor para a ação e revela o nome exato do comando (que você então escreve no keybindings.json).
5. Diagrama Mermaid: Caminho de Movimento do Cursor no Editor
O diagrama abaixo mostra o caminho de navegação do cursor entre pontos editáveis (tabstops) após o Emmet expandir ul>li*3.
graph TB
Start([Usuário digita ul>li*3<br>Pressiona Tab para expandir]) --> Expand[Emmet expande 4 linhas de HTML]
Expand --> S1[tabstop 1:<br>Posição de conteúdo do primeiro li em ul]
S1 -->|Pressiona Ctrl+Alt+→| S2[tabstop 2:<br>Posição de conteúdo do segundo li em ul]
S2 -->|Pressiona Ctrl+Alt+→| S3[tabstop 3:<br>Posição de conteúdo do terceiro li em ul]
S3 -->|Pressiona Ctrl+Alt+→| End([Ponto final da expansão:<br>Após tag de fechamento ul])
S1 -->|Pressiona Ctrl+Alt+←| Start
S2 -->|Pressiona Ctrl+Alt+←| S1
S3 -->|Pressiona Ctrl+Alt+←| S2
End -->|Pressiona Ctrl+Alt+←| S3
style Start fill:#3b82f6,color:#fff
style Expand fill:#8b5cf6,color:#fff
style S1 fill:#10b981,color:#fff
style S2 fill:#10b981,color:#fff
style S3 fill:#10b981,color:#fff
style End fill:#ef4444,color:#fff
ul>li*3, existem 3 tabstops (posição de conteúdo de cada li) + 1 ponto final (após </ul>). Próximo Ponto de Edição salta entre estes um por um. Para trás salta para o ponto anterior, Para frente salta para o próximo. Notavelmente: isso NÃO é "pressionar Tab" — pressionar Tab no VSCode após a expansão é "indentação" ou "aceitar expansão Emmet" (se ainda estiver no atalho original), mas para continuar navegando tabstops após a expansão, use Ctrl+Alt+→ em vez de Tab.
6. Exemplos Práticos
Os 5 exemplos a seguir cobrem os cenários principais do trio de edição + Alternar Comentário + Remover Tag.
▶ Exemplo: Balancear — Pular para Tag <div> Correspondente (Dificuldade: ★)
A "navegação de tag" mais comum — cursor dentro de <div>, pressione Balancear para selecionar conteúdo, pressione novamente para selecionar a tag inteira.
Código original:
<div class="container">
<p>Hello World</p>
</div>
Passos:
- Colocar o cursor em qualquer lugar dentro da área de conteúdo de
<p>Hello World</p> - Pressionar
Ctrl+Alt+Buma vez → selecionaHello World(conteúdo) - Pressionar
Ctrl+Alt+Bnovamente → seleciona<p>Hello World</p>(tag p inteira) - Pressionar
Ctrl+Alt+Bnovamente → seleciona todo o<div>e todo o seu conteúdo - Continuar pressionando
Ctrl+Alt+B→ seleção expande para fora nível por nível (balancear para fora)
Pressionar novamente (Shift+Ctrl+Alt+B) → seleção contrai para dentro (balancear para dentro)
Saída:
TEXT 📖 Somente leituraExplicação: O "balanceamento bidirecional" do Balancear é um recurso exclusivo do Emmet — a maioria dos editores só suporta "expansão para fora", mas o Emmet também suporta contração para dentro. Este design de "tamanho de seleção ajustável" torna o Balancear uma ferramenta versátil para edição HTML: selecionar 1 palavra, selecionar 1 tag, selecionar 1 contêiner, selecionar 1 seção — ajuste nível por nível com cada pressionamento de Balancear. **Detalhe importante**: o Balancear do Emmet não é "movimento de cursor" — é "mudança de seleção". O cursor permanece no lugar, mas o intervalo selecionado expande ou encolhe. Se você quiser apenas "pular" sem "selecionar", use Ir para Par Correspondente.
▶ Exemplo: Próximo Ponto de Edição — Saltando Tabstops Após Expansão (Dificuldade: ★★)
Após expandir ul>li*3, pressione Ctrl+Alt+→ para pular para a posição de conteúdo de cada li.
Código original:
ul>li*3
Passos:
- Pressionar Tab para acionar Expandir → 4 linhas de HTML aparecem
- O cursor está no tabstop 1 (dentro do primeiro li)
- Pressionar
Ctrl+Alt+→→ pular para tabstop 2 (dentro do segundo li) - Pressionar
Ctrl+Alt+→→ pular para tabstop 3 (dentro do terceiro li) - Pressionar
Ctrl+Alt+→→ pular para o ponto final (após</ul>)
HTML expandido:
<ul>
<li>|</li>
<li>|</li>
<li>|</li>
</ul>
Saída:
TEXT 📖 Somente leituraExplicação: A aula 14 sobre Expandir Abreviação mencionou que "a expansão inclui tabstops" — mas não explicou como navegar por eles. Próximo Ponto de Edição é a ação dedicada para "pular para o próximo tabstop". `Ctrl+Alt+→` é para frente, `Ctrl+Alt+←` é para trás. **Por que não usar a tecla Tab?** Porque após a conclusão da expansão, o VSCode trata Tab como "indentação" (o cursor já está em uma "posição editável" dentro do conteúdo do li), então não acionará a navegação Emmet novamente. Para "pular entre tabstops", use `Ctrl+Alt+→`. Esta é a decisão chave de design do Emmet separando "acionamento de entrada" (Tab) de "navegação de edição" (Ctrl+Alt+→).
▶ Exemplo: Selecionar Item — Seleção de Granularidade Progressiva (Dificuldade: ★★)
HTML contém um <p> com uma classe; o cursor está no texto. Pressione Selecionar Item para expandir progressivamente a seleção — apenas dentro do elemento atual, nunca pulando para elementos adjacentes.
Código original:
<p class="fruit">Apple</p>
Passos:
- Colocar o cursor no texto
Appledentro de<p class="fruit">Apple</p> - Pressionar
Shift+Ctrl+.uma vez → selecionaApple(nó de texto) - Pressionar novamente → seleciona
fruit(nome de classe distinto) - Pressionar novamente → seleciona
class="fruit"(valor do atributo) - Pressionar novamente → seleciona
class="fruit"(atributo completo) - Pressionar novamente → seleciona todo o
<p class="fruit">Apple</p>(elemento inteiro)
Saída:
TEXT 📖 Somente leituraExplicação: A "seleção de expansão" do item selecionado funciona progressivamente mais profundamente **apenas dentro do elemento atual** - do texto → classe distinta → valor do atributo → atributo completo → elemento inteiro (documentos oficiais: "expande a seleção atual para seu item pai"). Ele **não cruza elementos** - para pular de `<p>Apple</p>` para o próximo `<p>Banana</p>` para seleção de lote, use `Ctrl+F2` (Alterar todas as ocorrências) ou multicursor do VSCode (`Ctrl+D` para o próximo, `Ctrl+Shift+L` para todos com o mesmo nome) - esses são recursos IDE nativos, não Emmet. **`Shift+Ctrl+.` está para frente (expansão para fora)**, `Shift+Ctrl+,` está para trás (contração para dentro). Comportamento semelhante em CSS: seletor → propriedade → valor; útil para cenários de "seleção rápida de uma única linha de propriedade CSS". Essa "expansão progressiva de granularidade" imita a seleção estendida do JetBrains IDE (estilo W/A).
▶ Exemplo: Alternar Comentário — Alternar Comentários Ligado/Desligado (Dificuldade: ★)
Cursor na tag <footer> em HTML, pressione Ctrl+/ para adicionar comentário <!-- -->.
Código original (sem comentário):
<footer>
<address>contato@exemplo.com</address>
</footer>
Passos:
- Colocar o cursor em qualquer lugar na tag
<footer> - Pressionar
Ctrl+/→ toda a tag<footer>é envolvida com<!-- -->
Expandido:
<!-- <footer>
<address>contato@exemplo.com</address>
</footer> -->
Pressionar Ctrl+/ novamente → comentário removido (restaura HTML original)
Saída:
TEXT 📖 Somente leituraExplicação: A "sensibilidade ao contexto" do Alternar Comentário é o que distingue o Emmet do comentário comum do editor. O `Ctrl+/` comum apenas comenta a linha atual; o Alternar Comentário do Emmet **reconhece o contexto atual** — em HTML, comenta a tag inteira (já que comentários HTML podem abranger linhas); em CSS, comenta a regra ou propriedade atual. Esta "sensibilidade ao contexto" torna o Alternar Comentário mais útil que o comentário integrado do IDE — menos pressionamentos de tecla. **Nota**: Alternar Comentário é igualmente sensível ao contexto em CSS — quando o cursor está na linha completa `padding: 10px;`, `Ctrl+/` comenta todo o `padding: 10px;`; quando o cursor está na palavra `padding`, `Ctrl+/` ainda comenta `padding: 10px;` (a propriedade inteira). Da mesma forma em HTML — cursor em qualquer lugar em `<p>` comenta todo o `<p>...</p>`.
▶ Exemplo: Remover Tag — Remover Tag Externa, Manter Conteúdo (Dificuldade: ★★)
Cursor em <h1>, pressione Shift+Ctrl+; para excluir <h1></h1> mas manter o conteúdo de texto.
Código original:
<h1>Hello World</h1>
Passos:
- Colocar o cursor na tag
<h1> - Pressionar
Shift+Ctrl+;→ exclui<h1>e</h1>, mantém "Hello World"
Expandido:
Hello World
Cenário composto: removendo tags externas aninhadas
Código original:
<section class="hero">
<h1>Welcome</h1>
</section>
Passos:
- Colocar o cursor na tag
<section> - Pressionar
Shift+Ctrl+;→ exclui<section>e</section>, mantém<h1>Welcome</h1>
Expandido:
<h1>Welcome</h1>
Saída:
TEXT 📖 Somente leituraExplicação: O "remoção de casca, manter conteúdo" do Remover Tag é a mais concisa das ações de edição do Emmet — um pressionamento de tecla remove a tag externa. Cenários comuns: ① revisão de design — o contêiner `<header>` original não é mais desejado, mas o texto `<h1>` dentro precisa ser preservado; ② depuração temporária — remover a camada externa para inspecionar estilos; ③ refatoração — reduzir profundidade de aninhamento DOM. Nota: Remover Tag não remove múltiplas camadas de uma vez — para remover 3 camadas de aninhamento (div > section > h1), pressione `Shift+Ctrl+;` 3 vezes consecutivas. A tecla ponto e vírgula (`;`) em `Shift+Ctrl+;` é uma tecla de "comando macro" em muitos editores — correspondendo ao comando interno `removeTag` do Emmet.
7. Árvore de Decisão para Escolher Entre as 5 Ações
No desenvolvimento real, as 5 ações frequentemente precisam ser combinadas. Aqui está uma árvore de decisão:
| Cenário | Ação Recomendada | Motivo |
|---|---|---|
Quer pular para </tag> para ver a tag de fechamento |
Ir para Par Correspondente |
Pular apenas, sem seleção |
Quer selecionar toda a <tag> para copiá-la |
Balancear |
Seleção expande 1 nível |
Quer substituir em lote 5 elementos <p> |
Selecionar Item |
Selecionar elementos com mesmo nome um por um |
Quer comentar uma <div> |
Alternar Comentário |
Comentário inteligente sensível ao contexto |
Quer remover temporariamente <div> externa para depuração |
Remover Tag |
Remoção de casca, manter conteúdo |
| Quer localizar posições editáveis após expansão | Próximo Ponto de Edição |
Pular para tabstops |
❓ Perguntas Frequentes
P: Qual a diferença entre Balancear e Ir para Par Correspondente? R: Balancear seleciona (mudança de seleção), Ir para Par Correspondente pula (movimento do cursor). O primeiro é bom para "copiar uma tag inteira", o último para "localizar a tag de fechamento para inspecioná-la". Cenário real: ao editar HTML aninhado, você quer ver onde
<section>termina — use Ir para Par Correspondente para pular até lá; você quer copiar todo o bloco<section>...</section>— use Balancear para selecioná-lo. Ambos são comuns; aprenda ambos.
P: Pressionar
Ctrl+Alt+→pula para o próximo tabstop, mas pressionar Tab após a expansão não seria mais simples? R: Após a expansão no VSCode, a tecla Tab é a tecla de indentação comum quando o cursor está na posição de conteúdo de um li — não acionará Próximo Ponto de Edição. Tab e Próximo Ponto de Edição são dois mecanismos diferentes: use Tab para aceitar completar ou indentar, useCtrl+Alt+→para pular para o próximo ponto editável. Se você quiser usar Tab para pular tabstops, precisa definiremmet.triggerExpansionOnTabcomo true no settings.json (ativado por padrão), mas isso só se aplica "antes da expansão" — após a expansão, Tab não carrega mais semântica de "pular tabstop".
P: Quando Selecionar Item seleciona elementos HTML, class e id contam como "mesmo nome"? R: Não. A correspondência de "mesmo nome" do Selecionar Item é por nome de tag (
<p>vs<p>), não por class ou id. Então<p class="a">e<p class="b">são ambos tratados como "elementos de mesmo nome" pelo Selecionar Item. Para selecionar por class, use "Alterar Todas as Ocorrências" (Ctrl+F2) do VSCode — esse é um recurso nativo do IDE, não algo que o Emmet fornece.
P: Após Remover Tag, como faço para restaurar a tag externa? R: Remover Tag não tem semântica de "desfazer" — 1 tira de pressão 1 camada. Mas o desfazer do VSCode
Ctrl+Zirá restaurá-lo. Portanto, a operação de "arrependimento" após Remover Tag éCtrl+Z. Se você precisa frequentemente de operações "retirar + restaurar", considere usar o inverso de Wrap (Remover Tag e depois Wrap) - mas isso raramente é necessário na prática, então Remover Tag geralmente é emparelhado com a tecla desfazer.
📖 Resumo
- Trio de edição: Balancear (mudança de seleção) / Próximo Ponto de Edição (salto de tabstop) / Selecionar Item (seleção de elemento de mesmo nome)
- Alternar Comentário: Comenta tags HTML inteiras, linhas de propriedade CSS inteiras (sensível ao contexto)
- Remover Tag: Remove tag externa mas preserva conteúdo (remoção de casca), 1 pressionamento remove 1 camada
- Ir para Par Correspondente: Pular (sem seleção); Balancear: Selecionar (mudança de seleção)
- Teclas de acionamento: VSCode
Ctrl+Alt+B/Ctrl+Alt+→/Shift+Ctrl+./Ctrl+//Shift+Ctrl+; - Próximo Ponto de Edição ≠ tecla Tab: Tab é indentação/aceitar completar;
Ctrl+Alt+→é salto de tabstop
📝 Exercícios
-
Básico (Dificuldade: ★): No seu arquivo HTML, escreva uma estrutura aninhada (
<div><section><p>...</p></section></div>), coloque o cursor em<p>e pressione Balancear 5 vezes. Registre cada intervalo de seleção ("conteúdo" → "tag p" → "conteúdo da section" → "tag section" → "tag div"). Faça capturas de tela das mudanças de seleção. -
Intermediário (Dificuldade: ★★): No seu arquivo HTML, escreva 3 elementos
<p>(<p>Um</p>,<p>Dois</p>,<p>Três</p>). Coloque o cursor no nome da tag do primeiro<p>e pressione Selecionar Item 6 vezes (Shift+Ctrl+.). Registre o conteúdo específico selecionado a cada vez (nome da tag / conteúdo completo / próximo nome de tag / próximo conteúdo completo). Finalmente, use Alternar Comentário para comentar todos os 3 elementos<p>como um grupo. -
Desafio (Dificuldade: ★★★): Escreva um contêiner completo de landing page HTML (article > header + section + footer com aninhamento de 3 níveis). Otimize-o usando 5 ações em combinação: (a) Expandir
article>header>h1+section.content>p*3+footer.address; (b) Próximo Ponto de Edição para pular para cada<p>e preencher conteúdo; (c) Balancear para selecionar toda a tag article e copiá-la; (d) Alternar Comentário para comentar o footer; (e) Remover Tag para remover temporariamente o article e inspecionar estilos (use Ctrl+Z para desfazer). Registre a sequência de acionamento e o estado final de todas as 5 ações e escreva um relatório de comparação de eficiência "Fluxo de Trabalho do Trio de Edição" vs. "Substituição Ctrl+F".