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 emdon'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:
- 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.
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:
- O
.editorconfigdo projeto — quando presente e "Aplicar as configurações do .editorconfig" está ligado, osindent_style/indent_size/tab_widthde um projeto vencem para os arquivos correspondentes. - O padrão de fábrica da linguagem — a tabela acima, quando a linguagem do documento declara um.
- 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¶
- Plugin Recuo — a configuração de estilo de recuo e os comandos Aumentar/Diminuir.
- EditorConfig — recuo por projeto que substitui a sua configuração global.
- Edição com vários cursores — posicionar vários cursores e editar com eles ao mesmo tempo.