21.1. Comment les Modes Majeurs Sont Choisis

Vous pouvez explicitement sélectionner un mode majeur pour le tampon courant, mais la plupart du temps Emacs détermine quel mode utiliser en se basant sur le nom du fichier ou sur du texte spécial dans le fichier.

La sélection explicite d'un nouveau mode majeur est fait avec la commande M-x. Au nom du mode majeur, ajoutez -mode pour obtenir le nom de la commande sélectionnant ce mode. Ainsi, vous pouvez entrer dans le mode Lisp en exécutant M-x lisp-mode.

Lorsque vous visitez un fichier, Emacs choisit habituellement le bon mode majeur en se basant sur le nom du fichier. Par exemple, les fichiers dont les noms finissent par .c sont édités dans le mode C. Les correspondances entre les noms de fichiers et les modes majeurs sont contrôlées par la variable auto-mode-alist. Sa valeur est une liste dans laquelle chaque élément a cette forme :

(regexp . mode-function)

ou cette forme :

(regexp mode-function flag)

Par exemple, un élément généralement touvé dans cette liste a la forme ("\\.c\\'" . c-mode), et sélectionne le mode C pour les fichiers dont les noms finissent par .c. (Notez que \\ est nécessaire dans la syntaxe Lisp pour inclure un \ dans une chaîne, qui est nécessaire pour supprimer la signification spéciale de . dans les expressions rationnelles.) Si l'élément a la forme (regexp mode-function flag) et flag est non nil, alors après avoir appelé mode-function, le suffixe correspondant à regexp est enlevé et la liste est de nouveau parcourue pour rechercher une nouvelle correspondance.

Vous pouvez spécifier quel mode majeur doit être utilisé pour éditer un certain fichier par un texte particulier sur la première ligne non vierge de ce fichier. Le nom du mode doit apparaître sur cette ligne précédé et suivi de -*-. Du texte supplémentaire peut apparaître sur cette même ligne. Par exemple,

;-*-Lisp-*-

indique à Emacs d'utiliser le mode Lisp. Une telle spécification explicite est prioritaire par rapport à tout défaut basé sur le nom du fichier. Notez l'utilisation du point-virgule pour que Lisp traite cette ligne comme un commentaire.

Un autre format de spécification de mode est

-*- mode: nom_mode;-*-

qui vous permet aussi de spécifier des variables locales, de cette manière :

-*- mode: nom_mode; var: valeur; … -*-

Section 32.2.5, pour plus d'informations sur ce sujet.

Lorsque le contenu d'un fichier commence par #!, il peut être utilisé comme une commande shell exécutable, qui fonctionne en exécutant un interpréteur nommé dans la première ligne du fichier. La suite du fichier est utilisée comme entrée de l'interpréteur.

Lorsque vous visitez un tel fichier avec Emacs, si le nom du fichier ne spécifie pas un mode majeur, Emacs utilise le nom de l'interpréteur de la première ligne pour choisir un mode. Si la première ligne est le nom d'un interpréteur reconnu, comme perl ou tcl, Emacs utilise le mode approprié pour cet interpréteur. La variable interpreter-mode-alist spécifie les correspondances entre les noms d'interpréteurs et les modes majeurs.

Lorsque la première ligne commence avec #!, vous ne pouvez pas (sur un grand nombre de systèmes) utiliser la fionctionnalité -*- sur la première ligne, car le système ferait une erreur en lançant l'interpréteur. Emacs recherche alors -*- sur la seconde ligne aussi bien que sur la première dans de tels fichiers.

Losque vous visitez un fichier qui ne spécifie pas le mode majeur à utiliser, ou lorsque vous créez un nouveau tampon avec C-x b, la variable default-major-mode spécifie quel mode majeur utiliser. Normalement, sa valeur est fundamental-mode, qui indique le mode Fondamental. Si default-major-mode est nil, le mode majeur est le même que celui du tampon précédemment sélectionné.

Si vous changez le mode majeur d'un tampon, vous pouvez revenir au mode majeur qu'Emacs choisit automatiquement : utilisez la commande M-x normal-mode pour ce faire. C'est la même fonction que find-file appelle pour choisir un mode majeur. Elle analyse aussi les variables locales au fichier, s'il y en a.

Les commandes C-x C-w et set-visited-file-name modifient le mode majeur si le nom du fichier spécifient un nouveau mode (Section 16.3). Cependant, ceci n'arrive pas lorsque le contenu du tampon spécifie un mode majeur, et certains modes majeurs "spéciaux" ne permettent pas au mode de changer. Vous pouvez annuler cette fonctionnalité de changement de mode en mettant la variable change-major-mode-with-file-name à nil.