Text Objects

    Definição curta: Text objects são regiões de texto definidas por delimitadores (como palavras, sentenças, parágrafos ou blocos de código) que podem ser selecionadas ou operadas como uma unidade.

    Antes de começar

    • Saber sair do Neovim (:q) e navegar em modo normal

    O que você vai aprender

    • Explicar Inside vs Around com suas palavras
    • Explicar Text objects de delimitadores com suas palavras
    • Explicar Text objects de texto com suas palavras
    • Localizar o assunto desta página no :help do seu próprio Neovim

    O que é

    Text objects permitem selecionar ou operar sobre estruturas sintáticas delimitadas. Enquanto motions movem para uma posição, text objects selecionam uma região completa.

    A sintaxe é i<delimitador> (inside) ou a<delimitador> (around).

    Índice de sub-tópicos

    Inside vs Around

    ComandoSignificadoInclui delimitadores
    i<obj>InsideNão
    a<obj>AroundSim

    Exemplo com aspas

    "Hello World"
    • ci" muda o conteúdo entre aspas (exclui as aspas)
    • ca" muda as aspas e o conteúdo (inclui as aspas)

    Text objects de delimitadores

    DelimitadorInsideAround
    Parênteses ()i( ou iba(
    Colchetes []i[a[
    Chaves {}i{ ou iBa{ ou aB
    Ângulos <>i<a<
    Aspas duplas "i"a"
    Aspas simples 'i'a'
    Backticks `i`a`

    Exemplo: deletar conteúdo entre parênteses

    foo = func(a, b, c)

    Com o cursor em qualquer lugar dentro dos parênteses:

    • di( deleta a, b, c (conteúdo)
    • da( deleta (a, b, c) (tudo com parênteses)

    Text objects de texto

    ComandoDescrição
    iwPalavra atual (inside)
    awPalavra atual + espaço (around)
    iWWORD atual (inside)
    aWWORD atual + espaço (around)
    isSentença atual (inside)
    asSentença atual + espaço (around)
    ipParágrafo atual (inside)
    apParágrafo atual + newline (around)

    Text objects de código

    Dependem do Treesitter para linguagens estruturadas.

    ComandoDescrição
    iBBloco {} (inside)
    aBBloco {} + delimitadores (around)
    ibBloco () (inside)
    abBloco () + delimitadores (around)

    Text objects via Treesitter (Neovim 0.10+)

    Com Treesitter configurado, novos text objects ficam disponíveis:

    -- Exemplo de text objects Treesitter
    -- iC = inside class
    -- aC = around class
    -- if = inside função
    -- af = around função

    Combinações com operators

    Text objects são quase sempre usados com operators.

    Workflow: mudar string

    1. Cursor dentro de "texto"ci" → digitar novo conteúdo
    2. ci( para mudar argumento de função
    3. ci{ para mudar bloco de código

    Diagrama de uso comum

    flowchart LR
        A["cursor\ndentro da\nestrutura"] --> B["operator\nc, d, y, ~"]
        B --> C{"tipo?"}
        C -->|inside| D["i<delim>\nconteúdo"]
        C -->|around| E["a<delim>\ndelimitadores"]

    Erros comuns

    • Confundir i com a. ci" troca o conteúdo entre as aspas; ca" leva as aspas junto. A diferença aparece no primeiro uso e some da memória no segundo.
    • Achar que só serve para pares de delimitadores. ip (parágrafo) e it (tag) são objetos de texto e não têm delimitador visível.
    • Não perceber que o cursor pode estar em qualquer lugar dentro do objeto. É a economia inteira do recurso: você não precisa mirar.

    Você aprendeu

    • Inside vs Around
    • Text objects de delimitadores
    • Text objects de texto
    • Text objects de código
    • Combinações com operators

    Perguntas para reflexão

    1. O que Inside vs Around resolve, e o que se perde sem isso?
    2. O que Text objects de delimitadores resolve, e o que se perde sem isso?
    3. O que Text objects de texto resolve, e o que se perde sem isso?
    4. Qual parte desta página você conseguiria reproduzir sem consultar, direto no editor?

    Artigos relacionados

    Veja também

    Referências