Aller au contenu

Auto-fermeture et indentation intelligente

Pendant la frappe, l'éditeur ferme les parenthèses et les guillemets pour vous, conserve votre indentation sur les nouvelles lignes, ouvre les blocs entre accolades, et applique une unité d'indentation cohérente (tabulations ou espaces) à la touche Tab, à la désindentation par Backspace comme à l'indentation automatique. Tout ce qui est décrit ici est une fonctionnalité intégrée de l'éditeur ; les commandes de menu correspondantes et le réglage du style d'indentation viennent de l'extension Indentation fournie.

Le mécanisme est conçu pour être invisible — il n'agit que sur le caractère que vous venez de taper, et s'efface partout où il gênerait (dans les commentaires et les chaînes, devant des mots existants, avec le mauvais caractère partenaire).

Auto-fermeture des parenthèses et des guillemets

Taper une parenthèse ou un guillemet ouvrant insère son partenaire et laisse le curseur entre les deux :

Vous tapez Vous obtenez Curseur
( () entre les deux
[ [] entre les deux
{ {} entre les deux
" "" entre les deux
' '' entre les deux

Quelques règles évitent que cela devienne agaçant :

  • Frappe traversante. Taper un caractère fermant quand le même caractère se trouve déjà à droite du curseur le franchit au lieu d'en insérer un second — taper d'une traite à travers () ou "" laisse donc une seule paire équilibrée.
  • Pas de fermeture devant un mot. Un ouvrant n'est complété que si le caractère suivant est un blanc, un fermant ou la fin de ligne — ajouter ( juste avant du texte existant n'injecte donc pas un ) parasite en plein milieu.
  • Guillemets sensibles à l'apostrophe. Un ' tapé juste après une lettre (comme dans don't) est traité comme une apostrophe et n'est pas apparié. Les guillemets ne s'auto-ferment que dans un contexte neutre (début de jeton, après un blanc ou un opérateur).
  • Chevrons uniquement dans le balisage. <> ne s'auto-ferment que dans les documents HTML/XML, où < ouvre une balise. Partout ailleurs < est un opérateur de comparaison ou de décalage et il est laissé tel quel.

Entourer une sélection (taper pour entourer)

Avec du texte sélectionné, taper un ouvrant ne remplace pas la sélection — il l'entoure :

select value  then type (        →   (value)
  • Fonctionne avec ( [ { " ' (pas < — hors balisage c'est un opérateur).
  • Le texte intérieur reste sélectionné ensuite, ce qui permet d'enchaîner : tapez ( puis " et vous obtenez ("value").
  • Avec plusieurs curseurs, chaque sélection est entourée indépendamment — et toute l'opération est une seule étape d'annulation.

Supprimer une paire

Appuyer sur Backspace avec le curseur entre une paire auto-insérée vide ((|), [|], {|}, "|", '|', ou <|> en balisage) supprime les deux caractères en une fois : vous annulez donc une auto-fermeture d'une seule touche. Dès qu'il y a du contenu entre la paire, Backspace se comporte normalement.

Indentation intelligente sur Enter

Appuyer sur Enter reporte les blancs de tête de la ligne courante sur la nouvelle ligne, si bien que vous restez à la même profondeur sans retaper de tabulations ou d'espaces :

  • Conserver l'indentation. La nouvelle ligne commence avec la même indentation que la ligne quittée.
  • Ouvrir un niveau. Si la ligne quittée se termine par un ouvrant ({, [, (), la nouvelle ligne est indentée d'un niveau supplémentaire.
  • Ouvrir un bloc. Si le curseur se trouve entre un ouvrant et son fermant correspondant, le bloc se déploie : la nouvelle ligne est indentée d'un niveau de plus et le fermant descend sur sa propre ligne, à la profondeur de l'ouvrant.
if (cond) {|}        Enter        if (cond) {
                     ───────►          |
                                   }

Style d'indentation — tabulations, espaces ou auto

Une seule unité d'indentation pilote la touche Tab, la désindentation par Backspace et l'indentation automatique ci-dessus, si bien qu'elles restent toujours cohérentes. Choisissez-la dans Préférences ▸ Extensions ▸ Indentation :

Style Comportement
Tabulations (défaut pour les nouveaux fichiers) Un niveau est un vrai caractère de tabulation ; Espaces par indentation règle sa largeur visuelle.
Espaces Un niveau vaut Espaces par indentation caractères d'espace.
Auto (détecter depuis le document) L'éditeur analyse l'indentation existante du document et la suit — un fichier indenté avec des tabulations continue avec des tabulations, un fichier à 2 espaces continue avec deux espaces. Un fichier sans indentation retombe sur le défaut (tabulations).

Les nouveaux fichiers sans titre utilisent par défaut Tabulations, largeur 4.

Ajuster l'indentation à la main

L'extension Indentation ajoute deux commandes (aussi sous Édition ▸ Indentation) qui indentent ou désindentent chaque ligne touchée par la sélection — ou la ligne du curseur quand rien n'est sélectionné :

Commande Raccourci
Augmenter l'indentation Ctrl+]
Diminuer l'indentation Ctrl+[

Défauts par langage

Certains langages ont une convention d'indentation quasi universelle, et l'éditeur la livre comme défaut de ce langage — un fichier fraîchement ouvert de ce type s'indente correctement sans aucune configuration :

Langage Défaut
Python 4 espaces (PEP 8)
Rust 4 espaces (rustfmt)
Markdown 4 espaces (listes imbriquées)
YAML 2 espaces (les tabulations sont interdites)
JSON 2 espaces
Go tabulations (gofmt)
C / C++ tabulations

Tous les autres langages ne portent délibérément aucun défaut et suivent votre réglage global d'indentation. Changer à la main le langage d'un document (le menu Langue) ré-applique immédiatement le défaut correspondant.

Le défaut vit dans le fichier de définition du langage (colorizers/<id>.json, clé "indent": { "style": "tabs|spaces", "width": N }). Un utilisateur averti peut modifier un défaut livré en plaçant une copie éditée de ce fichier dans le répertoire de substitution utilisateur — le catalogue remplace les définitions par identifiant.

Prévu : substitutions par langage dans les Préférences

Un tableau de réglages pour remplacer ces défauts par langage (sans toucher au JSON) est conçu et planifié comme prochaine étape de cette fonctionnalité ; en attendant, la substitution JSON ci-dessus et les couches ci-dessous sont les moyens de piloter l'indentation.

D'où vient l'unité d'indentation (priorité)

Quand plusieurs sources ont un avis sur l'indentation, l'éditeur les arbitre en un seul endroit et applique le gagnant, priorité la plus haute d'abord :

  1. Le .editorconfig du projet — quand il est présent et que « Appliquer les paramètres .editorconfig » est activé, les indent_style / indent_size / tab_width du projet l'emportent pour les fichiers correspondants.
  2. Le défaut livré du langage — le tableau ci-dessus, quand le langage du document en déclare un.
  3. Votre réglage global d'indentation — le choix Tabulations / Espaces / Auto ci-dessus.

Ainsi un projet livré avec un .editorconfig l'emporte sur tout pour les fichiers de ce projet ; un fichier Python hors d'un tel projet s'indente avec les espaces PEP-8 même si votre réglage global est en tabulations ; et tout le reste suit votre réglage global. Vous pouvez toujours changer l'indentation d'un document à la main ensuite.

La priorité vaut dès que quelque chose change : appliquer un autre choix Tabulations / Espaces / Auto dans les Préférences ré-arbitre immédiatement le document ouvert, si bien qu'un fichier régi par un .editorconfig ou un défaut de langage garde son indentation sans que vous ayez à changer d'onglet.

Multi-curseur

Tout ce qui précède s'applique à chaque curseur quand vous éditez avec plusieurs curseurs : taper ( insère () à chacun, Enter conserve l'indentation de chaque ligne, et Backspace entre des paires vides supprime les deux caractères à chacun. Un seul Annuler défait toute la modification multi-curseur en une étape.

Backspace avec des curseurs mixtes

Backspace ne supprime des paires que si chaque curseur se trouve entre une paire vide. Si certains curseurs sont ailleurs, Backspace reprend son comportement normal à tous, si bien qu'il ne supprime jamais un fermant isolé à un curseur pendant qu'il édite un mot à un autre.

Dans les commentaires et les chaînes

Quand un colorizer syntaxique est actif, l'auto-fermeture et l'ouverture de bloc pilotée par les accolades s'effacent dans les commentaires et les littéraux de chaîne/caractère — là, un { ou un " est du texte ordinaire, pas du code, et l'éditeur le laisse exactement tel que tapé. L'indentation simple (report des blancs de la ligne précédente) fonctionne toujours. Dans un document en texte brut sans colorizer, il n'y a rien à inhiber : la fermeture se comporte partout de la même façon.

Voir aussi