[{"data":1,"prerenderedAt":46},["ShallowReactive",2],{"doc:fr:editor":3},{"title":4,"lede":5,"html":6,"headings":7},"L’éditeur intégré","L’éditeur intégré sert à parcourir et à modifier les fichiers d’un projet ou du worktree d’un agent sans quitter Escouade, avec la coloration syntaxique, la recherche, la navigation dans le code et le suivi des changements.","\u003Cp>\u003Cimg src=\"\u002Fimages\u002Feditor.jpg\" alt=\"L’éditeur sur le worktree d’un agent : l’arborescence avec les fichiers modifiés, des onglets, le texte avec ses lignes modifiées en marge et la barre de recherche\" width=\"1920\" height=\"960\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fp>\n\u003Ch2 id=\"ouvrir-l-editeur\">Ouvrir l’éditeur\u003C\u002Fh2>\n\u003Cp>L’éditeur prend la place de la conversation dans la zone principale. Le bouton « ← Conversation » en haut à gauche y revient. Les onglets ouverts et les dossiers dépliés sont gardés, projet par projet, tant qu’Escouade tourne : en revenant à l’éditeur, tu retrouves ce que tu y avais laissé.\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Pour ouvrir…\u003C\u002Fth>\n\u003Cth>Fais ceci\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>L’éditeur de l’agent affiché\u003C\u002Ftd>\n\u003Ctd>Le bouton « Éditeur » de l’en-tête de la conversation (« Parcourir et éditer les fichiers de cet agent »), ou « Ouvrir dans l’éditeur » dans le menu de la carte de l’agent. Il s’ouvre sur son worktree, ou sur le projet s’il n’en a pas.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>L’éditeur du projet\u003C\u002Ftd>\n\u003Ctd>Le bouton « Éditeur » en haut à droite de la barre de titre, ou « Parcourir » au pied de la barre latérale.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Un fichier modifié\u003C\u002Ftd>\n\u003Ctd>Le bouton \u003Ccode class=\"key\">&lt;\u002F&gt;\u003C\u002Fcode> d’une ligne du \u003Ca href=\"\u002Fdocs\u002Fgit\u002F\">panneau des fichiers non commités\u003C\u002Fa>, ou « Ouvrir dans l’éditeur » dans son menu.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Un fichier que l’agent a édité\u003C\u002Ftd>\n\u003Ctd>Le nom du fichier sur une ligne d’appel d’outil (Edit, Write…) dans la conversation : l’éditeur s’ouvre à la première ligne que cette édition a modifiée. La liste des fichiers modifiés qui résume la fin d’un tour fait de même, sans ligne précise.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Un fichier connu par son nom\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">Ctrl+P\u003C\u002Fcode>, voir \u003Ca href=\"#ouvrir-un-fichier-par-son-nom\">plus bas\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Sous macOS, \u003Ccode class=\"key\">Ctrl\u003C\u002Fcode> devient \u003Ccode class=\"key\">⌘\u003C\u002Fcode> dans les raccourcis de cette page, sauf pour revenir en arrière et en avant (voir \u003Ca href=\"#aller-a-la-definition\">plus bas\u003C\u002Fa>). Un fichier qui est en dehors du dossier du projet, ou de celui de l’agent, ne s’ouvre pas : un message le dit. Quand une source s’ouvre sans aucun onglet, l’éditeur affiche son premier fichier modifié, à défaut son \u003Ccode class=\"key\">README.md\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"la-source-le-projet-ou-le-worktree-d-un-agent\">La source : le projet ou le worktree d’un agent\u003C\u002Fh2>\n\u003Cp>Le bouton en haut à gauche de l’éditeur, à côté de « ← Conversation », dit ce que tu parcours : « ⎇ main » avec l’étiquette « branche » pour le dossier du projet, ou le nom d’un agent avec l’étiquette « worktree ». Il ouvre un menu « Parcourir » :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>le projet, avec sa branche et son chemin, et le nombre de ses fichiers modifiés (« Δ 3 ») ou « propre » ;\u003C\u002Fli>\n\u003Cli>chaque agent qui a un \u003Ca href=\"\u002Fdocs\u002Fworktrees\u002F\">worktree\u003C\u002Fa>, avec sa pastille de statut, son chemin, son modèle et le nombre de ses modifications (« 4 modif. ») ou « propre ».\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Chaque source a ses propres onglets, ses dossiers dépliés et son arborescence. Les fichiers sont lus et écrits directement sur le disque : ce que tu enregistres dans le worktree d’un agent est ce qu’il verra en lisant ce fichier. La barre sous le texte rappelle la source (« worktree · refacto-auth » ou « branche · main »).\u003C\u002Fp>\n\u003Ch2 id=\"l-arborescence\">L’arborescence\u003C\u002Fh2>\n\u003Cp>La colonne de gauche montre les fichiers de la source : ceux que git liste, suivis ou nouveaux et non ignorés. Les dossiers comme \u003Ccode class=\"key\">node_modules\u003C\u002Fcode>, que git ignore, n’y sont pas, ni les worktrees des agents quand ils sont rangés dans le dossier du projet. Elle va jusqu’à 50 000 fichiers ; au-delà, l’en-tête dit « liste tronquée ».\u003C\u002Fp>\n\u003Cul>\n\u003Cli>L’en-tête donne le chemin de la source et un résumé (« 128 fichiers · 3 modif. »). Les boutons de la rangée « Fichiers » créent un fichier ou un dossier (« Nouveau fichier », « Nouveau dossier ») dans le dossier de la dernière ligne cliquée (à défaut, celui du fichier affiché, ou la racine), « Actualiser » relit l’arborescence et « Tout réduire » replie les dossiers. Elle se met à jour aussi toute seule peu après chaque changement dans le dossier, par exemple quand l’agent écrit un fichier.\u003C\u002Fli>\n\u003Cli>Un fichier modifié, ajouté ou supprimé prend la couleur de son état et sa lettre (\u003Ccode class=\"key\">M\u003C\u002Fcode>, \u003Ccode class=\"key\">A\u003C\u002Fcode>, \u003Ccode class=\"key\">D\u003C\u002Fcode>) ; un dossier qui en contient un porte un point de la même couleur. Les onglets reprennent la couleur du fichier.\u003C\u002Fli>\n\u003Cli>Les fichiers que git ignore mais que le projet copie dans ses worktrees (les \u003Ccode class=\"key\">.env*\u003C\u002Fcode>, par défaut) sont dans l’arborescence, en grisé, avec l’info-bulle « Ignoré par git » : voir \u003Ca href=\"\u002Fdocs\u002Fworktrees\u002F\">les worktrees\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>La poignée entre la colonne et le texte règle la largeur de la colonne, au clavier comme à la souris ; un double-clic la remet à sa largeur d’origine. La largeur vaut pour tous les projets.\u003C\u002Fli>\n\u003Cli>Le clavier suit les règles des arbres : \u003Ccode class=\"key\">↑\u003C\u002Fcode> et \u003Ccode class=\"key\">↓\u003C\u002Fcode>, \u003Ccode class=\"key\">Home\u003C\u002Fcode> et \u003Ccode class=\"key\">End\u003C\u002Fcode> se déplacent, \u003Ccode class=\"key\">→\u003C\u002Fcode> déplie un dossier ou entre dedans, \u003Ccode class=\"key\">←\u003C\u002Fcode> le replie ou remonte au dossier parent, \u003Ccode class=\"key\">Entrée\u003C\u002Fcode> ouvre un fichier, \u003Ccode class=\"key\">F2\u003C\u002Fcode> renomme et \u003Ccode class=\"key\">Suppr\u003C\u002Fcode> supprime (\u003Ccode class=\"key\">⌘⌫\u003C\u002Fcode> sous macOS).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"le-menu-de-l-arborescence\">Le menu de l’arborescence\u003C\u002Fh3>\n\u003Cp>Un clic droit sur une ligne, ou sur l’espace libre sous les lignes, ouvre un menu :\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Entrée\u003C\u002Fth>\n\u003Cth>Ce qu’elle fait\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>« Nouveau fichier… »\u003C\u002Ftd>\n\u003Ctd>Ouvre un champ de nom dans le dossier de la ligne (la racine sur l’espace libre). Un nom comme \u003Ccode class=\"key\">src\u002Flib\u002Fa.ts\u003C\u002Fcode> crée aussi les dossiers qui manquent.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Nouveau dossier… »\u003C\u002Ftd>\n\u003Ctd>Même chose pour un dossier. Git ne liste pas un dossier vide : l’arborescence le montre quand même.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Ouvrir un terminal ici »\u003C\u002Ftd>\n\u003Ctd>Ouvre un \u003Ca href=\"\u002Fdocs\u002Fterminals\u002F\">terminal\u003C\u002Fa> dans ce dossier de la source.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Renommer… » (\u003Ccode class=\"key\">F2\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd>Remplace la ligne par un champ. Un nom comme \u003Ccode class=\"key\">autre\u002Fa.ts\u003C\u002Fcode> déplace le fichier. Les onglets ouverts suivent.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Supprimer » (\u003Ccode class=\"key\">Suppr\u003C\u002Fcode>, \u003Ccode class=\"key\">⌘⌫\u003C\u002Fcode> sous macOS)\u003C\u002Ftd>\n\u003Ctd>Envoie le fichier ou le dossier à la corbeille après confirmation (« Il part dans la corbeille. » ; pour un dossier, « Le dossier et ses 12 fichiers partent dans la corbeille. »).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Copier le chemin » et « Copier le chemin relatif »\u003C\u002Ftd>\n\u003Ctd>Copient le chemin complet, ou le chemin à partir de la racine de la source.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Le champ de nom refuse ce qui ne peut pas exister et le dit sous la ligne : un nom qui commence par une barre oblique, un nom invalide, un nom déjà pris (« a.ts » existe déjà à cet endroit.) ou un dossier que tu essaies de mettre dans lui-même. Si le fichier que tu crées est ignoré par git, un message le dit (« .env.local est ignoré par git : l’arborescence ne le montre pas. »).\u003C\u002Fp>\n\u003Cp>Supprimer un dossier ou un fichier dont des fichiers sont ouverts avec des modifications non enregistrées demande d’abord, pour chacun, s’il faut l’enregistrer. Renommer ne perd rien : les onglets ouverts, modifications comprises, suivent le nouveau nom.\u003C\u002Fp>\n\u003Ch2 id=\"onglets-et-enregistrement\">Onglets et enregistrement\u003C\u002Fh2>\n\u003Cp>Un clic sur un fichier l’ouvre dans un onglet. Le bouton × d’un onglet le ferme, comme un clic du milieu ; un point remplace la croix quand le fichier a des modifications non enregistrées. Deux onglets de même nom portent le nom de leur dossier pour qu’on les distingue.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>En haut à droite, « ● Non enregistré · Ctrl+S » ou « Enregistré » dit où en est le fichier affiché, et le bouton « Enregistrer » l’enregistre. \u003Ccode class=\"key\">Ctrl+S\u003C\u002Fcode> fait de même.\u003C\u002Fli>\n\u003Cli>L’enregistrement garde les fins de ligne du fichier (LF ou CRLF) et son BOM, et l’écriture est atomique : un fichier n’est jamais écrit à moitié. Un fichier en lecture seule est refusé.\u003C\u002Fli>\n\u003Cli>Fermer un onglet qui a des modifications demande « Enregistrer « a.ts » ? » avec « Enregistrer », « Ne pas enregistrer » et « Annuler » ; fermer la fenêtre d’Escouade avec des fichiers non enregistrés demande « Quitter Escouade ? » (« Quitter quand même »).\u003C\u002Fli>\n\u003Cli>Un fichier binaire n’est pas affiché (« Fichier binaire : pas d’aperçu. »), pas plus qu’un fichier de plus de 2 Mo (« Fichier trop volumineux pour l’éditeur (2,4 Mo). »).\u003C\u002Fli>\n\u003Cli>La barre sous le texte donne la ligne et la colonne du curseur (« Ln 9, Col 22 »), le langage, l’encodage (UTF-8), les fins de ligne et l’indentation du fichier (« Espaces : 2 » ou « Tabulations »), que l’éditeur déduit du fichier.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"le-texte\">Le texte\u003C\u002Fh2>\n\u003Cp>La coloration syntaxique suit l’extension du fichier. Un fichier d’un autre type s’affiche en « Texte ».\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Langage\u003C\u002Fth>\n\u003Cth>Extensions\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>TypeScript, JavaScript\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">.ts\u003C\u002Fcode>, \u003Ccode class=\"key\">.mts\u003C\u002Fcode>, \u003Ccode class=\"key\">.cts\u003C\u002Fcode>, \u003Ccode class=\"key\">.tsx\u003C\u002Fcode>, \u003Ccode class=\"key\">.js\u003C\u002Fcode>, \u003Ccode class=\"key\">.mjs\u003C\u002Fcode>, \u003Ccode class=\"key\">.cjs\u003C\u002Fcode>, \u003Ccode class=\"key\">.jsx\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Web\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">.html\u003C\u002Fcode>, \u003Ccode class=\"key\">.css\u003C\u002Fcode>, \u003Ccode class=\"key\">.scss\u003C\u002Fcode>, \u003Ccode class=\"key\">.svelte\u003C\u002Fcode>, \u003Ccode class=\"key\">.vue\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Données et configuration\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">.json\u003C\u002Fcode>, \u003Ccode class=\"key\">.yaml\u003C\u002Fcode>, \u003Ccode class=\"key\">.yml\u003C\u002Fcode>, \u003Ccode class=\"key\">.toml\u003C\u002Fcode>, \u003Ccode class=\"key\">.xml\u003C\u002Fcode>, \u003Ccode class=\"key\">.svg\u003C\u002Fcode>, \u003Ccode class=\"key\">.sql\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Documents\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">.md\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Langages compilés\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">.rs\u003C\u002Fcode>, \u003Ccode class=\"key\">.go\u003C\u002Fcode>, \u003Ccode class=\"key\">.java\u003C\u002Fcode>, \u003Ccode class=\"key\">.c\u003C\u002Fcode>, \u003Ccode class=\"key\">.h\u003C\u002Fcode>, \u003Ccode class=\"key\">.cpp\u003C\u002Fcode>, \u003Ccode class=\"key\">.hpp\u003C\u002Fcode>, \u003Ccode class=\"key\">.cc\u003C\u002Fcode>, \u003Ccode class=\"key\">.cs\u003C\u002Fcode>, \u003Ccode class=\"key\">.kt\u003C\u002Fcode>, \u003Ccode class=\"key\">.swift\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Scripts\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">.py\u003C\u002Fcode>, \u003Ccode class=\"key\">.rb\u003C\u002Fcode>, \u003Ccode class=\"key\">.php\u003C\u002Fcode>, \u003Ccode class=\"key\">.sh\u003C\u002Fcode>, \u003Ccode class=\"key\">.bash\u003C\u002Fcode>, \u003Ccode class=\"key\">.ps1\u003C\u002Fcode>, \u003Ccode class=\"key\">Dockerfile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Les fichiers \u003Ccode class=\"key\">.prisma\u003C\u002Fcode> et \u003Ccode class=\"key\">.tf\u003C\u002Fcode> sont reconnus, mais sans coloration.\u003C\u002Fp>\n\u003Cp>L’éditeur a ce qu’on attend d’un éditeur de code : numéros de ligne, ligne courante marquée, parenthèses et crochets repérés et fermés tout seuls, indentation qui suit ce que tu tapes, \u003Ccode class=\"key\">Tab\u003C\u002Fcode> pour indenter et \u003Ccode class=\"key\">Ctrl+Z\u003C\u002Fcode> pour annuler.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">Alt+clic\u003C\u002Fcode> (\u003Ccode class=\"key\">⌥+clic\u003C\u002Fcode> sous macOS) ajoute un curseur.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">Ctrl+F\u003C\u002Fcode> ouvre la barre de recherche dans le fichier, en haut du texte : « suivant », « précédent », « tout », et les options « respecter la casse », « mot entier » et « expression régulière », avec le champ « Remplacer », « remplacer » et « tout remplacer ». \u003Ccode class=\"key\">Échap\u003C\u002Fcode> la ferme.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"les-lignes-modifiees\">Les lignes modifiées\u003C\u002Fh3>\n\u003Cp>Dans la marge, à côté des numéros, une barre colorée marque les lignes modifiées depuis la version de référence du fichier, et un repère marque l’endroit d’où des lignes ont disparu. La version de référence est celle du dernier commit. Pour le worktree d’un agent, c’est celle où sa branche a quitté sa branche de base : les commits de l’agent comptent alors comme des changements.\u003C\u002Fp>\n\u003Cp>Au-dessus du texte, le chemin du fichier est suivi d’un résumé : « 5 lignes modifiées vs main », « Nouveau fichier · absent de main » ou « Identique à main ». Dans le dossier du projet, la référence s’écrit « HEAD ».\u003C\u002Fp>\n\u003Cp>Le bouton « Voir les changements » (visible quand le fichier a une version de référence) affiche ces changements dans le texte : au-dessus de chaque bloc modifié, les lignes de la version de référence, avec un bouton « Annuler ce bloc » qui les remet dans le texte. Ça modifie le texte sans l’enregistrer : \u003Ccode class=\"key\">Ctrl+Z\u003C\u002Fcode> défait, et rien n’est écrit tant que tu n’as pas enregistré. Un second clic sur le bouton referme la comparaison.\u003C\u002Fp>\n\u003Ch2 id=\"quand-un-fichier-change-sur-le-disque\">Quand un fichier change sur le disque\u003C\u002Fh2>\n\u003Cp>Tant que l’éditeur est ouvert, il relit les fichiers ouverts à chaque changement du dossier, par exemple quand l’agent travaille.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Un fichier que tu n’as pas modifié prend la nouvelle version tout seul, sans toucher à la position du curseur.\u003C\u002Fli>\n\u003Cli>Un fichier que tu as modifié ne change pas sous tes doigts : un bandeau apparaît, « Ce fichier a changé sur le disque. », avec trois boutons.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Bouton\u003C\u002Fth>\n\u003Cth>Effet\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>« Recharger »\u003C\u002Ftd>\n\u003Ctd>Abandonne tes modifications et prend la version du disque.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Comparer »\u003C\u002Ftd>\n\u003Ctd>Affiche dans le texte ce que le disque a de différent : au-dessus de chaque bloc, les lignes du disque, avec « Prendre ce bloc ». Le bandeau dit « Comparaison avec la version du disque. »\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>« Garder ma version »\u003C\u002Ftd>\n\u003Ctd>Enregistre ta version par-dessus celle du disque.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Si le fichier change encore pendant que tu le compares, le bandeau le dit (« Le fichier a encore changé sur le disque : la comparaison montre sa nouvelle version. ») et « Garder ma version » attend une seconde : un clic visé sur la version précédente n’écrase pas la nouvelle. Un enregistrement est refusé tant que le fichier a changé sur le disque depuis que tu l’as lu : tu n’écrases jamais le travail de l’agent sans l’avoir vu.\u003C\u002Fp>\n\u003Cp>Si le fichier est supprimé, le bandeau dit « Ce fichier a été supprimé. », avec « Fermer » et « Le recréer en enregistrant ».\u003C\u002Fp>\n\u003Ch2 id=\"aller-a-la-definition\">Aller à la définition\u003C\u002Fh2>\n\u003Cp>Avec \u003Ccode class=\"key\">Ctrl\u003C\u002Fcode> enfoncé (\u003Ccode class=\"key\">⌘\u003C\u002Fcode> sous macOS), ce qui mène ailleurs est souligné sous la souris, avec une main, et un clic le suit. \u003Ccode class=\"key\">F12\u003C\u002Fcode> suit ce qui est sous le curseur du texte. Il n’y a pas de serveur de langage : Escouade se sert de l’arborescence de la source, de la syntaxe du fichier et d’une recherche dans les fichiers.\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Sous le curseur\u003C\u002Fth>\n\u003Cth>Où ça mène\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Un import de script (\u003Ccode>from '…'\u003C\u002Fcode>, \u003Ccode>import '…'\u003C\u002Fcode>, \u003Ccode class=\"key\">import('…')\u003C\u002Fcode>, \u003Ccode class=\"key\">require('…')\u003C\u002Fcode>) dans un fichier JavaScript, TypeScript, Svelte ou Vue\u003C\u002Ftd>\n\u003Ctd>Le fichier importé. Les extensions, les dossiers \u003Ccode class=\"key\">index\u003C\u002Fcode> et le source TypeScript d’un \u003Ccode class=\"key\">.js\u003C\u002Fcode> sont trouvés, et les alias de \u003Ccode class=\"key\">tsconfig.json\u003C\u002Fcode> ou \u003Ccode class=\"key\">jsconfig.json\u003C\u002Fcode> (\u003Ccode class=\"key\">paths\u003C\u002Fcode>, \u003Ccode class=\"key\">baseUrl\u003C\u002Fcode>) et le \u003Ccode class=\"key\">$lib\u003C\u002Fcode> de SvelteKit sont suivis. Un paquet (\u003Ccode class=\"key\">node_modules\u003C\u002Fcode>) ne mène nulle part.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">@import\u003C\u002Fcode>, \u003Ccode class=\"key\">@use\u003C\u002Fcode>, \u003Ccode class=\"key\">@forward\u003C\u002Fcode> ou \u003Ccode class=\"key\">url(…)\u003C\u002Fcode> dans une feuille de style, une page HTML, Svelte ou Vue\u003C\u002Ftd>\n\u003Ctd>Le fichier (les partiels Sass \u003Ccode class=\"key\">_x.scss\u003C\u002Fcode> sont trouvés).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mod x;\u003C\u002Fcode> dans un fichier Rust\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">x.rs\u003C\u002Fcode> ou \u003Ccode class=\"key\">x\u002Fmod.rs\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>from a.b import c\u003C\u002Fcode> ou \u003Ccode>import a.b\u003C\u002Fcode> dans un fichier Python\u003C\u002Ftd>\n\u003Ctd>Le fichier du module, imports relatifs compris.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Un lien relatif, \u003Ccode class=\"key\">src\u003C\u002Fcode> ou \u003Ccode class=\"key\">href\u003C\u002Fcode> dans un fichier Markdown ou HTML\u003C\u002Ftd>\n\u003Ctd>Le fichier.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Un chemin écrit n’importe où, qui existe dans la source (\u003Ccode class=\"key\">src\u002Fapp.ts\u003C\u002Fcode>, \u003Ccode class=\"key\">.\u002Fa.ts\u003C\u002Fcode>), éventuellement suivi de \u003Ccode class=\"key\">:42\u003C\u002Fcode> ou \u003Ccode class=\"key\">:42:7\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Le fichier, à cette ligne et cette colonne.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Un nom (variable, fonction, classe, type…)\u003C\u002Ftd>\n\u003Ctd>Sa définition : dans le fichier, par sa syntaxe, au plus près du curseur ; dans le fichier d’où il est importé ; sinon dans les fichiers du même langage, où une recherche trouve ce qui le déclare. Rien dans un commentaire, une chaîne ou un mot-clé, ni dans un fichier Markdown ou texte.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Une seule destination est ouverte tout de suite. S’il y en a plusieurs, une liste « Définitions de « nom » » s’ouvre sous le mot : \u003Ccode class=\"key\">↑\u003C\u002Fcode> et \u003Ccode class=\"key\">↓\u003C\u002Fcode> choisissent, \u003Ccode class=\"key\">Entrée\u003C\u002Fcode> ouvre, \u003Ccode class=\"key\">Échap\u003C\u002Fcode> ferme. Sans résultat, un message dit « Aucune définition trouvée pour « nom ». » ; si le fichier visé n’est pas dans la source, « Fichier introuvable : … ».\u003C\u002Fp>\n\u003Cp>\u003Ccode class=\"key\">Maj+F12\u003C\u002Fcode> sur un nom cherche où il est utilisé : la recherche dans les fichiers s’ouvre sur ce nom, mot entier, casse respectée. Le texte est cherché tel quel, commentaires compris.\u003C\u002Fp>\n\u003Ch3 id=\"revenir-en-arriere\">Revenir en arrière\u003C\u002Fh3>\n\u003Cp>Chaque saut (un clic, \u003Ccode class=\"key\">F12\u003C\u002Fcode>, un résultat de recherche, un fichier ouvert par \u003Ccode class=\"key\">Ctrl+P\u003C\u002Fcode>) garde l’endroit d’où tu es parti. \u003Ccode class=\"key\">Alt+←\u003C\u002Fcode> y revient et \u003Ccode class=\"key\">Alt+→\u003C\u002Fcode> repart en avant, comme dans un navigateur ; les boutons « précédent » et « suivant » de la souris font de même. Sous macOS, ce sont \u003Ccode class=\"key\">⌃-\u003C\u002Fcode> et \u003Ccode class=\"key\">⌃⇧-\u003C\u002Fcode>, avec la touche Contrôle et non \u003Ccode class=\"key\">⌘\u003C\u002Fcode>. L’historique garde 50 endroits par projet et par source.\u003C\u002Fp>\n\u003Ch2 id=\"ouvrir-un-fichier-par-son-nom\">Ouvrir un fichier par son nom\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"key\">Ctrl+P\u003C\u002Fcode> ouvre la palette « Ouvrir un fichier » depuis n’importe où dans un projet, éditeur ouvert ou non. Elle cherche dans la source de l’éditeur s’il est ouvert, sinon dans le worktree de l’agent affiché, sinon dans le projet ; le nom de la source est à droite du champ.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Le champ dit « Nom du fichier, ou nom:42 pour une ligne ». Tape une partie du nom, ou seulement quelques lettres dans l’ordre : le début du nom compte le plus, puis un morceau de nom, puis le chemin.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">nom:42\u003C\u002Fcode> ouvre le fichier à la ligne 42, et \u003Ccode class=\"key\">nom:42:7\u003C\u002Fcode> à la ligne 42, colonne 7, comme les erreurs d’une trace (\u003Ccode class=\"key\">src\u002Fapp.ts:42:7\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>Avec un champ vide, la liste montre d’abord les derniers fichiers ouverts dans cette source (30 au plus), sans celui qui est affiché : \u003Ccode class=\"key\">Entrée\u003C\u002Fcode> revient donc au fichier précédent.\u003C\u002Fli>\n\u003Cli>La palette montre 50 résultats au plus (« Les 50 premiers résultats : précise ta recherche. »). Un fichier ignoré par git porte l’étiquette « ignoré par git ». \u003Ccode class=\"key\">↑\u003C\u002Fcode> et \u003Ccode class=\"key\">↓\u003C\u002Fcode> choisissent, \u003Ccode class=\"key\">Entrée\u003C\u002Fcode> ouvre, \u003Ccode class=\"key\">Échap\u003C\u002Fcode> ferme.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"rechercher-dans-les-fichiers\">Rechercher dans les fichiers\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"key\">Ctrl+Maj+F\u003C\u002Fcode> ouvre la recherche dans tous les fichiers de la source, dans la colonne de gauche ; la loupe au-dessus de l’arborescence fait de même, et le bouton voisin revient aux fichiers. Si un texte d’une seule ligne est sélectionné dans le code, c’est lui qui est cherché. \u003Ccode class=\"key\">Ctrl+F\u003C\u002Fcode> reste la recherche dans le fichier affiché.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Le champ « Rechercher » lance la recherche 250 ms après la dernière frappe ; \u003Ccode class=\"key\">Entrée\u003C\u002Fcode> la lance tout de suite. Trois boutons règlent la recherche : « Respecter la casse » (\u003Ccode class=\"key\">Aa\u003C\u002Fcode>), « Mot entier » (\u003Ccode class=\"key\">ab\u003C\u002Fcode>) et « Expression régulière » (\u003Ccode class=\"key\">.*\u003C\u002Fcode>). Une expression invalide est signalée (« Expression régulière invalide. »).\u003C\u002Fli>\n\u003Cli>Escouade cherche avec \u003Ccode>git grep\u003C\u002Fcode> dans les fichiers que git liste (suivis, ou nouveaux et non ignorés), sans les fichiers binaires, et sans les worktrees des agents quand on cherche dans le projet. Le résumé dit « 12 résultats dans 3 fichiers ».\u003C\u002Fli>\n\u003Cli>Les résultats sont groupés par fichier, avec le nombre de lignes trouvées, et la partie qui correspond est surlignée. Un clic sur une ligne ouvre le fichier à cette ligne et cette colonne. \u003Ccode class=\"key\">↑\u003C\u002Fcode> et \u003Ccode class=\"key\">↓\u003C\u002Fcode>, \u003Ccode class=\"key\">Home\u003C\u002Fcode> et \u003Ccode class=\"key\">End\u003C\u002Fcode> parcourent la liste, \u003Ccode class=\"key\">→\u003C\u002Fcode> et \u003Ccode class=\"key\">←\u003C\u002Fcode> déplient et replient un fichier.\u003C\u002Fli>\n\u003Cli>Les résultats s’arrêtent aux 2 000 premières lignes (« Résultats limités aux 2 000 premiers. ») ou après 10 secondes (« Recherche arrêtée après 10 s : résultats partiels. »).\u003C\u002Fli>\n\u003Cli>La recherche est gardée quand tu fermes l’éditeur, par projet ; en changeant de source, elle repart sur la nouvelle.\u003C\u002Fli>\n\u003C\u002Ful>\n",[8,12,15,18,22,25,28,31,34,37,40,43],{"id":9,"text":10,"depth":11},"ouvrir-l-editeur","Ouvrir l’éditeur",2,{"id":13,"text":14,"depth":11},"la-source-le-projet-ou-le-worktree-d-un-agent","La source : le projet ou le worktree d’un agent",{"id":16,"text":17,"depth":11},"l-arborescence","L’arborescence",{"id":19,"text":20,"depth":21},"le-menu-de-l-arborescence","Le menu de l’arborescence",3,{"id":23,"text":24,"depth":11},"onglets-et-enregistrement","Onglets et enregistrement",{"id":26,"text":27,"depth":11},"le-texte","Le texte",{"id":29,"text":30,"depth":21},"les-lignes-modifiees","Les lignes modifiées",{"id":32,"text":33,"depth":11},"quand-un-fichier-change-sur-le-disque","Quand un fichier change sur le disque",{"id":35,"text":36,"depth":11},"aller-a-la-definition","Aller à la définition",{"id":38,"text":39,"depth":21},"revenir-en-arriere","Revenir en arrière",{"id":41,"text":42,"depth":11},"ouvrir-un-fichier-par-son-nom","Ouvrir un fichier par son nom",{"id":44,"text":45,"depth":11},"rechercher-dans-les-fichiers","Rechercher dans les fichiers",1791926754943]