# Marqueur (édition de texte)

Un marqueur (en anglais : tag) est un mot-clé remarquable dans un fichier texte, que le rédacteur ou le lecteur est susceptible de vouloir rechercher. La caractéristique lui conférant cette qualité dépend de la nature du texte qui le contient.

## Définition

Dans un programme informatique, un marqueur correspond à un identifiant, en général une fonction, une constante, une macro-définition, une classe, ou tout autre élément pertinent de la grammaire du langage de programmation.
Dans certains fichiers de documentation exclusivement en texte brut, un marqueur peut correspondre aux têtes de chapitre ou à l'intitulé des rubriques. D'une manière générale, tout ce qui est susceptible d'être intégré à un index peut faire office de marqueur.

## Principe

Des logiciels permettent d'extraire de manière automatique les marqueurs d'un ensemble de fichiers. Ils constituent alors un ou plusieurs fichiers de marqueurs, qui contiennent l'ensemble des marqueurs trouvés lors de l'analyse des fichiers textes.
Parallèlement, de nombreux logiciels savent utiliser les fichiers de marqueurs pour rendre service à l'utilisateur. Plus particulièrement, la majorité les éditeurs de texte et des EDI comprennent les fichiers de marqueurs et proposent des facilités pour les exploiter. Ils permettent par exemple à un programmeur informatique de se déplacer facilement et rapidement dans le code source d'un programme.
Pour un programme informatique, un fichier de marqueurs peut être généré à partir du code source (généralement par un programme externe à l'éditeur de texte). Le programmeur peut ensuite se déplacer dans son programme grâce à cet index. Par exemple, lorsqu'il veut consulter la définition d'une fonction foo, il peut, si son éditeur de texte le permet, sauter d'une commande au clavier ou d'un clic de souris, directement à la ligne où foo est définie, même si cette définition se trouve dans un autre fichier que celui en cours d'édition.

## Exemples

Note : un fichier de marqueurs doit être préalablement généré.
* Avec Vim, la commande du mode Normal CTRL-] permet d'aller à la définition du mot sous le curseur si elle existe. Un clic droit de la souris avec la touche CTRL enfoncée rend le même service. L'aide intégrée de Vim fonctionne sur le même principe. Ainsi, il est possible d'y naviguer comme on le ferait avec des liens hypertextes, avec une pile permettant de revenir en arrière (CTRL-T).
* Avec Vim en ligne de commande, pour éditer la fonction main d'un programme, il est possible d'y accéder directement en tapant :
    L'éditeur se charge alors de trouver le fichier de marqueurs, d'y trouver le marqueur en question, de déterminer le fichier dans lequel il se trouve, de l'ouvrir et enfin d'amener le curseur sur le début de la définition.
* Certains logiciel de génération de marqueurs (par exemple Exuberant ctags) annotent les marqueurs, en indiquant le type, la portée, la classe ou l'espace de nom auquel ils se rapportent, etc. Ces indications permettent de construire des navigateurs de sources ou de fournir des informations aux systèmes de complètement lors de la saisie.

## Stockage et utilisation

Les fichiers de marqueurs sont en général des fichiers textes, constitués de lignes dont chacune désigne un marqueur. Ces lignes ont habituellement le format suivant :
Souvent, des informations supplémentaires sont ajoutées :
Ces lignes sont parfois précédées d'un en-tête donnant des informations sur le contenu du fichier de marqueur. On peut notamment y trouver l'encodage du fichier et un drapeau indiquant si les marqueurs sont triés ou non.
Le tri des marqueurs revêt une importance particulière, car un fichier de marqueurs convenablement trié (au sens binaire et non au sens alphanumérique) autorise une recherche, dite dichotomique, qui est bien plus efficace qu'une recherche linéaire. Le critère de performance est sensible avec de gros fichiers de marqueurs. Par exemple, la génération des marqueurs du sources du noyau Linux dans sa version 2.4.19 produit un fichier de plus de 30 Mo.
Parmi les informations supplémentaires, on peut trouver :
* Un motif de recherche : il permet au logiciel qui exploite le fichier de marqueurs de retrouver la définition du marqueur, même si le fichier a été modifié entre-temps (par exemple si des lignes ont été ajoutées ou supprimées).
* Des informations de contexte sur le marqueur : la structure, la classe ou l'énumération si le marqueur est l'un de ses champs ou membres, l'espace de nom, etc.
* Des commandes à interpréter par le logiciel de l'utilisateur : malgré des problèmes de sécurité potentiels, certains logiciels interprètent des commandes pour mettre à jour l'affichage (par exemple sauter l'en-tête de description d'une fonction) ou modifier le contenu du fichier (par exemple ajouter l'en-tête de description s'il est manquant) lors du saut vers un marqueur.

## Logiciels permettant de générer des fichiers de marqueurs
### ctags

Ctags était un programme Unix écrit par Steve Kirkendall. Il ne supporte que le C.

### Exuberant ctags

Exuberant ctags est une évolution de ctags écrite par Darren Hiebert à partir de 1996, et distribué sous les termes de la licence GNU. Exuberant signifie en anglais abondance. Ce terme est en rapport avec la quantité de marqueurs qu'il est censé générer. Ctags supporte plus de 40 langages, et il est très facile de rajouter le support pour un autre langage.

### Universal ctags

Universal ctags est une évolution de exuberant ctags plus à jour (release de 2022 VS release de 2009).

### Etags

Etags dépend d'Emacs, et supporte de nombreux langages de programmation.

### Jtags

Jtags est un programme spécialisé pour le langage Java, écrit en Java.

### ptags.py

ptags.py est un programme spécialisé pour le langage Python, écrit en Python.

### ptags

ptags est un programme spécialisé pour le langage Perl, écrit en Perl.

### rtags

rtags est un programme spécialisé pour le langage Ruby, écrit en Ruby.

### gnatxref

gnatxref est un programme spécialisé pour le langage Ada.

### tcltags

tcltags est un programme spécialisé pour le langage Tcl.

## Éditeurs de texte supportant les marqueurs

* Vi et ses dérivés (Vim, nvi)
* emacs, et XEmacs
* gedit (avec le plugin https://github.com/Quixotix/gedit-source-code-browser)
* JEdit
* UltraEdit
* NEdit
* Mined
* JED
* TSE
* SETEDit
* CRiSP
* WorkSpace
* X2 (logiciel)
* Zeus (logiciel)
* FTE