Patrice Ferlet
Patrice Ferlet
Créateur de ce blog.
Publié le juin 11, 2015 Temps de lecture: 4 min

Me suivre sur Mastodon

grep et vimgrep plus rapide, passez à "ag"

Utilisant vim depuis des années pour développer, je suis toujours étonné de découvrir des trucs à droite à gauche qui améliorent encore mon confort de travail. Et même sans utiliser vim, la ligne de commande est mon outils quotidien. Aujourd’hui, parlons d’un programme qui pourrait bien remplacer votre bon vieux “grep” et l’utilisation de “vimgrep”: “the silver searcher”.

Découvert sur la page de projet github, “the silver searcher” est une réimplémentation de “ack”, un outil de recherche de texte dans un répertoire comme le ferai “grep”. L’intérêt principal est tout simplement sa vitesse. Elle est tout bonnement impressionnante.

Petite note: “the silver searcher” est une référence direct à “the silver surfer” alias “le surfeur d’argent”, le personnage de comics.

“ag” est compatible avec le prototype de “ack”, un autre outil de recherche dont elle respecte les options et format ce qui lui confère la possibilité d’utiliser le plugin “ack” pour vim… je vous perds ? Bon on y va pas à pas.

Le programme “ag”

Comme expliqué sur la page github, “the silver searcher” est déjà packagé sur pas mal de distros. donc:

apt-get install silversearcher-ag
# ou
yum install the_silver_searcher
# ou encore avec pacma, emerge, etc.

Vous avez maintenant la commande ag sur votre ordinateur.

Pour lancer une recherche, par exemple trouver “foo” dans le répertoire courant:

ag foo

On remarque d’abord qu’on a pas à préciser le répertoire, ce qui est plus sympa quand on veut taper vite… et ensuite, la vitesse de réponse et le format agréable de lecture:

![Capture sortie ag](/static/upload/adb744f7-79ed-4912-934b-83e582fb4de9-Capture d’écran de 2015-06-11 10:26:17.png)

Deux remarques:

  • le “pattern” à chercher peut être une expression régulière
  • le format de sortie est adaptable

Vous pouvez préciser le répertoire si vous ne voulez pas chercher dans le répertoire courant, et en lisant la “man page” vous allez découvrir des tonnes d’options.

Si vous voulez comprendre pourquoi je suis passer à “ag”, regardez juste les benchmarks réalisés dans la section “What’s so great about Ag?” - c’est sans appel…

Mais encore ?

Avec “grep”, dans un projet “git”, je devais me débrouiller pour gérer des “exclusions”, en d’autres termes il me fallait éviter de chercher dans le répertoire “.git” sous peine de me prendre des résultats complètement inutiles dans la face. “ag” évite ces répertoires par défaut, la commande reste donc très légère et confortable.

Il est possible de dire à “ag” dans quel type de fichier on veut trouver le pattern. Pour connaitre les types supportés:

ag --list-file-types

La liste est longue, croyez moi. Donc par exemple:

ag --pyhton foo

ne cherchera “foo” que dans les fichier de type “python”. L’option est d’autant plus intéressante qu’un type de fichier peut avoir plusieurs extensions possibles. Par exemple, le HTML peut se trouver sour la forme “.html” ou “.htm”. et le “markdown” peut être suffixé par “.markdown”, “.mdown”, “.mdwn”, “.mkdn”, “.mkd” ou “.md”. Du coup, pas de commande à rallonge pour filtrer les extensions. Si ça c’est pas utile, faut m’expliquer votre pensé.

Dans Vim, deux méthodes

Deux solutions. Soit vous suivez la “manpage” (man ag) et vous ajoutez à votre “vimrc” ces lignes:

set grepprg=ag\ --vimgrep\ $*
set grepformat=%f:%l:%c:%m

Ce qui va vous permettre de taper (en remplaçant “pattern” par ce que vous cherchez):

:grep pattern

Puis tapez, comme avec vimgrep, :cwindow pour voir la liste des occurences, et de pouvoir ouvrir le fichier au bon endroit en pressant “Enter” sur le fichier en question.

Soit vous passez par le plugin Ack.vim et vous placez dans votre “vimrc”:

if executable('ag')
  let g:ackprg = 'ag --vimgrep'
endif

et vous pourrez utiliser la commande vim:

:Ack pattern

Cette commande va faire la recherche, ouvrir la mini-fenêtre de résultats et vous laisser ouvrir les fichiers de différentes manières (en onglet, directement dans le buffer en cours, etc… pressez “?” dans la fenêtre pour voir les options)

La vitesse de réponse est vraiment étonnante - vimgrep me gênait énormément à cause de sa lenteur. Mais tellement pratique que je ne pouvais pas m’en passer. Le combo “ag + ack.vim” s’installe en moins de 5 minutes et me fait gagner du temps et réduit le stresse de l’attente de résultat.

comments powered by Disqus