*usr_27.txt* Pour Vim version 6.2. Dernière modification : 31 déc 2001 MANUEL de l'UTILISATEUR VIM - par Bram Moolenaar Motifs et commandes de recherche Dans le chapitre 3, quelques motifs de recherche simples ont été mentionnés |03.9|. Vim peut effectuer des recherches bien plus complexes. Ce chapitre explicite les plus utilisées d'entre elles. Vous pouvez trouver le détail de leurs spécifications ici : |pattern|. |27.1| Ignorer la casse |27.2| Boucler à la fin du fichier |27.3| Décalages |27.4| Correspondre plusieurs fois |27.5| Alternatives |27.6| Collections de caractères |27.7| Classes de caractères |27.8| Chercher une coupure de ligne |27.9| Exemples Chapitre suivant : |usr_28.txt| Utiliser les replis Chapitre précédent : |usr_26.txt| Répéter des commandes Table des matières : |usr_toc.txt| ============================================================================== *27.1* Ignorer la casse Par défaut, les recherches de Vim sont sensibles à la casse. Par conséquent, "inclus", "INCLUS", et "Inclus" sont considérés comme trois mots différents et une recherche ne correspondra qu'avec l'un d'entre eux. Activez l'option 'ignorecase' : > :set ignorecase Cherchez à nouveau "inclus", vous trouverez maintenant aussi "Inclus", "INCLUS" et "InClUs" (activez l'option 'hlsearch' pour voir d'un coup d'oeil les endroits où le motif correspond). Vous pouvez désactiver cette option avec : > :set noignorecase Mais conservons-la activée, et cherchons "INCLUS". Vous trouverez le même texte qu'en cherchant "inclus". Activez maintenant l'option 'smartcase' : > :set ignorecase smartcase Si vous utilisez un motif contenant au moins une majuscule, la recherche devient sensible à la casse. L'idée, c'est qu'il ne vous était pas nécessaire de taper une majuscule ; par conséquent, si vous l'avez fait, c'est que vous recherchez une correspondance qui respecte la casse. Malin, non ? Avec ces deux options activées, vous trouverez ces correspondances : MOTIF CORRESPOND AVEC ~ mot mot, Mot, MOT, MoT, etc. Mot Mot MOT MOT MoT MoT CASSE DANS UN MOTIF Si vous voulez ignorer la casse pour un motif en particulier, préfixez-le avec la chaîne "\c". À l'inverse, l'utilisation de "\C" obligera la recherche à respecter la casse. Ce type d'indication prend le pas sur les options 'ignorecase' et 'smartcase' : quand "\c" ou "\C" est utilisé, leur valeur n'est pas prise en compte. MOTIF CORRESPOND AVEC ~ \Cmot mot \CMot Mot \cmot mot, Mot, MOT, MoT, etc. \cMot mot, Mot, MOT, MoT, etc. Le grand avantage à l'utilisation de "\c" et "\C" est qu'ils font partie du motif. Ainsi, si vous répétez un motif de l'historique de recherche, la même contrainte interviendra, même si les options 'ignorecase' ou 'smartcase' ont été changées entre temps. NOTE : L'utilisation d'éléments "\" dans les motifs de recherche dépend de l'option 'magic'. Dans ce chapitre, nous supposons que l'option 'magic' est activée, ce qui est la configuration standard et recommandée. Si vous la désactivez, de nombreux motifs de recherche deviendront alors invalides. NOTE : Si votre recherche prend plus de temps qu'escompté, vous pouvez l'interrompre avec CTRL-C sur Unix et CTRL-Break sur MS-DOS et MS-Windows. ============================================================================== *27.2* Boucler à la fin du fichier Par défaut, la recherche vers l'avant d'une chaîne de caractères commence à la position actuelle du curseur. Elle se poursuit ensuite vers la fin du fichier. Si, à ce moment, aucune correspondance n'est trouvée, la recherche continue depuis le début du fichier jusqu'à la position actuelle du curseur. Gardez à l'esprit qu'en utilisant plusieurs fois "n" pour rechercher la correspondance suivante, vous finirez par revenir à la première correspondance trouvée. Si vous l'oubliez, vous allez chercher éternellement ! Pour vous guider, Vim affiche ce message : La recherche a atteint la BAS, et continue en HAUT ~ Si vous utilisez la commande "?" pour chercher dans l'autre sens, vous obtiendrez plutôt ce message : La recherche a atteint le HAUT, et continue en BAS ~ Vous ne pouvez cependant pas savoir quand vous êtes revenu à la première correspondance trouvée. Une manière de le savoir consiste à activer l'option 'ruler' : > :set ruler Vim affichera la position du curseur en bas à droite de la fenêtre (dans la ligne d'état, s'il y en a une). Elle ressemble à ceci : 101,29 84% ~ Le premier nombre est le numéro de la ligne du curseur. Mémorisez ce numéro en commençant la recherche, de façon à savoir quand vous reviendrez à la position initiale. NE PAS BOUCLER Pour désactiver la poursuite de la recherche au début du fichier quand la fin est atteinte, utilisez cette commande : > :set nowrapscan Dès lors, quand la recherche atteint la fin du fichier, un message d'erreur apparaît : E385: la recherche a atteint le BAS sans trouver: mot ~ De cette façon, vous pouvez trouver toutes les correspondances en allant au début du fichier avec la commande "gg" et en poursuivant la recherche jusqu'à l'obtention de ce message. Si vous cherchez dans l'autre sens avec "?", le message sera : E384: la recherche a atteint le HAUT sans trouver: mot ~ ============================================================================== *27.3* Décalages Par défaut, la commande de recherche laisse le curseur au début de la correspondance. Vous pouvez demander à Vim de laisser le curseur ailleurs en spécifiant un décalage. Pour la recherche vers l'avant avec la commande "/", le décalage est spécifié en ajoutant une oblique (/) suivie du décalage souhaité : > /défaut/2 Cette commande cherche le motif "défaut" et place le curseur au début de la deuxième ligne qui suit la correspondance. En utilisant cette commande sur le paragraphe qui précède, Vim trouve le mot "défaut" dans la première ligne. Le curseur est alors placé deux lignes plus bas, sur "spécifiant". Si le décalage est juste un nombre, le curseur sera positionné autant de lignes plus bas par rapport à la correspondance trouvée. Le décalage peut être positif ou négatif. S'il est positif, le curseur est déplacé d'autant de lignes vers le bas, et vers le haut s'il est négatif. DÉCALAGES EN CARACTÈRES Le décalage "e" indique un décalage par rapport à la fin ["end"] de la correspondance. Il déplace le curseur sur le dernier caractère de la correspondance. La commande : > /const/e place le curseur sur le 't' de "const". Depuis cette position, l'ajout d'un nombre déplace le curseur vers l'avant d'autant de caractères. Cette commande place le curseur sur le caractère qui suit la correspondance : > /const/e+1 Un nombre positif déplace le curseur vers la droite, un nombre négatif vers la gauche. Par exemple : > /const/e-1 déplace le curseur sur le 's' de "const". Si le décalage commence par "b", le curseur est placé au début ["begin"] de la correspondance. Ce n'est pas vraiment utile, puisque ne pas mettre "b" produit le même résultat. Il n'est utile que quand un nombre est ajouté ou soustrait. Le curseur est alors déplacé d'autant de caractères vers l'avant ou vers l'arrière. Par exemple : > /const/b+2 place le curseur au début de la correspondance, puis le déplace de deux caractères vers la droite. Il arrive ainsi sur le "n". RÉPÉTER Pour répéter la recherche avec le motif précédemment utilisé mais avec un décalage différent, omettez le motif : > /ceci //e est équivalent à : > /ceci/e Pour la répéter avec le même décalage : > / "n" fait la même chose. Pour répéter la recherche sans le décalage utilisé précédemment : > // RECHERCHER VERS L'ARRIÈRE La commande "?" utilise les décalages de la même façon, mais vous devez utiliser un "?" pour séparer le décalage du motif, au lieu d'un "/" : > ?const?e-2 Le "b" et le "e" gardent leur signification, ils ne changent pas de direction avec le "?". POSITION DE DÉPART Quand vous commencez une recherche, elle débute normalement à la position du curseur. Quand vous spécifiez un décalage en lignes, cela peut poser des problèmes. Par exemple : > /const/-2 Ceci cherche le prochain mot "const" puis remonte de deux lignes. Si vous utilisez "n" pour chercher à nouveau, Vim repart de la même position et retrouve le même "const" ! En utilisant le même décalage, vous retourneriez à votre position de départ, et ainsi de suite : vous seriez coincé. Ce pourrait être pire : supposez qu'il existe une autre correspondance avec "const" sur la ligne suivante. Répéter la recherche vers l'avant trouverait cette correspondance et reculerait le curseur de deux lignes : le curseur irait en fait vers l'arrière ! Quand vous spécifiez un décalage en caractères, Vim compense. De cette façon, la recherche commence quelques caractères avant ou après, pour éviter de retrouver la même correspondance. ============================================================================== *27.4* Correspondre plusieurs fois L'élément "*" indique que l'élément qui le précède peut figurer un nombre indéfini de fois. Ainsi, la commande : > /a* cherche "a", "aa", "aaa", etc. Mais aussi "" (la chaîne vide), parce que « zéro fois » est également valide. "*" ne s'applique qu'au caractère qui le précède. Ainsi "ab*" correspond avec "a", "ab", "abb", "abbb", etc. Pour qu'une chaîne entière corresponde plusieurs fois, elle doit être regroupée en un élément unique. C'est possible en utilisant "\(" avant et "\)" après cette chaîne. Ainsi : > /\(ab\)* correspond avec : "ab", "abab", "ababab", etc. Et aussi avec "". Pour ne pas correspondre avec la chaîne vide, utilisez "\+". Cela impose à l'élément qui le précède de correspondre au moins une fois. > /ab\+ trouve "ab", "abb", "abbb", etc. "a" ne correspond pas s'il n'est pas suivi par "b". Pour correspondre optionnellement avec un élément, utilisez "\=". Exemple : > /onglets\= trouve "onglet" et "onglets". NOMBRE PRÉCIS DE CORRESPONDANCES Pour correspondre avec un nombre précis d'éléments, utilisez la forme "\{n,m}". "n" et "m" représentent des nombres. L'élément qui la précède devra correspondre entre "n" et "m" fois (inclus). Exemple : > /ab\{3,5} trouve "abbb", "abbbb" and "abbbbb". Si vous omettez "n", sa valeur par défaut est zéro. Quand "m" est omis, il vaut l'infini par défaut. Quand ",m" est omis, l'élément correspond exactement "n" fois. Exemples : MOTIF NOMBRE DE CORRESPONDANCES ~ \{,4} 0, 1, 2, 3 ou 4 \{3,} 3, 4, 5, etc. \{0,1} 0 ou 1, équivalent à \= \{0,} 0 ou plus, équivalent à * \{1,} 1 ou plus, équivalent à \+ \{3} 3 CORRESPONDRE AUSSI PEU QUE POSSIBLE Jusqu'ici, les éléments correspondaient avec autant de caractères qu'ils pouvaient trouver. Pour correspondre avec aussi peu de caractères que possible, utilisez "\{-n,m}". Le fonctionnement est le même que "\{n,m}", sauf que dans ce cas, le plus petit nombre de correspondances est trouvé. Par exemple, utiliser : > /ab\{-1,3} trouvera "ab" dans "abbb". En fait, il ne correspondra jamais avec plus d'un 'b', parce qu'il n'y a aucune raison d'en trouver plus. Il faut quelque chose de plus pour forcer le système à correspondre avec davantage de caractères que la limite inférieure. La même règle s'applique lors de l'omission de "n" ou de "m". Il est même possible d'enlever les deux nombres, ce qui donne "\{-}". Cela fait correspondre le motif zéro fois ou plus, le moins de fois possible. Cet élément pris isolément correspond toujours zéro fois : il n'est utile que s'il est combiné à autre chose. Par exemple : > /a.\{-}b Ceci correspond avec "axb" dans "axbxb". Si on utilise ce motif : > /a.*b La correspondance ferait autant de caractères que possible pour ".*", elle correspondrait donc avec "axbxb" comme un tout. ============================================================================== *27.5* Alternatives L'opérateur "ou" ["or"] dans un motif est "\|". Exemple : > /zorg\|lub Ce motif correspond avec "zorg" ou "lub". Plusieurs alternatives peuvent être concaténées : > /un\|deux\|trois cherche "un", "deux" ou "trois". Pour que ce type de motif corresponde plusieurs fois, il doit être placé entre "\(" et "\)" : > /\(zorg\|lub\)\+ cherche "zorg", "zorglub", "zorgzorg", "lubzorglub", etc. Autre exemple : > /fin\(si\|tantque\|pour\) cherche "finsi", "fintantque" et "finpour". "\&" est un élément similaire. Il oblige les deux alternatives à correspondre à la même position. La correspondance qui en résulte est la dernière alternative. Exemple : > /toujours\&... correspond avec "tou" dans "toujours", mais pas dans "toupet". ============================================================================== *27.6* Collections de caractères Pour trouver "a", "b" ou "c", vous pourriez utiliser "/a\|b\|c". Quand vous voulez correspondre avec toutes les lettres de "a" à "z", cela devient laborieux. Il existe une méthode plus rapide : > /[a-z] La construction [] ne correspond qu'avec un seul caractère. À l'intérieur, vous précisez les caractères qui peuvent correspondre. Vous pouvez inclure une liste de caractères, de cette façon : > /[0123456789abcdef] Ceci trouvera n'importe lequel des caractères désignés. Quand les caractères sont consécutifs, vous pouvez spécifier une plage. "0-3" signifie "0123". "w-z" signifie "wxyz". Ainsi, la commande précédente peut être abrégée par : > /[0-9a-f] Pour chercher le caractère "-" lui-même, mentionnez-le en premier ou en dernier. Les caractères spéciaux suivants sont acceptés pour faciliter leur utilisation dans une collection (ils peuvent être utilisés partout dans le motif de recherche) : \e \t \r \b Il existe quelques cas particuliers supplémentaires avec les collections [], reportez-vous à |/[]| pour plus de détails. COLLECTIONS COMPLÉMENTAIRES Pour éviter la correspondance avec un caractère particulier, utilisez "^" au début de la collection. L'élément [] correspond alors avec n'importe quel caractère, sauf les caractères spécifiés. Exemple : > /"[^"]*" < " double-apostrophe [^"] tout ce qui n'est pas un double-apostrophe * autant que possible " encore un double-apostrophe Ceci trouve "foo" et "3!x", avec les doubles-apostrophes. COLLECTIONS PRÉDÉFINIES Certaines collections sont utilisées très fréquemment. Vim fournit des raccourcis pour les désigner. Par exemple, la commande > /\a trouve les caractères alphabétiques. C'est équivalent à "/[a-zA-Z]". En voici quelques autres : ÉLÉMENT CORRESPOND AVEC ÉQUIVALENT ~ \d chiffre [0-9] \D non-chiffre [^0-9] \x chiffre hexa [0-9a-fA-F] \X non-chiffre hexa [^0-9a-fA-F] \s espace blanc [ ] ( et ) \S non-espace blanc [^ ] (ni ni ) \l alphabétique minuscule [a-z] \L non-alphabétique minuscule [^a-z] \u alphabétique majuscule [A-Z] \U non-alphabétique majuscule [^A-Z] NOTE : Utiliser ces collections prédéfines est bien plus rapide que préciser la collection des caractères qu'elles représentent. Ces éléments ne peuvent cependant pas être utilisés entre []. Ainsi, "[\d\l]" ne fonctionne PAS pour désigner un chiffre ou un alphabétique minuscule. Utilisez "\(\d\|\l\)" à la place. Reportez-vous à |/\s| pour la liste complète des collections. ============================================================================== *27.7* Classes de caractères Les collections de caractères correspondent à un jeu fixé de caractères. Une classe de caractères est semblable, mais avec une différence essentielle : le jeu de caractères peut être redéfini sans changer le motif de recherche. Par exemple, cherchez ce motif : > /\f\+ Le "\f" désigne un caractère de noms de fichier. Ainsi, le motif précédent correspond avec une séquence de caractères qui peut représenter un nom de fichier. Les caractères qui peuvent être inclus dans un nom de fichier dépendent de votre système d'exploitation. Sur MS-Windows, la contre-oblique (\) en fait partie, mais pas sur Unix. L'option 'isfname' permet de les spécifier. La valeur par défaut pour Unix est : > :set isfname < isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,= ~ Pour d'autres systèmes d'exploitation, la valeur par défaut est différente. Vous pouvez ainsi écrire un motif de recherche avec "\f" pour correspondre avec un nom de fichier, et il sera automatiquement adapté au système d'exploitation que vous utilisez. NOTE : En fait, Unix autorise l'utilisation d'à peu près n'importe quel caractère dans un nom de fichier, y compris l'espace. Inclure ces caractères dans 'isfname' serait théoriquement correct, mais trouver la fin d'un nom de fichier dans un texte deviendrait impossible. C'est pourquoi la valeur par défaut de 'isfname' (mentionnée plus haut) est un compromis. Les classes de caractères sont : ÉLÉMENT CORRESPOND AVEC OPTION ~ \i caractère d'identifiant 'isident' \I comme \i, sans les chiffres \k caractère de mot-clé 'iskeyword' \K comme \k, sans les chiffres \p caractère imprimable 'isprint' \P comme \p, sans les chiffres \f caractère de nom de fichier 'isfname' \F comme \f, sans les chiffres ============================================================================== *27.8* Chercher une coupure de ligne Vim peut trouver un motif contenant une coupure de ligne. Il faut préciser où cette coupure se produit, car tous les motifs mentionnés jusqu'ici ne correspondent pas avec une coupure de ligne. Pour identifier une coupure de ligne à une position particulière, utilisez l'élément "\n" : > /le\nmot Ceci correspondra à une ligne qui finit par "le" et une autre ligne commençant par "mot". Pour trouver aussi "le mot", il vous faut correspondre avec une coupure de ligne ou un espace. Pour ce faire, utilisez l'élément "\_s" : > /le\_smot Pour autoriser un nombre arbitraire d'espaces : > /le\_s\+mot Ceci trouve aussi quand "le " est à la fin de la ligne et " mot" au début de celle qui suit. "\s" correspond avec un espace blanc, "\_s" avec un espace blanc ou une coupure de ligne. De la même façon, "\a" correspond avec un caractère alphabétique, et "\_a" avec un caractère alphabétique ou une coupure de ligne. Les autres collections et classes de caractères peuvent être modifiées de la même façon en insérant un "_". Il est possible de faire correspondre de nombreux autres éléments avec une coupure de ligne en les faisant précéder de "\_". Par exemple, "\_." correspond avec n'importe quel caractère ou avec une coupure de ligne. NOTE : Le motif "\_.*" correspond jusqu'à la fin du fichier. Soyez prudent, il peut ralentir considérablement les commandes de recherche. Un autre exemple, "\_[]", une collection qui inclut une coupure de ligne : > /"\_[^"]*" Ceci trouve un texte entre doubles-apostrophes qui peut être réparti sur plusieurs lignes. ============================================================================== *27.9* Exemples Voici quelques motifs de recherche qui pourraient vous être utiles. Ils illustrent la manière dont les éléments mentionnés précédemment peuvent être combinés. TROUVER UNE PLAQUE D'IMMATRICULATION CALIFORNIENNE "1MGU103" est un exemple de plaque d'immatriculation. Elle comporte un chiffre, suivi de trois lettres majuscules puis de trois chiffres. Vous pouvez saisir cette séquence directement dans un motif de recherche : > /\d\u\u\u\d\d\d Une autre façon de faire consiste à spécifier le nombre de chiffres (trois) et de lettres (trois) : > /\d\u\{3}\d\{3} En utilisant des collections [] à la place : > /[0-9][A-Z]\{3}[0-9]\{3} Laquelle utiliser ? Celle dont vous vous souviendrez le plus facilement. Une technique basique et facile à mémoriser vaut mieux qu'une technique élaborée dont on ne se souvient pas. Si vous vous les rappelez toutes, alors évitez la dernière, qui est plus longue à taper et à exécuter. TROUVER UN IDENTIFIANT Dans les programmes en C (et dans de nombreux autres langages de programmation), un identifiant débute par une lettre, et la suite est constituée de lettres et chiffres. Les caractères de soulignement (_) peuvent aussi être utilisés. Il est possible de les trouver avec : > /\<\h\w*\> "\<" et "\>" sont utilisés pour ne trouver que les mots entiers. "\h" signifie "[A-Za-z_]" et "\w", "[0-9A-Za-z_]". NOTE : "\<" et "\>" dépendent de l'option 'iskeyword'. Si elle inclut "-", par exemple, alors "ident-" ne sera pas trouvé. Pour éviter cela, utilisez : > /\w\@