Pular para conteúdo

Pares automáticos e recuo inteligente

Enquanto você digita, o editor fecha colchetes e aspas por você, mantém seu recuo nas linhas novas, abre blocos entre chaves e aplica uma única unidade de recuo consistente (tabulações ou espaços) à tecla Tab, ao recuo reverso do backspace e ao recuo automático. Tudo aqui é um recurso integrado do editor; os comandos de menu correspondentes e a configuração de estilo de recuo vêm do plugin Recuo que acompanha o editor.

Isso foi feito para ser invisível — ele só age sobre o caractere que você acabou de digitar e recua onde atrapalharia (dentro de comentários e strings, na frente de palavras existentes, com o caractere parceiro errado).

Emparelhando colchetes e aspas automaticamente

Digitar um colchete ou uma aspa de abertura insere o par correspondente e deixa o cursor entre os dois:

Você digita Você obtém Cursor
( () no meio
[ [] no meio
{ {} no meio
" "" no meio
' '' no meio

Algumas regras impedem que isso se torne irritante:

  • Digitar por cima. Digitar um caractere de fechamento quando o mesmo caractere já está à direita do cursor passa por cima dele em vez de inserir um segundo — então digitar direto através de () ou "" deixa um único par equilibrado.
  • Nada de emparelhar na frente de uma palavra. Um caractere de abertura só é completado quando o caractere seguinte é espaço em branco, um fechamento ou o fim da linha — então acrescentar ( logo antes de um texto existente não injeta um ) perdido no meio dele.
  • Aspas conscientes do apóstrofo. Uma ' digitada logo após uma letra (como em don't) é tratada como apóstrofo e não é emparelhada. As aspas só se emparelham automaticamente em contexto neutro (início de um token, depois de um espaço em branco ou de um operador).
  • Sinais de menor/maior apenas em marcação. < … > se emparelham automaticamente apenas em documentos HTML/XML, onde < abre uma tag. Em todos os outros lugares < é um operador de comparação ou deslocamento e é deixado em paz.

Envolvendo uma seleção (digitar para envolver)

Com um texto selecionado, digitar um caractere de abertura não substitui a seleção — ele a envolve:

select value  then type (        →   (value)
  • Funciona com ( [ { " ' (não com < — fora da marcação ele é um operador).
  • O texto interno continua selecionado depois, então os envolvimentos se encadeiam: digite ( e depois " e você obtém ("value").
  • Com vários cursores, cada seleção é envolvida de forma independente — e toda a operação é um único passo de desfazer.

Apagando um par

Pressionar Backspace com o cursor entre um par vazio inserido automaticamente ((|), [|], {|}, "|", '|' ou <|> em marcação) apaga os dois caracteres de uma só vez, então você pode desfazer um par automático com uma única tecla. Assim que há conteúdo entre o par, o Backspace se comporta normalmente.

Recuo inteligente no Enter

Pressionar Enter leva o espaço em branco inicial da linha atual para a linha nova, de modo que você permanece na mesma profundidade sem redigitar tabulações ou espaços:

  • Manter o recuo. A linha nova começa com o mesmo recuo da linha que você deixou.
  • Abrir um nível. Se a linha que você deixou termina com um caractere de abertura ({, [, (), a linha nova recebe um nível extra de recuo.
  • Abrir um bloco. Se o cursor está entre um caractere de abertura e o fechamento correspondente, o bloco se abre: a linha nova recebe um nível a mais de recuo e o fechamento desce para a própria linha, na profundidade da abertura.
if (cond) {|}        Enter        if (cond) {
                     ───────►          |
                                   }

Estilo de recuo — tabulações, espaços ou automático

Uma única unidade de recuo comanda a tecla Tab, o recuo reverso do backspace e o recuo automático acima, para que sempre concordem. Escolha-a em Preferências ▸ Plug-ins ▸ Recuo:

Estilo Comportamento
Tabulações (padrão para arquivos novos) Um nível é um caractere de tabulação real; Espaços por nível de recuo define a largura visual dele.
Espaços Um nível são tantos espaços quanto indicar Espaços por recuo.
Automático (detectar pelo documento) O editor examina o recuo existente do documento e o segue — um arquivo recuado com tabulações continua usando tabulações, um de 2 espaços continua usando dois espaços. Um arquivo que ainda não tem recuo recorre ao padrão (tabulações).

Arquivos novos, sem título, usam por padrão Tabulações, largura 4.

Ajustando o recuo manualmente

O plugin Recuo acrescenta dois comandos (também em Editar ▸ Recuo) que aumentam ou diminuem o recuo de todas as linhas tocadas pela seleção — ou da linha do cursor quando não há nada selecionado:

Comando Atalho
Aumentar o recuo Ctrl+]
Diminuir o recuo Ctrl+[

Colando um bloco de código

Copie algumas linhas que carregam o próprio recuo — digamos três linhas começando cada uma com doze espaços — e cole-as com o cursor recuado. Coladas literalmente, a primeira linha cairia no seu recuo mais os doze espaços do bloco (bem à direita) e cada linha seguinte na coluna 0 mais doze, deixando para você recuar tudo de novo à mão.

O OctoEdit recua o bloco por você: o recuo que as linhas do bloco compartilham é removido, a primeira linha cai onde o cursor já está e cada linha seguinte recebe o recuo da linha do cursor mais o recuo que ela tinha dentro do bloco. A estrutura interna do bloco é mantida exatamente; tabulações continuam tabulações e espaços continuam espaços.

Apenas o recuo inicial é substituído: o bloco mantém seus próprios caracteres de recuo, então um bloco recuado com espaços colado em um documento recuado com tabulações continua recuado com espaços por dentro. Converter o recuo interno do bloco para o estilo do documento é uma possível opção futura — hoje o editor não faz isso.

Isso vale apenas para uma colagem que é inequivocamente um bloco:

  • a área de transferência contém mais de uma linha;
  • há um único cursor e nenhuma seleção retangular (por colunas);
  • entre o início da linha e o cursor não há nada além de espaço em branco — colar no meio de uma linha é uma emenda, e é deixado literal.

Qualquer outra coisa é colada exatamente como antes. Toda a colagem é um único passo de Desfazer, e uma seleção é substituída como de costume.

Desligue isso com Recuar novamente as linhas coladas conforme o recuo do cursor em Preferências ▸ Plug-ins ▸ Recuo (ligado por padrão).

Colar como Markdown (Ctrl+Shift+V) passa pela mesma regra. O texto convertido é um bloco que começa na coluna 0, com os itens de lista aninhados recuados em relação a ele, então com o cursor recuado cada linha ganha o recuo do cursor e o aninhamento é mantido exatamente. Veja Editando para saber o que o comando faz.

Padrões por linguagem

Algumas linguagens têm uma convenção de recuo quase universal, e o editor a traz como padrão daquela linguagem — um arquivo desse tipo recém-aberto se recua corretamente sem configuração alguma:

Linguagem Padrão
Python 4 espaços (PEP 8)
Rust 4 espaços (rustfmt)
Markdown 4 espaços (listas aninhadas)
YAML 2 espaços (tabulações não são permitidas)
JSON 2 espaços
Go tabulações (gofmt)
C / C++ tabulações

Todas as demais linguagens deliberadamente não trazem padrão e seguem a sua configuração global de recuo. Trocar manualmente a linguagem de um documento (o menu Linguagem) reaplica o padrão correspondente imediatamente.

O padrão vive no arquivo de definição da linguagem (colorizers/<id>.json, chave "indent": { "style": "tabs|spaces", "width": N }). Um usuário avançado pode alterar um padrão de fábrica colocando uma cópia editada desse arquivo no diretório de substituições do usuário — o catálogo substitui definições por identificador.

Planejado: substituições por linguagem nas Preferências

Uma tabela de configurações para substituir esses padrões por linguagem (sem tocar em nenhum JSON) está projetada e planejada como o próximo passo deste recurso; até ela chegar, a substituição por JSON acima e as camadas abaixo são as formas de comandar o recuo.

De onde vem a unidade de recuo (precedência)

Quando várias fontes têm opinião sobre o recuo, o editor as resolve em um único lugar e aplica a vencedora, da maior precedência para a menor:

  1. O .editorconfig do projeto — quando presente e "Aplicar as configurações do .editorconfig" está ligado, os indent_style / indent_size / tab_width de um projeto vencem para os arquivos correspondentes.
  2. O padrão de fábrica da linguagem — a tabela acima, quando a linguagem do documento declara um.
  3. Sua configuração global de recuo — a escolha Tabulações / Espaços / Automático acima.

Assim, um projeto que traz um .editorconfig substitui tudo para os arquivos daquele projeto; um arquivo Python fora de um projeto desses se recua com os espaços do PEP 8 mesmo que sua configuração global sejam tabulações; e todo o resto segue a sua configuração global. Você sempre pode alterar o recuo de um documento manualmente depois.

A precedência vale no momento em que algo muda: aplicar uma escolha diferente de Tabulações / Espaços / Automático nas Preferências reresolve o documento aberto imediatamente, então um arquivo governado por um .editorconfig ou por um padrão de linguagem mantém seu recuo sem que você precise trocar de aba.

Vários cursores

Tudo o que foi dito acima vale em cada cursor quando você edita com vários cursores: digitar ( insere () em todos, Enter mantém o recuo de cada linha e Backspace entre pares vazios apaga as duas células em todos. Um único Desfazer reverte toda a edição com vários cursores de uma vez.

Backspace com cursores misturados

O Backspace só apaga pares quando todos os cursores estão entre um par vazio. Se alguns cursores estão em outro lugar, o Backspace recorre ao comportamento normal em todos eles, de modo que nunca apaga um fechamento solto em um cursor enquanto você edita uma palavra em outro.

Em comentários e strings

Quando um colorizador de sintaxe está ativo, o emparelhamento automático e a abertura de bloco comandada por chaves recuam dentro de comentários e de literais de string e caractere — ali um { ou uma " são texto comum, não código, então o editor os deixa exatamente como foram digitados. O recuo simples (levar o espaço em branco da linha anterior) continua funcionando. Em um documento de texto simples, sem colorizador, não há nada a suprimir, então o emparelhamento se comporta igual em toda parte.

Relacionado