Vim: Dominando o Modo de Seleção por Bloco
Introdução
Nos tutoriais anteriores, exploramos a navegação, busca, substituição e a edição estruturada com Text Objects no Vim. Agora, vamos mergulhar em uma funcionalidade que é um verdadeiro divisor de águas para a edição de texto em colunas ou blocos retangulares: o Modo de Seleção por Bloco (Ctrl+v
). Este modo é incrivelmente poderoso para tarefas como comentar múltiplas linhas de código, alinhar dados tabulares, ou editar arquivos CSV/TSV de forma eficiente.
Introdução ao Modo de Seleção por Bloco
O Modo de Seleção por Bloco no Vim permite que você selecione um bloco retangular de texto, em vez de uma sequência linear de caracteres (Modo Visual v
) ou linhas inteiras (Modo Visual de Linha V
). Isso abre um leque de possibilidades para manipulações verticais que seriam tediosas ou impossíveis com outros modos de seleção.
O que é e para que serve (Ctrl+v
)
O Ctrl+v
(ou Ctrl+q
em alguns sistemas, especialmente no Windows, para evitar conflito com o atalho de colar) ativa o Modo Visual de Bloco. Uma vez ativado, ao mover o cursor, você selecionará um retângulo de texto. As principais aplicações incluem:
- Comentar/Descomentar Blocos de Código: Adicionar ou remover caracteres de comentário no início de várias linhas simultaneamente.
- Alinhar Colunas de Texto: Ajustar o espaçamento para alinhar dados em colunas, como em tabelas ou arquivos de configuração.
- Editar Dados Tabulares (CSV/TSV): Manipular colunas específicas em arquivos de dados, como deletar uma coluna inteira ou inserir texto em uma coluna.
Diferença entre v
, V
e Ctrl+v
É fundamental entender a distinção entre os três modos visuais do Vim:
v
(Modo Visual de Caractere): Seleciona texto caractere por caractere. Ao mover o cursor, a seleção se estende linearmente.V
(Modo Visual de Linha): Seleciona linhas inteiras. Ao mover o cursor para cima ou para baixo, linhas completas são incluídas na seleção.Ctrl+v
(Modo Visual de Bloco): Seleciona um bloco retangular de texto. Isso permite operações em colunas, independentemente do comprimento das linhas.
Casos de uso: comentar blocos, alinhar colunas, editar CSV/TSV
Vamos ilustrar com exemplos práticos a utilidade do Ctrl+v
:
- Comentar Blocos: Imagine que você tem um bloco de código e quer adicionar
//
no início de cada linha. ComCtrl+v
, você seleciona a primeira coluna das linhas desejadas e então usa um comando de inserção para adicionar os caracteres. Alinhar Colunas: Se você tem uma lista de itens com valores desalinhados, o modo de bloco permite selecionar o espaço entre os itens e ajustar o alinhamento.
- Editar CSV/TSV: Em um arquivo CSV, você pode querer deletar uma coluna específica. Com
Ctrl+v
, você seleciona a coluna e a deleta com um único comando.
Fundamentos da Seleção por Bloco
Dominar o Modo de Seleção por Bloco começa com a compreensão de como ativá-lo e como mover o cursor para definir o bloco desejado.
Ativação: Ctrl+v
Para entrar no Modo Visual de Bloco, posicione o cursor no canto superior esquerdo do bloco que deseja selecionar e pressione Ctrl+v
.
Movimentação básica: h,j,k,l
Uma vez no Modo Visual de Bloco, você pode usar as teclas de movimento básicas do Vim (h
, j
, k
, l
) para estender a seleção. h
move para a esquerda, j
para baixo, k
para cima e l
para a direita. O retângulo de seleção se ajustará conforme você move o cursor.
Ajuste da seleção: o
(alternar canto do bloco)
Se você perceber que a seleção não está no local exato ou precisa ser ajustada a partir de um canto diferente, pressione o
(de “other corner”). Isso moverá o cursor para o canto oposto do bloco selecionado, permitindo que você ajuste a seleção a partir dali. Pressionar o
novamente o levará de volta ao canto original.
Sair do modo: Esc
ou Ctrl+c
Para sair do Modo Visual de Bloco e retornar ao Modo Normal, pressione Esc
ou Ctrl+c
.
Edição Vertical
Uma vez que você tenha um bloco de texto selecionado no Modo Visual de Bloco, o Vim oferece comandos poderosos para editar esse bloco verticalmente. Isso significa que você pode inserir, substituir ou deletar texto em todas as linhas do bloco selecionado simultaneamente.
Inserir antes do bloco: I [texto] Esc
Para inserir texto antes de cada linha do bloco selecionado:
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
I
(i maiúsculo). Isso o levará para o Modo de Inserção na primeira linha do bloco selecionado. - Digite o texto que deseja inserir. Este texto aparecerá apenas na primeira linha por enquanto.
- Pressione
Esc
duas vezes. O Vim aplicará o texto inserido em todas as linhas do bloco selecionado.
Exemplo: Para adicionar //
no início de um bloco de código:
1
2
3
linha 1
linha 2
linha 3
- Posicione o cursor no
l
dalinha 1
. - Pressione
Ctrl+v
. - Mova o cursor para baixo até o
l
dalinha 3
. - Pressione
I
. - Digite
//
. - Pressione
Esc
duas vezes.
Resultado:
1
2
3
// linha 1
// linha 2
// linha 3
Inserir após o bloco: A [texto] Esc
Para inserir texto após cada linha do bloco selecionado:
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
A
(A maiúsculo). Isso o levará para o Modo de Inserção no final da primeira linha do bloco selecionado. - Digite o texto que deseja inserir.
- Pressione
Esc
duas vezes. O Vim aplicará o texto inserido em todas as linhas do bloco selecionado.
Exemplo: Para adicionar ;
no final de um bloco de linhas:
1
2
3
funcao1()
funcao2()
funcao3()
- Posicione o cursor no
)
dafuncao1()
. - Pressione
Ctrl+v
. - Mova o cursor para baixo até o
)
dafuncao3()
. - Pressione
A
. - Digite
;
. - Pressione
Esc
duas vezes.
Resultado:
1
2
3
funcao1();
funcao2();
funcao3();
Substituir caracteres: r [caractere]
Para substituir todos os caracteres dentro do bloco selecionado por um único caractere:
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
r
(r minúsculo). - Digite o caractere que deseja usar para substituir.
Exemplo: Para substituir um bloco de x
por o
:
1
2
3
xxx
xxx
xxx
- Selecione o bloco de
x
. - Pressione
r
. - Digite
o
.
Resultado:
1
2
3
ooo
ooo
ooo
Substituir bloco por novo texto: c [texto] Esc
Para substituir o bloco selecionado por um novo texto, que pode ter múltiplos caracteres e até mesmo múltiplas linhas (se o bloco for largo o suficiente):
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
c
(c minúsculo). O bloco selecionado será deletado e você entrará no Modo de Inserção. - Digite o novo texto. Este texto será inserido na primeira linha do bloco.
- Pressione
Esc
duas vezes. O Vim replicará o texto inserido em todas as linhas do bloco.
Exemplo: Substituir uma coluna de números por uma coluna de letras:
1
2
3
1 abc
2 def
3 ghi
- Selecione a coluna
1 2 3
. - Pressione
c
. - Digite
A
. - Pressione
Esc
duas vezes.
Resultado:
1
2
3
A abc
A def
A ghi
Apagar caracteres verticalmente: x
Para apagar os caracteres dentro do bloco selecionado:
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
x
(x minúsculo).
Exemplo: Deletar uma coluna de caracteres:
1
2
3
abc
def
ghi
- Selecione a coluna
b e h
. - Pressione
x
.
Resultado:
1
2
3
ac
df
gi
Deletar bloco inteiro: d
Para deletar o bloco selecionado, incluindo os caracteres e o espaço que eles ocupavam:
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
d
(d minúsculo).
Exemplo: Deletar uma coluna de números e o espaço que eles ocupavam:
1
2
3
1 abc
2 def
3 ghi
- Selecione a coluna
1 2 3
(incluindo o espaço após o número). - Pressione
d
.
Resultado:
1
2
3
abc
def
ghi
Esses comandos de edição vertical são a essência do Modo Visual de Bloco, permitindo manipulações de texto em massa que seriam extremamente demoradas de outra forma.
Transformações Avançadas
Além das operações básicas de inserção, substituição e deleção, o Modo Visual de Bloco permite realizar transformações mais avançadas em blocos de texto, como alternar maiúsculas/minúsculas, incrementar números e executar comandos normais.
Alternar maiúsculas/minúsculas: ~
Com um bloco selecionado, pressionar ~
(til) alternará o caso de cada caractere dentro da seleção. Letras minúsculas se tornarão maiúsculas e vice-versa.
Exemplo:
1
2
3
Texto
TEXTO
tExTo
- Selecione o bloco de texto.
- Pressione
~
.
Resultado:
1
2
3
tEXTO
texto
TeXtO
Reselecionar último bloco: gv
Se você desfez uma operação ou saiu do Modo Visual de Bloco e deseja selecionar o mesmo bloco novamente, basta pressionar gv
(go visual). Isso é extremamente útil para aplicar múltiplas operações no mesmo bloco sem precisar selecioná-lo manualmente a cada vez.
Incrementar números: g Ctrl+a
Este é um comando poderoso para trabalhar com listas numeradas ou sequências. Com um bloco de números selecionado, g Ctrl+a
incrementará cada número no bloco, começando pelo primeiro número selecionado.
Exemplo:
1
2
3
Item 1
Item 2
Item 3
- Selecione a coluna dos números (
1
,2
,3
) usandoCtrl+v
. - Pressione
g Ctrl+a
.
Resultado:
1
2
3
Item 1
Item 2
Item 3
(Nota: O incremento padrão é 1. Para incrementos maiores, você pode usar um prefixo numérico antes de g Ctrl+a
, por exemplo, 5g Ctrl+a
para incrementar de 5 em 5.)
Decrementar números: g Ctrl+x
Similar ao incremento, g Ctrl+x
decrementará cada número no bloco selecionado.
Exemplo:
1
2
3
Item 3
Item 2
Item 1
- Selecione a coluna dos números (
3
,2
,1
) usandoCtrl+v
. - Pressione
g Ctrl+x
.
Resultado:
1
2
3
Item 3
Item 2
Item 1
Converter para minúsculas: gu
Com um bloco selecionado, gu
(go uppercase) converterá todos os caracteres dentro da seleção para minúsculas.
Exemplo:
1
TEXTO
- Selecione o bloco
TEXTO
. - Pressione
gu
.
Resultado:
1
texto
Converter para maiúsculas: gU
Com um bloco selecionado, gU
(go uppercase) converterá todos os caracteres dentro da seleção para maiúsculas.
Exemplo:
1
texto
- Selecione o bloco
texto
. - Pressione
gU
.
Resultado:
1
TEXTO
Executar comando normal no bloco: :norm [comando]
Esta é uma das funcionalidades mais avançadas e flexíveis do Modo Visual de Bloco. Você pode executar qualquer comando do Modo Normal em cada linha do bloco selecionado usando :norm
(normal).
- Entre no Modo Visual de Bloco (
Ctrl+v
). - Selecione o bloco desejado.
- Pressione
:
para entrar no Modo de Linha de Comando. Você verá:
no rodapé. - Digite
norm
(com um espaço no final) seguido do comando do Modo Normal que deseja executar. - Pressione
Enter
.
Exemplo: Para adicionar um *
no final de cada linha do bloco selecionado:
1
2
3
Item A
Item B
Item C
- Selecione o bloco
Item A Item B Item C
. - Pressione
:
. - Digite
norm A*
(ondeA
é o comando para inserir no final da linha e*
é o caractere a ser inserido). - Pressione
Enter
.
Resultado:
1
2
3
Item A*
Item B*
Item C*
As transformações avançadas no Modo Visual de Bloco, especialmente a combinação com :norm
, oferecem um poder imenso para automatizar edições complexas e repetitivas, tornando o Vim uma ferramenta de manipulação de texto extremamente eficiente.
Exemplos Práticos
Para ilustrar o poder do Modo de Seleção por Bloco, vamos explorar alguns exemplos práticos que demonstram como ele pode ser usado para resolver problemas comuns de edição de texto.
Comentar/descomentar blocos de código
Esta é uma das aplicações mais frequentes do Modo Visual de Bloco. Suponha que você tenha o seguinte código Python e queira comentar as três primeiras linhas:
1
2
3
4
def minha_funcao():
print("Olá, mundo!")
# Esta linha já está comentada
return True
- Posicione o cursor no
d
dedef minha_funcao():
. - Pressione
Ctrl+v
para entrar no Modo Visual de Bloco. - Mova o cursor para baixo até o
p
deprint("Olá, mundo!")
. - Pressione
I
(i maiúsculo) para inserir antes do bloco. - Digite
#
(hash e espaço). - Pressione
Esc
duas vezes.
Resultado:
1
2
3
4
# def minha_funcao():
# print("Olá, mundo!")
# Esta linha já está comentada
return True
Para descomentar, você faria o processo inverso, selecionando o #
e deletando com x
ou d
.
Alinhar dados tabulares
Imagine que você tem uma lista de variáveis e seus valores, mas eles estão desalinhados:
1
2
3
var1 = 10
variavel_longa = 200
curta = 3
Você quer alinhar os sinais de =
.
- Posicione o cursor no espaço após
var1
. - Pressione
Ctrl+v
. - Mova o cursor para baixo e para a direita até cobrir o espaço necessário para alinhar todos os
=
. - Pressione
x
para deletar o espaço desalinhado. - Pressione
I
e adicione o número de espaços necessários para alinhar o=
. Por exemplo, se você precisar de 15 espaços, digite 15 espaços. - Pressione
Esc
duas vezes.
Este processo pode exigir um pouco de tentativa e erro para o alinhamento perfeito, mas é muito mais rápido do que editar cada linha individualmente.
Incremento numérico em sequência
Se você precisa criar uma lista numerada ou ajustar uma sequência de IDs:
1
2
3
Item
Item
Item
- Posicione o cursor no
I
do primeiroItem
. - Pressione
Ctrl+v
. - Mova o cursor para baixo para selecionar a primeira letra de cada
Item
. - Pressione
I
. - Digite
1.
. - Pressione
Esc
duas vezes.
Resultado:
1
2
3
1. Item
1. Item
1. Item
Agora, para incrementar os números:
- Selecione a coluna dos números (
1.
) usandoCtrl+v
. - Pressione
g Ctrl+a
.
Resultado:
1
2
3
1. Item
2. Item
3. Item
Edição de CSV/TSV
Considere um arquivo CSV simples:
Nome,Idade,Cidade
João,30,São Paulo
Maria,25,Rio de Janeiro
Pedro,35,Belo Horizonte
Se você quiser deletar a coluna “Idade”:
- Posicione o cursor no
I
deIdade
. - Pressione
Ctrl+v
. - Mova o cursor para baixo e para a direita para selecionar toda a coluna “Idade” (incluindo a vírgula que a precede ou sucede, dependendo do que você quer manter).
- Pressione
d
.
Resultado (se você selecionou a vírgula antes da idade):
Nome,Cidade
João,São Paulo
Maria,Rio de Janeiro
Pedro,Belo Horizonte
Transformação de formatos (ex: HTML para componentes)
Imagine que você tem um bloco de HTML e quer transformá-lo em um formato de componente, por exemplo, adicionando um prefixo a cada linha:
1
2
3
4
<div>
<p>Conteúdo do parágrafo</p>
<span>Conteúdo do span</span>
</div>
Você quer que cada linha comece com render() { return (
e termine com ); }
(simplificado para o exemplo).
- Posicione o cursor no
d
de<div>
. - Pressione
Ctrl+v
. - Mova o cursor para baixo para selecionar todas as linhas do bloco HTML.
- Pressione
I
. - Digite
render() { return (
. - Pressione
Esc
duas vezes.
Agora, para adicionar o final:
- Com o mesmo bloco ainda selecionado (ou reselecione com
gv
). - Pressione
A
. - Digite
); }
. - Pressione
Esc
duas vezes.
Resultado (simplificado):
1
2
3
4
render() { return (<div>
render() { return ( <p>Conteúdo do parágrafo</p>
render() { return ( <span>Conteúdo do span</span>
render() { return (</div>);
Estes exemplos demonstram a versatilidade do Modo Visual de Bloco para tarefas de edição em massa e manipulação de dados estruturados, tornando-o uma ferramenta indispensável no arsenal de qualquer usuário avançado do Vim.
Perguntas Frequentes (FAQ) e Solução de Problemas
Ao usar o Modo Visual de Bloco, algumas dúvidas e problemas comuns podem surgir. Aqui estão algumas das perguntas mais frequentes e suas soluções:
Texto não aparece imediatamente com I
ou A
Problema: Após selecionar um bloco com Ctrl+v
e pressionar I
ou A
, o texto que você digita aparece apenas na primeira linha e não se replica imediatamente nas outras linhas selecionadas.
Solução: Este é o comportamento esperado. O Vim só aplica a inserção em todas as linhas do bloco após você sair do Modo de Inserção pressionando Esc
duas vezes. A primeira vez que você pressiona Esc
, você sai do Modo de Inserção, e a segunda vez (ou a primeira, se você já estiver no Modo Normal) o Vim processa a operação de bloco.
Edição de arquivos com tabs
Problema: Ao tentar selecionar um bloco em um arquivo que usa caracteres de tabulação (\t
), a seleção visual pode parecer desalinhada ou não corresponder ao que você vê na tela.
Solução: Isso ocorre porque o Vim exibe tabs como um número de espaços (geralmente 8 por padrão), mas a seleção de bloco opera em caracteres reais. Para evitar isso, é recomendável configurar o Vim para usar espaços em vez de tabs para indentação (set expandtab
) ou ajustar o tamanho do tab (set tabstop=4
). Se você precisa trabalhar com arquivos que já contêm tabs, esteja ciente de que a seleção visual pode não ser perfeita, mas a operação ainda será aplicada corretamente aos caracteres subjacentes.
Diferença entre x
e d
Problema: Qual a diferença entre usar x
e d
para apagar caracteres no Modo Visual de Bloco?
Solução:
x
(delete character): Deleta apenas os caracteres dentro do bloco selecionado. O espaço que eles ocupavam permanece, resultando em um “buraco” no texto.d
(delete): Deleta os caracteres dentro do bloco e o espaço que eles ocupavam, efetivamente removendo o bloco e fechando o espaço. Isso é geralmente o que você deseja ao deletar uma coluna inteira.
Correção de seleção errada
Problema: Você selecionou um bloco, mas percebeu que a seleção está incorreta ou precisa ser ajustada.
Solução:
- Pressione
o
(other corner) para mover o cursor para o canto oposto do bloco e ajustar a seleção a partir dali. - Pressione
Esc
para sair do Modo Visual e começar uma nova seleção. - Use
gv
para reselecionar o último bloco que você trabalhou, o que é útil se você saiu do modo visual e quer voltar para a mesma seleção.
Ctrl+v
não ativa o modo de bloco
Problema: Ao pressionar Ctrl+v
, o Vim não entra no Modo Visual de Bloco, ou insere um caractere especial.
Solução: Em alguns terminais ou sistemas operacionais (especialmente Windows), Ctrl+v
pode ser mapeado para a função de colar. Nesses casos, você pode tentar:
- Usar
Ctrl+q
em vez deCtrl+v
. Em muitos sistemas,Ctrl+q
é o equivalente aCtrl+v
para o Modo Visual de Bloco. - Verificar as configurações do seu terminal para garantir que
Ctrl+v
não esteja sendo interceptado pelo terminal antes de chegar ao Vim.
Problemas com caracteres especiais/codificação
Problema: Ao editar blocos com caracteres especiais ou em diferentes codificações, o resultado pode não ser o esperado.
Solução: Certifique-se de que o Vim está configurado para a codificação correta (set encoding=utf-8
). Caracteres multibyte podem se comportar de forma diferente em operações de bloco se a codificação não estiver correta. Em geral, o Vim lida bem com UTF-8, mas problemas podem surgir com codificações mais antigas ou incomuns.
Seleção desalinhada (tabs vs. espaços)
Problema: Similar ao problema de tabs, se o seu arquivo mistura tabs e espaços para indentação, a seleção de bloco pode parecer desalinhada.
Solução: A melhor prática é manter a consistência na indentação (apenas tabs ou apenas espaços). Se você precisa trabalhar com arquivos inconsistentes, use o comando :retab
para converter tabs em espaços (ou vice-versa) antes de realizar operações de bloco complexas. Isso garantirá que a seleção visual corresponda à estrutura real do texto.
Com essas dicas e soluções, você estará mais preparado para enfrentar os desafios e aproveitar ao máximo o poder do Modo Visual de Bloco no Vim.
Fluxo de Trabalho Eficiente e Dicas de Produtividade
Para maximizar a eficiência ao usar o Modo Visual de Bloco, considere as seguintes dicas e um fluxo de trabalho otimizado:
Preparação, seleção, operação, refinamento
Um fluxo de trabalho eficaz com o Modo Visual de Bloco pode ser dividido em etapas:
- Preparação: Identifique a área do texto que precisa ser manipulada. Pense no resultado desejado.
- Seleção: Posicione o cursor no canto superior esquerdo do bloco e use
Ctrl+v
para ativar o modo. Mova o cursor para definir o retângulo de seleção. Useo
para ajustar os cantos se necessário. - Operação: Execute o comando desejado (
I
,A
,c
,d
,x
,r
,~
,g Ctrl+a
,g Ctrl+x
,:norm
). - Refinamento: Verifique o resultado. Se algo não estiver como esperado, use
u
para desfazer egv
para reselecionar o bloco e tentar novamente.
Combinação com macros (q
)
O Modo Visual de Bloco se torna ainda mais poderoso quando combinado com macros. Se você tem uma série de operações repetitivas que envolvem seleções de bloco, grave uma macro para automatizar o processo.
- Pressione
q
seguido de uma letra (ex:qa
) para começar a gravar a macro no registroa
. - Execute as operações do Modo Visual de Bloco e quaisquer outros comandos necessários.
- Pressione
q
novamente para parar a gravação. - Para executar a macro, posicione o cursor e pressione
@a
. Para executar várias vezes, use[número]@a
.
Atalhos personalizados e mapeamentos para o modo de bloco
Você pode criar mapeamentos personalizados no seu .vimrc
para agilizar operações comuns no Modo Visual de Bloco. Por exemplo, um mapeamento para comentar/descomentar linhas pode economizar muitas teclas.
Exemplo de mapeamento para comentar/descomentar (no .vimrc
):
1
2
vmap <C-/> :s/^/#/<CR>:noh<CR>
vmap <C-_> :s/^#//<CR>:noh<CR>
Este exemplo (simplificado) mostra como você pode mapear Ctrl+/
para comentar e Ctrl+_
para descomentar no modo visual (incluindo o modo de bloco). O s/^/#/
adiciona #
no início da linha, e s/^#//
remove. O :noh
desativa o realce da busca.
Estendendo o Poder do Bloco: Plugins Úteis
Embora o Vim puro seja extremamente capaz, alguns plugins podem estender ainda mais as funcionalidades do Modo Visual de Bloco e operações relacionadas, tornando seu fluxo de trabalho ainda mais eficiente.
vim-surround
Este plugin, embora não seja exclusivo para o modo de bloco, complementa muito bem a edição estruturada. Ele permite adicionar, mudar ou deletar “surroundings” (delimitadores como aspas, parênteses, tags HTML) de forma muito intuitiva. Por exemplo, com uma seleção de bloco, você pode usar S
para envolver o bloco com parênteses, chaves, ou tags HTML.
vim-multiple-cursors
Este plugin traz a funcionalidade de múltiplos cursores, popularizada por editores como o Sublime Text e o VS Code, para o Vim. Embora não seja diretamente uma extensão do Modo Visual de Bloco, ele oferece uma alternativa para edições verticais e em massa que podem ser mais intuitivas para alguns usuários em certos cenários. Você pode selecionar um bloco e então ativar múltiplos cursores para editar cada linha ou coluna de forma independente.
Estes plugins, juntamente com o domínio do Modo Visual de Bloco, podem transformar o Vim em uma ferramenta de edição de texto incrivelmente poderosa e flexível para qualquer tarefa, desde a edição de código até a manipulação de dados complexos.