Aller au contenu

Recherche

Deux façons de trouver au-delà du fichier courant, avec une règle commune : la portée est un chemin visible et éditable. Les deux panneaux montrent exactement où ils regardent — le projet du document courant par défaut — et élargir la recherche, c'est littéralement éditer ce chemin (jusqu'à ~ ou / si l'on veut). La recherche ne regarde jamais en silence là où on ne l'attend pas.

Étant un chemin, la portée se complète comme tel sur macOS : en tapant vers l'avant, les dossiers qui terminent le composant sous le curseur sont proposés, ~ compris. Une portée qui n'existe pas le dit, et nomme le dossier le plus proche qui existe — d'ordinaire à une faute de frappe de celui qu'on voulait. Les blancs autour d'un chemin collé sont ignorés.

Les deux parcours respectent .gitignore, sautent les fichiers cachés et plafonnent la taille des fichiers, grâce au moteur de ripgrep lui-même embarqué dans le noyau — pas un sous-processus.

Chercher partout (⇧⌘A)

Une boîte pour les fichiers, les symboles, les commandes et les réglages (Ctrl+Maj+A sous Linux). Ce qui est tapé est comparé aux quatre à la fois, et chaque sorte de réponse vient dans un groupe à elle, le groupe à la meilleure correspondance d'abord : taper save place les commandes Save au-dessus d'un save.md, taper main place main.rs au-dessus d'une commande qui le mentionne. Un groupe montre quelques lignes, assez pour choisir avec le groupe suivant encore en vue. Les fichiers sont ceux du projet, cherchés d'abord par leur nom ; les symboles sont ceux du serveur de langage, et arrivent quand il répond ; les commandes sont celles des menus ; les réglages sont les interrupteurs de l'éditeur, chacun avec son état. Sans rien de tapé, elle liste les fichiers ouverts et les commandes lancées récemment. Le fichier ou le symbole sélectionné montre son code à côté de la liste. ⏎ ouvre un fichier ou un symbole, lance une commande, et bascule un réglage — enregistré, et en vigueur aussitôt, comme s'il était changé dans les Réglages.

Tapez des fragments du nom de fichier — editwc trouve EditorWindowController.swift — avec correspondance floue et classement. ↑/↓ déplacent la sélection, ⏎ ouvre (en ramenant la fenêtre au premier plan si le fichier est déjà ouvert), ⎋ ferme. Une requête vide liste la portée par ordre alphabétique. Les mêmes filtres empilés que Chercher dans le projet s'appliquent ici — chaque type de filtre affine les chemins trouvés — et la ligne d'état dit combien de correspondances les filtres ont élaguées.

⏎ ouvre la ligne sélectionnée dès que les lignes répondent à ce qui est tapé ; tant qu'une recherche reste due — la requête vient de changer — il cherche à la place, pour qu'affiner une requête n'ouvre jamais un fichier par accident. ⌘⏎ (Ctrl+⏎ sous Linux) ouvre dans tous les cas. ↑/↓ déplacent la sélection, ⎋ ferme, et le double-clic ouvre aussi. La ligne d'état le rappelle. Le panneau peut être élargi et garde sa taille ; dans une ligne, le répertoire cède en premier, perdant son début, de sorte que le nom du fichier reste toujours lisible.

Sous la liste, l'endroit de la ligne sélectionnée est affiché : les premières lignes d'un fichier dans Ouvrir rapidement, la ligne d'une correspondance parmi celles qui l'entourent dans Chercher dans le projet, la déclaration d'un symbole dans Aller au symbole — lues dans le document ouvert quand le fichier l'est, qui peut être en avance sur le disque. Le séparateur entre les deux se déplace.

La portée est parcourue une fois à l'ouverture du panneau, puis filtrée en mémoire — la frappe reste instantanée sur un vrai dépôt, et le nombre de fichiers en ligne d'état dit ce qui est cherché.

Chercher dans le projet (⇧⌘F)

La requête est le texte à chercher, tel qu'il est tapé — ce qu'on colle dans une recherche est du code, et le code est plein de (, . et [. La bascule .* à côté de la requête la lit comme une expression régulière, et reste comme on l'a laissée jusqu'à ce que l'éditeur quitte. Les résultats arrivent en chemin:ligne: texte. ⏎ saute directement à la ligne correspondante. Les résultats sont plafonnés (200) pour rester instantanés ; affinez le motif plutôt que de faire défiler.

La casse suit la règle smart case popularisée par ripgrep : une requête tout en minuscules correspond à n'importe quelle casse, tandis qu'une requête contenant une majuscule est cherchée telle quelle. Ainsi todo trouve TODO, et TODO ne trouve que TODO.

Une ligne sous les résultats dit ce qu'a fait la recherche — « 18 matches in 4 files · 812 searched », « No matches in 812 files searched », ou la raison pour laquelle rien n'a pu être cherché (une portée inexistante, une où tout est ignoré, ou un motif invalide, cité). Un résultat vide n'est jamais muet : un motif mal tapé ou une portée erronée s'annoncent au lieu de ressembler à une absence de correspondances.

Filtres empilés

Sous la requête de Chercher dans le projet, + Add Filter empile des raffinements :

  • line contains / line excludes — le texte de la ligne trouvée ;
  • file contains / file excludes — le chemin du fichier du résultat.

Les filtres sont des sous-chaînes insensibles à la casse et se combinent par et : les lignes avec foo où bar apparaît aussi, mais pas dans les fichiers avec test dans le nom, c'est la requête foo plus line contains bar plus file excludes test. Les exclusions de fichier élaguent des fichiers entiers avant même de les ouvrir ; les recherches filtrées restent donc aussi rapides que les simples.

Le mot sélectionné

Sélectionner un mot entier marque les autres endroits où il apparaît dans le texte visible — une teinte grise, distincte de la sélection et des correspondances de la barre de recherche, pour que les trois se distinguent. Sélectionner une partie d'un mot, ou une étendue qui en couvre plusieurs, ne marque rien : ces sélections ont été faites pour autre chose.

⎋ range les marques et laisse la sélection, le mot reste donc là pour agir dessus. Modifier ou sélectionner ailleurs repose la question. La recherche couvre ce qui est à l'écran, là où une marque se voit, et un fichier long coûte donc ce que coûte un court.

Deux réglages dans Réglages ▸ Éditeur décident de ce qui compte : si Item vaut item, et si item dans items en est un. Les deux sont désactivés par défaut — un nom qui diffère par la casse est un autre nom, et le mot a été sélectionné en tant que mot.

La pile de sauts

Chaque saut — un résultat de recherche, Aller à la Définition, une référence, une entrée du plan, un chum, Aller à la ligne, la découverte suivante — retient d'où il est parti. Find Next et Aller au début/à la fin du bloc aussi, quand leur destination est hors de vue ; un pas vers une correspondance déjà à l'écran n'est pas un saut. Go Back (⌃⌘←) remonte ces origines ; Go Forward (⌃⌘→) les redescend. Chacun remet ce qu'il y avait quand l'endroit a été quitté : le curseur, ce qui était sélectionné, et le défilement de la vue. L'histoire se réécrit depuis le point courant : sauter vers un nouvel endroit jette la piste avant. Les positions survivent aux éditions en ligne/colonne : revenir après un changement atterrit près, pas perdu.

Aller à la dernière modification (⇧⌘⌫, Ctrl+Maj+Retour arrière sous Linux) va là où quelque chose a été changé en dernier, dans le fichier ouvert où c'était ; appuyé à nouveau avec le curseur encore là, il va au changement d'avant, et ainsi de suite. Une rafale de frappe sur quelques lignes est un seul endroit, charger ou recharger un fichier n'en est aucun, et les endroits suivent le texte quand on l'édite autour d'eux. Chacun est un saut, donc Go Back revient. La piste dure la session : un fichier fermé emporte ses endroits.

Fichiers récents (⌘E, Ctrl+E sous Linux) liste les fichiers ouverts récemment dans le projet au premier plan, le plus récent d'abord, sans celui qui est devant : ⌘E puis Entrée revient au fichier d'avant. Endroits récents (⌥⌘E, Ctrl+Alt+Maj+E sous Linux) liste où le curseur est passé — les endroits que les sauts ont quittés et les endroits modifiés, dans n'importe quel fichier — le plus récent d'abord, une entrée par endroit, chacune avec le code autour à côté de la liste. Les deux filtrent pendant la frappe. Les endroits, comme la piste des modifications, durent la session.

Un saut vers une ligne déjà à l'écran laisse la vue où elle est. Un saut hors de vue la déplace, en une brève animation, pour que la ligne se trouve au tiers de la hauteur, avec ce qui la précède en vue ; un saut lointain commence le mouvement un écran avant la cible, pour montrer de quel côté il est allé sans balayer tout le fichier. Quand le mouvement réduit est demandé dans les réglages du système, la vue se déplace d'un coup.

Pas encore là

  • Chercher partout ne liste que les réglages qui s'activent ou se désactivent ; une largeur de tabulation ou un thème se choisissent dans les Réglages. Deux appuis sur Maj ne l'ouvrent pas.
  • Le remplacement entre fichiers.
  • Les bascules casse/mot entier dans le panneau (le motif lui-même peut exprimer les deux).
  • L'historique des recherches persistant.
  • L'édition de la portée dans l'interface GTK, dont les panneaux ne cherchent que dans le projet courant ; la complétion des chemins viendra avec.