Post

Vim: Dominando o Modo de Seleção por Bloco

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. Com Ctrl+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:

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. Pressione I (i maiúsculo). Isso o levará para o Modo de Inserção na primeira linha do bloco selecionado.
  4. Digite o texto que deseja inserir. Este texto aparecerá apenas na primeira linha por enquanto.
  5. 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
  1. Posicione o cursor no l da linha 1.
  2. Pressione Ctrl+v.
  3. Mova o cursor para baixo até o l da linha 3.
  4. Pressione I.
  5. Digite // .
  6. 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:

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. Pressione A (A maiúsculo). Isso o levará para o Modo de Inserção no final da primeira linha do bloco selecionado.
  4. Digite o texto que deseja inserir.
  5. 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()
  1. Posicione o cursor no ) da funcao1().
  2. Pressione Ctrl+v.
  3. Mova o cursor para baixo até o ) da funcao3().
  4. Pressione A.
  5. Digite ;.
  6. 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:

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. Pressione r (r minúsculo).
  4. Digite o caractere que deseja usar para substituir.

Exemplo: Para substituir um bloco de x por o:

1
2
3
xxx
xxx
xxx
  1. Selecione o bloco de x.
  2. Pressione r.
  3. 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):

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. Pressione c (c minúsculo). O bloco selecionado será deletado e você entrará no Modo de Inserção.
  4. Digite o novo texto. Este texto será inserido na primeira linha do bloco.
  5. 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
  1. Selecione a coluna 1 2 3.
  2. Pressione c.
  3. Digite A.
  4. 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:

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. Pressione x (x minúsculo).

Exemplo: Deletar uma coluna de caracteres:

1
2
3
abc
def
ghi
  1. Selecione a coluna b e h.
  2. 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:

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. 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
  1. Selecione a coluna 1 2 3 (incluindo o espaço após o número).
  2. 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
  1. Selecione o bloco de texto.
  2. 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
  1. Selecione a coluna dos números (1, 2, 3) usando Ctrl+v.
  2. 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
  1. Selecione a coluna dos números (3, 2, 1) usando Ctrl+v.
  2. 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
  1. Selecione o bloco TEXTO.
  2. 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
  1. Selecione o bloco texto.
  2. 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).

  1. Entre no Modo Visual de Bloco (Ctrl+v).
  2. Selecione o bloco desejado.
  3. Pressione : para entrar no Modo de Linha de Comando. Você verá : no rodapé.
  4. Digite norm (com um espaço no final) seguido do comando do Modo Normal que deseja executar.
  5. Pressione Enter.

Exemplo: Para adicionar um * no final de cada linha do bloco selecionado:

1
2
3
Item A
Item B
Item C
  1. Selecione o bloco Item A Item B Item C.
  2. Pressione :.
  3. Digite norm A* (onde A é o comando para inserir no final da linha e * é o caractere a ser inserido).
  4. 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
  1. Posicione o cursor no d de def minha_funcao():.
  2. Pressione Ctrl+v para entrar no Modo Visual de Bloco.
  3. Mova o cursor para baixo até o p de print("Olá, mundo!").
  4. Pressione I (i maiúsculo) para inserir antes do bloco.
  5. Digite # (hash e espaço).
  6. 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 =.

  1. Posicione o cursor no espaço após var1.
  2. Pressione Ctrl+v.
  3. Mova o cursor para baixo e para a direita até cobrir o espaço necessário para alinhar todos os =.
  4. Pressione x para deletar o espaço desalinhado.
  5. 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.
  6. 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
  1. Posicione o cursor no I do primeiro Item.
  2. Pressione Ctrl+v.
  3. Mova o cursor para baixo para selecionar a primeira letra de cada Item.
  4. Pressione I.
  5. Digite 1. .
  6. Pressione Esc duas vezes.

Resultado:

1
2
3
1. Item
1. Item
1. Item

Agora, para incrementar os números:

  1. Selecione a coluna dos números (1. ) usando Ctrl+v.
  2. 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”:

  1. Posicione o cursor no I de Idade.
  2. Pressione Ctrl+v.
  3. 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).
  4. 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).

  1. Posicione o cursor no d de <div>.
  2. Pressione Ctrl+v.
  3. Mova o cursor para baixo para selecionar todas as linhas do bloco HTML.
  4. Pressione I.
  5. Digite render() { return (.
  6. Pressione Esc duas vezes.

Agora, para adicionar o final:

  1. Com o mesmo bloco ainda selecionado (ou reselecione com gv).
  2. Pressione A.
  3. Digite ); }.
  4. 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 de Ctrl+v. Em muitos sistemas, Ctrl+q é o equivalente a Ctrl+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:

  1. Preparação: Identifique a área do texto que precisa ser manipulada. Pense no resultado desejado.
  2. 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. Use o para ajustar os cantos se necessário.
  3. Operação: Execute o comando desejado (I, A, c, d, x, r, ~, g Ctrl+a, g Ctrl+x, :norm).
  4. Refinamento: Verifique o resultado. Se algo não estiver como esperado, use u para desfazer e gv 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.

  1. Pressione q seguido de uma letra (ex: qa) para começar a gravar a macro no registro a.
  2. Execute as operações do Modo Visual de Bloco e quaisquer outros comandos necessários.
  3. Pressione q novamente para parar a gravação.
  4. 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.

This post is licensed under CC BY 4.0 by the author.