Vai al contenuto

Coppie automatiche e rientro intelligente

Mentre digiti, l'editor chiude per te parentesi e virgolette, mantiene il tuo rientro sulle righe nuove, apre i blocchi tra graffe e applica un'unica unità di rientro coerente (tabulazioni o spazi) al tasto Tab, al backspace che riduce il rientro e al rientro automatico. Tutto ciò che c'è qui è una funzionalità integrata dell'editor; i corrispondenti comandi di menu e l'impostazione dello stile di rientro arrivano dal plugin Rientro incluso.

È pensato per essere invisibile: agisce solo sul carattere che hai appena digitato e si fa da parte dove darebbe fastidio (dentro commenti e stringhe, davanti a parole esistenti, con il carattere compagno sbagliato).

Accoppiare automaticamente parentesi e virgolette

Digitare una parentesi o una virgoletta di apertura inserisce la compagna e lascia il cursore in mezzo:

Digiti Ottieni Cursore
( () in mezzo
[ [] in mezzo
{ {} in mezzo
" "" in mezzo
' '' in mezzo

Alcune regole evitano che diventi fastidioso:

  • Digitare sopra. Digitare un carattere di chiusura quando lo stesso carattere è già a destra del cursore lo scavalca invece di inserirne un secondo, quindi digitare di seguito attraverso () o "" lascia un'unica coppia equilibrata.
  • Niente accoppiamento davanti a una parola. Un carattere di apertura viene completato solo quando il carattere seguente è uno spazio bianco, una chiusura o la fine della riga, quindi aggiungere ( appena prima di un testo esistente non vi infila una ) vagante in mezzo.
  • Virgolette consapevoli dell'apostrofo. Una ' digitata subito dopo una lettera (come in don't) viene trattata come apostrofo e non viene accoppiata. Le virgolette si accoppiano automaticamente solo in un contesto neutro (inizio di un token, dopo uno spazio bianco o un operatore).
  • Parentesi angolari solo nel markup. < … > si accoppiano automaticamente solo nei documenti HTML/XML, dove < apre un tag. Ovunque altrove < è un operatore di confronto o di scorrimento e viene lasciato in pace.

Racchiudere una selezione (digita per racchiudere)

Con del testo selezionato, digitare un carattere di apertura non sostituisce la selezione: la racchiude.

select value  then type (        →   (value)
  • Funziona con ( [ { " ' (non con <: fuori dal markup è un operatore).
  • Il testo interno resta selezionato dopo, quindi i racchiudimenti si concatenano: digita ( e poi " e ottieni ("value").
  • Con più cursori, ogni selezione viene racchiusa in modo indipendente, e l'intera operazione è un solo passo di annullamento.

Cancellare una coppia

Premere Backspace con il cursore tra una coppia vuota inserita automaticamente ((|), [|], {|}, "|", '|' o <|> nel markup) cancella entrambi i caratteri in un colpo solo, così puoi annullare una coppia automatica con un'unica pressione. Appena c'è del contenuto tra la coppia, Backspace si comporta normalmente.

Rientro intelligente con Invio

Premere Invio porta lo spazio bianco iniziale della riga corrente sulla riga nuova, così resti alla stessa profondità senza ridigitare tabulazioni o spazi:

  • Mantieni il rientro. La riga nuova inizia con lo stesso rientro della riga che hai lasciato.
  • Apri un livello. Se la riga che hai lasciato termina con un carattere di apertura ({, [, (), la riga nuova riceve un livello di rientro in più.
  • Apri un blocco. Se il cursore si trova tra un carattere di apertura e la sua chiusura corrispondente, il blocco si apre: la riga nuova riceve un livello di rientro in più e la chiusura scende su una riga propria, alla profondità dell'apertura.
if (cond) {|}        Enter        if (cond) {
                     ───────►          |
                                   }

Stile di rientro — tabulazioni, spazi o automatico

Un'unica unità di rientro guida il tasto Tab, il backspace che riduce il rientro e il rientro automatico di cui sopra, così sono sempre d'accordo. Scegliila in Preferenze ▸ Estensioni ▸ Rientro:

Stile Comportamento
Tabulazioni (predefinito per i file nuovi) Un livello è un vero carattere di tabulazione; Spazi per rientro ne imposta la larghezza visiva.
Spazi Un livello sono tanti spazi quanti ne indica Spazi per rientro.
Automatico (rileva dal documento) L'editor esamina il rientro esistente del documento e lo segue: un file rientrato con tabulazioni continua a usare tabulazioni, uno da 2 spazi continua a usare due spazi. Un file che non ha ancora rientro ricade sul valore predefinito (tabulazioni).

I file nuovi, senza titolo, usano per impostazione predefinita Tabulazioni, larghezza 4.

Regolare il rientro a mano

Il plugin Rientro aggiunge due comandi (anche sotto Modifica ▸ Rientro) che aumentano o riducono il rientro di ogni riga toccata dalla selezione, o della riga del cursore quando non c'è nulla di selezionato:

Comando Scorciatoia
Aumenta il rientro Ctrl+]
Riduci il rientro Ctrl+[

Incollare un blocco di codice

Copia alcune righe che portano il proprio rientro —diciamo tre righe che iniziano ciascuna con dodici spazi— e incollale con il cursore rientrato. Incollate alla lettera, la prima riga finirebbe nel tuo rientro più i dodici spazi del blocco (molto a destra) e ogni riga successiva alla colonna 0 più dodici, lasciandoti a rientrare tutto di nuovo a mano.

OctoEdit rientra il blocco al posto tuo: il rientro condiviso dalle righe del blocco viene rimosso, la prima riga finisce dove il cursore è già, e ogni riga successiva riceve il rientro della riga del cursore più il rientro che aveva dentro il blocco. La struttura interna del blocco viene mantenuta esattamente; le tabulazioni restano tabulazioni e gli spazi restano spazi.

Viene sostituito solo il rientro iniziale: il blocco conserva i propri caratteri di rientro, quindi un blocco rientrato con spazi incollato in un documento rientrato con tabulazioni resta rientrato con spazi al suo interno. Convertire il rientro interno del blocco allo stile del documento è una possibile opzione futura: oggi l'editor non lo fa.

Questo vale solo per un incollaggio che sia inequivocabilmente un blocco:

  • gli appunti contengono più di una riga;
  • c'è un solo cursore e nessuna selezione rettangolare (per colonne);
  • tra l'inizio della riga e il cursore non c'è altro che spazio bianco — incollare in mezzo a una riga è un innesto, e viene lasciato alla lettera.

Tutto il resto si incolla esattamente come prima. L'intero incollaggio è un unico passo di Annulla, e una selezione viene sostituita come di consueto.

Disattivalo con Applica di nuovo il rientro alle righe incollate in base al rientro del cursore in Preferenze ▸ Estensioni ▸ Rientro (attivo per impostazione predefinita).

Incolla come Markdown (Ctrl+Shift+V) segue la stessa regola. Il testo convertito è un blocco che inizia alla colonna 0, con gli elementi di elenco annidati rientrati rispetto a esso, quindi con il cursore rientrato ogni riga riceve il rientro del cursore e l'annidamento viene mantenuto esattamente. Vedi Modificare per sapere cosa fa il comando.

Valori predefiniti per linguaggio

Alcuni linguaggi hanno una convenzione di rientro quasi universale, e l'editor la porta come valore predefinito di quel linguaggio: un file di quel tipo appena aperto si rientra correttamente senza alcuna configurazione.

Linguaggio Predefinito
Python 4 spazi (PEP 8)
Rust 4 spazi (rustfmt)
Markdown 4 spazi (elenchi annidati)
YAML 2 spazi (le tabulazioni non sono ammesse)
JSON 2 spazi
Go tabulazioni (gofmt)
C / C++ tabulazioni

Tutti gli altri linguaggi deliberatamente non portano alcun valore predefinito e seguono la tua impostazione globale di rientro. Cambiare a mano il linguaggio di un documento (il menu Linguaggio) riapplica subito il valore predefinito corrispondente.

Il valore predefinito vive nel file di definizione del linguaggio (colorizers/<id>.json, chiave "indent": { "style": "tabs|spaces", "width": N }). Un utente esperto può cambiare un valore predefinito di serie mettendo una copia modificata di quel file nella cartella di sostituzioni dell'utente: il catalogo sostituisce le definizioni per identificatore.

Previsto: sostituzioni per linguaggio nelle Preferenze

Una tabella di impostazioni per sostituire questi valori predefiniti per linguaggio (senza toccare alcun JSON) è progettata e pianificata come passo successivo di questa funzionalità; finché non arriva, la sostituzione via JSON di cui sopra e gli strati sottostanti sono i modi per guidare il rientro.

Da dove arriva l'unità di rientro (precedenza)

Quando più fonti hanno un'opinione sul rientro, l'editor le risolve in un unico punto e applica la vincente, dalla precedenza più alta alla più bassa:

  1. Il .editorconfig del progetto — quando è presente e «Applica le impostazioni di .editorconfig» è attivo, gli indent_style / indent_size / tab_width di un progetto vincono per i file corrispondenti.
  2. Il valore predefinito di serie del linguaggio — la tabella qui sopra, quando il linguaggio del documento ne dichiara uno.
  3. La tua impostazione globale di rientro — la scelta Tabulazioni / Spazi / Automatico di cui sopra.

Così un progetto che porta un .editorconfig sostituisce tutto per i file di quel progetto; un file Python fuori da un progetto del genere si rientra con gli spazi del PEP 8 anche se la tua impostazione globale sono le tabulazioni; e tutto il resto segue la tua impostazione globale. Puoi sempre cambiare a mano il rientro di un documento dopo.

La precedenza vale nel momento in cui qualcosa cambia: applicare una scelta diversa di Tabulazioni / Spazi / Automatico nelle Preferenze risolve di nuovo subito il documento aperto, così un file governato da un .editorconfig o da un valore predefinito di linguaggio mantiene il suo rientro senza che tu debba cambiare scheda.

Più cursori

Tutto quanto sopra vale in ogni cursore quando modifichi con più cursori: digitare ( inserisce () in ciascuno, Invio mantiene il rientro di ogni riga, e Backspace tra coppie vuote cancella entrambe le celle in ciascuno. Un solo Annulla ritira l'intera modifica con più cursori in un colpo.

Backspace con cursori misti

Backspace cancella le coppie solo quando ogni cursore si trova tra una coppia vuota. Se alcuni cursori sono altrove, Backspace ricade sul comportamento normale in tutti quanti, così non cancella mai una chiusura vagante in un cursore mentre modifichi una parola in un altro.

In commenti e stringhe

Quando un colorizzatore di sintassi è attivo, l'accoppiamento automatico e l'apertura di blocco guidata dalle graffe si fanno da parte dentro i commenti e i letterali di stringa e di carattere: lì una { o una " sono testo comune, non codice, quindi l'editor le lascia esattamente come le hai digitate. Il rientro semplice (portare lo spazio bianco della riga precedente) continua a funzionare. In un documento di testo semplice senza colorizzatore non c'è nulla da sopprimere, quindi l'accoppiamento si comporta allo stesso modo ovunque.

Correlati

  • Plugin Rientro — l'impostazione dello stile di rientro e i comandi Aumenta/Riduci.
  • EditorConfig — rientro per progetto che sostituisce la tua impostazione globale.
  • Modifica con più cursori — posizionare più cursori e modificare con essi insieme.