<!doctype linuxdoc system> <article> <title>LinuxDoc+Emacs+Ispell-HOWTO</title> <author> Auteur : Philippe MARTIN (<htmlurl url="mailto:feloy@wanadoo.fr" name="feloy@wanadoo.fr">) </author> <date>v0.5, 28 Avril 1998</date> <abstract> Ce document s'adresse aux traducteurs et rédacteurs de HOWTO Linux ou de toute autre documentation du Projet de Documentation Linux. Il donne à ces derniers des trucs et astuces pour l'utilisation entre autre d'Emacs et d'Ispell. </abstract> <toc> <sect>Préambule <sect1>Copyright <p> Copyright Philippe Martin 1998&nl; Vous pouvez redistribuer et/ou modifier ce document selon les conditions de la GNU General Public Licence, version 2 ou ultérieure. <sect1>Remerciements <p> Je remercie tout particulièrement Sébastien Blondeel pour m'avoir posé tant de questions si pertinentes sur la configuration d'Emacs, questions qui m'ont permises de concrétiser mes connaissances sur le sujet et de vous en faire part. <sect1>Remarques <p> N'hésitez pas à me faire parvenir toute remarque et/ou critique sur ce document, je les examinerai afin de faire évoluer au mieux ce document.&nl; N'hésitez pas non plus à me poser des questions relatives au sujet traité dans cet HOWTO, j'y répondrai avec un intérêt tout particulier. <sect1>Versions <p> Ce document traite des versions suivantes : <itemize> <item>Sgml-tools version 0.99, <item>Emacs version 19.34, <item>Ispell version 3.1, <item>Toutes les bibliothèques Emacs auxquelles je fais référence sont celles distribuées avec la version d'Emacs précitée, sauf <tt/iso-sgml/ distribuée avec XEmacs et <tt/psgml/ distribuée seule. </itemize> <sect>Introduction <sect1>Le langage SGML <p> Le langage <bf>SGML</bf> (<it>Standard Generalized Markup Language</it>) est un langage qui permet de définir des types de documents. <p> On peut par exemple définir grâce à lui un type de document <it>recette de cuisine</it>, qui précisera qu'il faudra y inclure une première partie avec les différents ingrédients, puis une deuxième avec les accessoires, une troisième donnant la façon de faire votre gâteau pas à pas, et enfin une belle photo qui montre le résultat final. <p> Cette définition d'un type de document est appelé <bf>DTD</bf> (<it>Document Type Definition</it>). Elle ne permet pas de définir quelle sera l'allure du document final, mais seulement ce qu'il contiendra ou pourra contenir. <p> Pour reprendre l'exemple précédent, je suis sûr qu'en lisant l'idée que je me fais d'une recette de cuisine, vous avez reconnu celles que vous ou votre cuistot attitré utilisez. Et pourtant, elles ont une allure complètement différente : les miennes ont une photo qui se trouve en haut à gauche du placard de la salle de bain, et la liste des ingrédients se trouve entre les bouteilles de lait et de gaz au fond du jardin. Et les vôtres ? <p> Grâce à cette définition type, quelqu'un peut écrire son document, sans tenir compte de la forme qu'il aura quand il arrivera devant les yeux du lecteur. </sect1> <sect1>La définition du type <tt>LinuxDoc</tt> <p> Ce type permet d'écrire, vous l'aviez deviné, des documents se reportant à Linux. <p> Ces documents sont en général construits ainsi : ils commencent par un titre suivi de l'auteur, de la date de diffusion et de la version de ce document. Suit juste après un court paragraphe qui explique brièvement ce que contient ce document (ce qui évite d'attendre de l'avoir fini pour se rendre compte que ce n'est pas du tout ce que l'on recherchait) puis une table des matières qui montre plus en détail son contenu et permet aux plus pressés d'aller voir directement ce qu'ils cherchent. <p> Et vient ensuite une suite de chapitres, sections, paragraphes. Au milieu de ces paragraphes, on peut insérer des morceaux de programme, ou changer de police de caractères pour faire ressortir un mot ou un passage, ou encore y insérer des listes, faire référence à une autre partie du document, et d'autres choses encore. <p> Pour écrire un tel document, il suffit alors de préciser au bon moment le titre, l'auteur, la date et la version du document, puis les chapitres et sections, dire quand il faut insérer une liste et quels en sont les éléments, et ainsi de suite. </sect1> <sect1>Les <tt>SGML-Tools</tt> <p> Les <bf>SGML-Tools</bf> permettent, à partir de cette spécification du document, d'obtenir le document final dans le format que vous préférez. Si vous voulez l'ajouter à votre bibliothèque personnelle, ce sera sûrement du <it>PostScript</it>, si vous voulez le faire partager au reste de la planète à travers le Web, pourquoi pas du <it>HTML</it>, ou si vous craquez et voulez le lire sous Windows, vous pouvez toujours l'avoir en <it>RTF</it> pour pouvoir le lire sous n'importe quel éditeur de texte. Ou peut-être sous chacun de ces formats, si vous avez des humeurs changeantes. La distribution SGML-Tools peut être récupérée via FTP anonyme dans le répertoire <htmlurl url="ftp://ftp.lip6.fr/pub/sgml-tools/" name ="ftp://ftp.lip6.fr/pub/sgml-tools/"> </sect1> <sect>Votre premier document <sect1>Depuis un document au format texte <p> Si vous possédez un document au format texte que vous désirez formater en SGML pour ensuite le transformer en divers formats, voici la marche à suivre : <enum> <item> Ajoutez au tout début du fichier les lignes suivantes : <verb> <!doctype linuxdoc system> <article> <title>le titre ici&etago;title> <author> le nom de l'auteur, son email &etago;author> <date> la version et la date du document &etago;date> </verb> <item> S'il y a au tout début du document un court paragraphe qui décrit brièvement le contenu de ce document, encadrez ce paragraphe avec les balises <tt><abstract></tt> et <tt>&etago;abstract></tt>. <item> Ajoutez juste à la suite la balise <tt><toc></tt>, qui insère automatiquement la table des matières. <item> Au début de chaque nouveau chapitre, remplacez la ligne contenant le numéro et le titre du chapitre par : <verb> <sect>le titre du chapitre </verb> et rajoutez la balise <tt>&etago;sect></tt> à la fin du chapitre.&nl; <bf>Note :</bf> Il n'est pas nécessaire d'indiquer le numéro du chapitre, car ils sont numérotés automatiquement. <item> Faites la même chose pour les sections, en remplaçant le numéro et le titre par <tt><sect1></tt> et en rajoutant <tt>&etago;sect1></tt> à la fin de la section. <item> Il est possible de créer des sous-sections jusqu'au niveau 4 (avec <tt><sect4></tt> et <tt>&etago;sect4></tt>) en opérant de la même manière. <item> À chaque début de paragraphe, ajoutez la balise <tt><p></tt>. <item> Si vous désirez mettre en valeur certains mots ou certaines phrases, entourez-les des balises <tt><it></tt> et <tt>&etago;it></tt> (<it>italique</it>), ou <tt><bf></tt> et <tt>&etago;bf></tt> (<bf>gras</bf>), ou encore <tt><tt></tt> et <tt>&etago;tt></tt> (<tt>caractères de machine à écrire d'antan</tt>). <item> Lorsqu'une liste apparaît dans le texte, comme celle-ci par exemple : <verb> Voici une liste : - d'une ligne, - ah non, deux, - tiens, trois, - c'est tout. de quatre lignes ! </verb> il faut la remplacer par : <verb> Voici une liste : <itemize> <item>d'une ligne, <item>ah non, deux, <item>tiens, trois, <item>c'est tout. &etago;itemize> de quatre lignes ! </verb> <item> Lorsqu'un bloc représente une partie de programme, ou autre chose que l'on veut faire ressortir : <verb> <verb> 10 REM Tiens qu'est-ce que c'est ? 20 REM Je croyais que ca n'existait plus ! 30 PRINT "Je suis de retour "; 40 PRINT "pour sauver le monde." 50 INPUT "Des mains de qui d'après toi ?",M$ 60 IF M$="Bill" THEN PRINT "Tu es un sage":GOTO AUPARADIS 70 ELSE PRINT "Tu n'as rien compris...":GOTO AUPAYSDUDOLLAR &etago;verb> </verb> <item> Arrivé à ce point, vous avez déjà bien avancé votre formatage en SGML. Vous pourrez, si vous voulez affiner votre document, jeter un oeil sur le guide d'utilisation des <bf>SGML-Tools</bf>, qui décrit plus en détail le type de document <bf>LinuxDoc</bf>. </enum> </sect1> </sect> <sect>Configurer <tt>Emacs</tt> <sect1>Les caractères accentués <p> Si vous désirez écrire des documents en français ou dans une autre langue européenne, vous aurez besoin de caractères accentués. Voici comment configurer Emacs pour qu'il accepte ces caractères. <sect2>L'affichage des caractères 8 bits <p> Pour qu'Emacs soit capable d'afficher des caractères 8 bits, ajoutez les lignes suivantes à votre <tt>.emacs</tt> : <verb> (standard-display-european 1) (load-library "iso-syntax") </verb> Si vous utilisez Emacs sur un terminal qui ne supporte pas l'affichage des caractères 8 bits, vous pouvez utiliser la bibliothèque <tt>iso-ascii</tt> (<tt>(load-library "iso-ascii")</tt>), qui permet à Emacs d'afficher les caractères 8 bits d'une façon approchée. <sect2>La saisie des caractères accentués <p> Si votre clavier permet de taper les caractères accentués, aucun problème ne devrait se poser. En revanche, s'il ne le permet pas, voici quelques moyens d'y remédier : <sect3>La bibliothèque <tt>iso-acc</tt> <p> La bibliothèque <tt>iso-acc</tt> d'Emacs permet d'entrer des caractères accentués malgré que l'on ait un clavier qui ne le permette a priori pas. <p> Pour utiliser cette bibliothèque, ajoutez la ligne suivante à votre <tt>.emacs</tt> : <verb> (load-library "iso-acc") </verb> <p> Puis, une fois avoir relancé Emacs et ouvert le fichier que vous voulez éditer, tapez <tt>Meta-x iso-accents-mode</tt>. <p> Vous pouvez alors entrer un caractère <bf>é</bf> en tapant <bf>'</bf> puis <tt>e</tt>. De manière générale, on peut entrer un caractère accentué en tapant d'abord l'accent, puis la lettre à accentuer (aussi bien minuscule que majuscule). Voici les différents accents utilisables : <list> <item><tt>'</tt> : Un accent aigu <item><tt>`</tt> : Un accent grave <item><tt>^</tt> : Un accent circonflexe <item><tt>"</tt> : Un tréma <item><tt>˜</tt> : Un tilde au dessus de la lettre, une cédille lorsqu'il précède un c, et d'autres encore (voir fichier iso-acc.el), <item><tt>/</tt> : Pour barrer une lettre, ... </list> Si vous avez besoin d'entrer un de ces caractères et non pas une lettre accentuée, tapez un espace à la suite de l'accent. Par exemple, pour taper <it>l'éléphant</it>, tapez <tt>l ' <cparam/spc/ ' e l ' e ...</tt> <p> Vous pouvez trouver l'ensemble des combinaisons dans le fichier <tt>iso-acc.el</tt>. <sect3>La touche <cparam/Meta/ <p> Il est possible avec certains terminaux de saisir des caractères accentués grâce à la touche <cparam/Meta/ (ou <cparam/Alt/). Par exemple, la frappe de <bf><cparam/Meta/-i</bf> permet d'entrer le caractère <bf>é</bf>. <p> Mais Emacs prévoit la touche <cparam/Meta/ pour d'autres utilisations. Il faut donc taper la séquence <bf/Ctrl-q/ (commande <tt/quoted-insert/) avant de taper <bf><cparam/Meta/-i</bf>. <p> Cette commande permet aussi d'entrer un caractère selon son code en octal. Tapez <bf/Ctrl-q/ suivi du code en octal du caractère que vous désirez entrer. <sect2>Afficher les caractères SGML en 8 bits <p> En SGML, les caractères accentués peuvent être tapés grâce à des macros. Par exemple, le caractère <bf/é/ s'écrit <bf/&eacute;/. En général, les applications qui lisent du SGML arrivent à lire les caractères 8 bits et il n'est donc pas nécessaire d'utiliser ces macros. Mais il est possible que certaines ne le puissent pas. En sachant qu'il existe un moyen facile de remédier à ça, ce serait dommage de faire "planter" ces dernières applications. <p> En effet, la bibliothèque <tt>iso-sgml</tt> vous permet d'entrer sous Emacs des caractères accentués, comme d'habitude, mais lorsqu'il enregistre votre fichier, il transforme tous ces caractères 8 bits par leur équivalent SGML. <p> Il est donc très facile, grâce à cette bibliothèque, de saisir et relire votre document sous Emacs, et vous êtes sûr que votre document ne sera pas rejeté par une application qui ne comprend pas les caractères 8 bits. <p> Pour utiliser cette bibliothèque, il suffit de rajouter ces lignes à votre <tt>.emacs</tt> : <verb> (setq sgml-mode-hook '(lambda () "Défauts pour le mode SGML." (load-library "iso-sgml"))) </verb> <sect1>Le mode SGML <p> Lorsque vous ouvrez un fichier avec une extension <bf>.sgml</bf>, Emacs lance normalement le <bf>mode sgml</bf>. S'il ne le fait pas, vous pouvez soit le faire manuellement avec <tt>Meta-x sgml-mode</tt>, soit le lancer automatiquement en rajoutant ces lignes à votre <tt>.emacs</tt> : <verb> (setq auto-mode-alist (append '(("\.sgml$" . sgml-mode)) auto-mode-alist)) </verb> Ce mode permet par exemple de choisir comment insérer les caractères 8 bits. En utilisant <tt>Meta-x sgml-name-8bit-mode</tt> (ou dans le menu <it>SGML/Toggle 8 bit insertion</it>), vous pouvez choisir d'insérer les caractères 8 bits soit tels quels, soit sous leur forme SGML, c'est-à-dire sous la forme <bf>&...;</bf>. Il permet aussi de cacher ou non les balises SGML, avec <tt>Meta-x sgml-tags-invisible</tt> ou le menu <it>SGML/Toggle Tag Visibility</it>. <sect1>Le mode PSGML <p> Le mode PSGML donne de grandes facilités pour éditer des documents SGML sous Emacs. <p> La documentation <htmlurl name="psgml-linuxdoc" url="http://www.linux-france.com/article/psgml-linuxdoc"> explique comment installer et utiliser ce mode conjointement avec <it>LinuxDoc</it>. <sect1>Divers <sect2>Le mode auto-fill <p> En mode normal, lorsque vous tapez un paragraphe et que vous arrivez en bout de ligne, vous devez vous-même utiliser la touche <cparam/Entrée/ pour revenir à la ligne, ou bien votre ligne continue indéfiniment tout le long du paragraphe. Il en résulte, si vous utilisez <cparam/Entrée/ pour revenir à la ligne, un paragraphe dont les fins de lignes ne sont pas alignées, et en général ces lignes rallongent ou raccourcissent au fur et à mesure. De même si vous laissez des lignes dépasser une longueur raisonnable, vous ne pourrez pas les voir sous certains éditeurs. <p> Le mode <bf>auto-fill</bf> permet d'automatiser cette tâche ingrate : lorsque vous dépassez une certaine colonne (la 70e par défaut), il vous place automatiquement à la ligne suivante. <p> Voici comment utiliser ce mode, et fixer la largeur de vos lignes à 80 : <verb> (setq sgml-mode-hook '(lambda () "Défauts pour le mode SGML." (auto-fill-mode) (setq fill-column 80))) </verb> <sect>Ispell <p> Si vous désirez vérifier l'orthographe de votre document directement depuis Emacs, vous pouvez utiliser la distribution <bf>Ispell</bf> et son mode associé sous Emacs. <sect1>Configuration initiale <p> Tout d'abord, ajoutez ces lignes à votre <tt>.emacs</tt> pour configurer Emacs : <verb> (autoload 'ispell-word "ispell" "Check the spelling of word in buffer." t) (global-set-key "\e$" 'ispell-word) (autoload 'ispell-region "ispell" "Check the spelling of region." t) (autoload 'ispell-buffer "ispell" "Check the spelling of buffer." t) (autoload 'ispell-complete-word "ispell" "Look up current word in dictionary and try to complete it." t) (autoload 'ispell-change-dictionary "ispell" "Change ispell dictionary." t) (autoload 'ispell-message "ispell" "Check spelling of mail message or news post.") (autoload 'ispell-minor-mode "ispell" "Toggle mode to automatically spell check words as they are typed in.") </verb> <p> <sect1>Le choix de vos dictionnaires par défaut <p> Vous pouvez configurer Emacs pour qu'à l'ouverture d'un fichier, celui-ci choisisse automatiquement quels dictionnaires utiliser. Vous pouvez en effet utiliser plusieurs dictionnaires. Le premier et sûrement le plus important est le dictionnaire principal, distribué avec Ispell. Vous avez le choix entre plusieurs langues. Le deuxième est votre dictionnaire personnel, celui où Ispell ajoutera les mots qu'il n'aura pas trouvé dans le premier dictionnaire mais que vous lui aurez indiqué de garder. Voici les lignes à insérer à votre <tt>.emacs</tt> si vous désirez utiliser par défaut le dictionnaire français distribué avec Ispell, et placer votre dictionnaire personnel dans un fichier <tt>.ispell-dico-perso</tt> dans votre répertoire racine. <verb> (setq sgml-mode-hook '(lambda () "Défauts pour le mode SGML." (setq ispell-personal-dictionary "~/.ispell-dico-perso") (ispell-change-dictionary "francais") )) </verb> <sect1>Choix des dictionnaires pour un certain fichier <p> Un petit problème se pose si vous ne vérifiez pas toujours des textes dans la même langue. Et si vous traduisez des documents, il est probable que vous passiez d'une langue à l'autre assez souvent. <p> Je ne connais pas de moyen en Lisp de choisir, soit automatiquement, soit en un <em/click/ de souris, les dictionnaires principaux et personnels associés à la langue utilisée dans le fichier en cours. (Si vous en connaissez un, faites-moi signe !) <p> Mais il est possible d'indiquer quels dictionnaires vous voulez utiliser pour ce fichier (et seulement celui-là). Il suffit de les rajouter en commentaire, à la fin du fichier, pour qu'Ispell puisse les lire en lançant une vérification : <verb> <!-- Local IspellDict: english --> <!-- Local IspellPersDict: ~/emacs/.ispell-english --> </verb> Si vous avez défini dans votre <tt/.emacs/ que vos dictionnaires par défaut seront français, vous pouvez alors ajouter ces lignes à chaque fin de fichier dont le texte est en anglais. <sect1>Vérifier votre document <p> Pour lancer la vérification de votre document en intégralité, utilisez, depuis n'importe où dans votre document <tt>Meta-x ispell-buffer</tt>. Vous pouvez aussi lancer la vérification sur une région seulement du document : <itemize> <item>Indiquez le début de la région avec <tt>Ctrl-Spc</tt> (mark-set-command), <item> Placez-vous à la fin de la région à vérifier, <item> tapez <tt>Meta-x ispell-region</tt>. </itemize> Emacs lance alors Ispell. Si ce dernier trouve un mot qu'il ne connait pas, il vous indique ce mot (normalement en surbrillance) et vous demande de presser une touche : <itemize> <item><bf>spc </bf>accepte ce mot, uniquement pour cette fois, <item><bf>i </bf>accepte ce mot et l'insère dans votre dictionnaire personnel, <item><bf>a </bf>accepte ce mot pour cette session, <item><bf>A </bf>accepte ce mot pour ce fichier, en l'insérant dans le dictionnaire local au fichier, <item><bf>r </bf>permet de corriger le mot mal orthographié, <item><bf>R </bf>permet de corriger toutes les occurrences du mot mal orthographié, <item><bf>x </bf>arrête la vérification, et replace le curseur à sa position initiale, <item><bf>X </bf>arrête la vérification en laissant le curseur sur le mot mal orthographié, vous permettant de modifier votre fichier ; vous pouvez continuer la vérification en tapant <tt>Meta-x ispell-continue</tt>, <item><bf>? </bf>affiche une aide en ligne. </itemize> Si Ispell trouve un ou plusieurs mots ressemblant à celui qu'il ne connait pas, il vous les indique dans une petite fenêtre, chacun précédé d'un chiffre. Il suffit de presser un de ces chiffres pour corriger le mot mal orthographié par le mot correspondant. <sect1>Dictionnaire personnel contre dictionnaire local au fichier <p> La touche <bf>i</bf> permet d'insérer un mot dans le dictionnaire personnel, alors que la touche <bf>A</bf> permet d'insérer un mot dans le dictionnaire local au fichier. <p> Le dictionnaire local au fichier est une suite de mots insérés à la fin du fichier, sous forme de commentaires, et qui est relu par Ispell chaque fois que vous le lancez sur ce fichier. Cela permet d'accepter certains mots, valables dans ce fichier, mais qui ne le seraient pas dans d'autres. <p> A mon avis, il est préférable que le dictionnaire personnel soit réservé aux mots que le dictionnaire principal ne connait pas mais qui font vraiment partie de la langue (comme les mots composés), plus certains mots n'appartenant pas à la langue ou noms propres qui reviennent dans un grand nombre de fichiers (comme <it>Linux</it>) et ne ressemblant pas trop à un mot du dictionnaire principal : l'ajout par exemple de certains noms et prénoms de personnes dans le dictionnaire personnel peut être dangereux, car ils ressemblent parfois à un mot de la langue (imaginez qu'il ne trouve pas de fautes dans la phrase : `<it>Ted en est l'effet au phil du temps.'</it> !). <sect1>La vérification `à la volée' <p> Ispell peut aussi vérifier l'orthographe au fur et à mesure que vous tapez votre document. Il faut utiliser pour cela le mode <bf>ispell-minor-mode</bf>. Lorsque vous désirez lancer ou arrêter ce mode de vérification, tapez <tt>Meta-x ispell-minor-mode</tt>. Ispell vous envoie alors un <it>bip</it> chaque fois que vous tapez un mot qu'il ne connait pas. <p> Si ces <it>bip</it> à répétition vous ennuient (ou si votre voisin de palier dort !), vous pouvez les remplacer par un flash de l'écran, en tapant <tt>Meta-x set-variable RET visible-bell RET t RET</tt>. Ou ajoutez cette ligne à votre <tt>.emacs</tt> pour faire taire Emacs à tout jamais : <verb> (setq visible-bell t) </verb> <sect1>Saut de régions <p> Il est possible de ne pas vérifier votre document en intégralité, en sautant quelques régions bien spécifiques. En effet, vous voudrez sûrement ne pas vérifier l'orthographe de vos balises SGML. Pour cela, ajoutez la ligne suivante à votre <tt>.emacs</tt> : <verb> (setq ispell-skip-sgml t) </verb> Une version Beta du 20 Mars 98 du fichier <tt>ispell.el</tt> est disponible à l'adresse <htmlurl url="http://kdstevens.com/~stevens/ispell-page.html" name="http://kdstevens.com/~stevens/ispell-page.html">. Cette version étend les régions SGML à sauter. En effet, la version d'<tt/ispell.el/ fournie avec Emacs permet seulement de sauter les tags SGML, de la forme <bf><tt></bf> ou <bf></tt></bf>. Cette version Beta permet de sauter également les régions entre : <itemize> <item><author> et la fin de la ligne, <item>< et / (pour les tags SGML de la forme <bf><em/.../</bf>, <item><code> et </code>, <item><verb> et </verb>, <item><tt> et </tt>. </itemize> <sect>Pour aller plus loin <sect1>Insertion automatique d'une entête <p> Sous Emacs, il est possible d'<em>accrocher</em> des actions à chaque événement (ouverture d'un fichier, sauvegarde, lancement d'un mode, etc). <p> La bibliothèque <bf>autoinsert</bf> utilise cette fonctionnalité : lorsque vous ouvrez un nouveau fichier sous Emacs, cette bibliothèque insère, selon le type de ce fichier, une entête <em>standard</em>. <p> Dans notre cas, cette entête <em>standard</em> pourrait bien être la partie qui déclare le type de document (LinuxDoc), le titre, l'auteur et la date. <p> Je vais décrire ici deux façons d'insérer une telle entête. Soit en insérant un fichier que vous aurez préalablement écrit, soit en lançant une routine écrite en <bf>elisp</bf>. <sect2>par l'insertion d'un fichier <p> Il faut tout d'abord préciser à Emacs d'exécuter la commande <tt>auto-insert</tt> à l'ouverture d'un fichier, puis lire la bibliothèque <bf>autoinsert</bf> qui déclare la liste <tt>auto-insert-alist</tt> qu'il nous faut modifier, cette dernière définissant pour chaque type de fichier l'entête à insérer. Le fichier à insérer doit par défaut se trouver dans le répertoire <tt>~/insert/</tt>, mais il est possible de redéfinir la variable <tt>auto-insert-directory</tt> si l'on veut le placer ailleurs. <p> Voici les lignes à rajouter à votre <tt>.emacs</tt> pour insérer le fichier <tt>~/emacs/sgml-insert.sgml</tt> à l'ouverture d'un nouveau fichier SGML : <verb> (add-hook 'find-file-hooks 'auto-insert) (load-library "autoinsert") (setq auto-insert-directory "~/emacs/") (setq auto-insert-alist (append '((sgml-mode . "sgml-insert.sgml")) auto-insert-alist)) </verb> Vous pouvez alors écrire dans le fichier <tt>~/emacs/sgml-insert.sgml</tt> votre entête personnalisée, puis relancer Emacs et ouvrir un fichier <tt>toto.sgml</tt>. Emacs devrait alors vous demander de confirmer l'insertion automatique, et dans l'affirmative insérer votre entête. <sect2>par l'exécution d'une routine <p> Cela fonctionne un peu comme précédemment, mais au lieu de préciser dans la variable <tt>auto-insert-alist</tt> un fichier à insérer, il faut préciser une fonction à exécuter. Voici comment procéder, en supposant que l'on écrive cette fonction dans un fichier <tt>~/emacs/sgml-header.el</tt> (inutile d'encombrer votre <tt>.emacs</tt> avec cette fonction qui peut se révéler assez longue) : <verb> (add-hook 'find-file-hooks 'auto-insert) (load-library "autoinsert") (add-to-list 'load-path "~/emacs") (load-library "sgml-header") (setq auto-insert-alist (append '(((sgml-mode . "SGML Mode") . insert-sgml-header)) auto-insert-alist)) </verb> Vous pourrez trouver en <ref id="insert-sgml-header" name="appendice"> un exemple de cette fonction <tt>insert-sgml-header</tt>. <appendix> <sect>Une fonction <tt>insert-sgml-header</tt><label id="insert-sgml-header"> <p> Cette fonction permet à l'utilisateur d'insérer une entête personnalisée pour un document du Projet de Documentation Linux dans un fichier. Elle peut soit être appelée automatiquement lorsque l'on ouvre un nouveau fichier SGML, soit être appelée explicitement par l'utilisateur. <p> Cette fonction demande à l'utilisateur, à travers le <em>mini-buffer</em>, divers renseignements, certains nécessaires, d'autres facultatifs. Tout d'abord le titre. Si l'utilisateur n'entre aucun titre, la fonction retourne immédiatement, et rien n'est inséré. Vient ensuite la date, l'auteur, son email et sa home page (ces deux derniers étant facultatifs). Il demande ensuite le nom du traducteur. S'il n'y a pas de traducteur pour ce document, il suffit de presser <em>Entrée</em>, et les renseignements sur le traducteur ne seront pas demandés. Dans le cas contraire, la fonction demande l'email et la home page du traducteur (aussi facultatifs). Cette fonction affiche alors dans le buffer courant votre entête, comportant bien sûr tous les renseignements que vous avez cités mis en forme, mais aussi les balises nécessaires au paragraphe d'introduction et au premier chapitre, puis place le curseur à l'endroit où vous pourrez saisir le paragraphe d'introduction. <verb> (defun insert-sgml-header () "Insère l'entête d'un document LinuxDoc" (interactive) (let (titre auteur email home traducteur email-traducteur home-traducteur date point-debut) (setq titre (read-from-minibuffer "Titre : ")) (if (> (length titre) 0) (progn (setq date (read-from-minibuffer "Date : ") auteur (read-from-minibuffer "Auteur : ") email (read-from-minibuffer "Email auteur : ") home (read-from-minibuffer "Home page auteur : http://") traducteur (read-from-minibuffer "Traducteur : ")) (insert "<!doctype linuxdoc system>\n<article>\n<title>") (insert titre) (insert "&etago;title>\n<author>\nAuteur : ") (insert auteur) (insert "&nl;\n") (if (> (length email) 0) (progn (insert "<htmlurl url=\"mailto:") (insert email) (insert "\" name=\"") (insert email) (insert "\">&nl;\n"))) (if (> (length home) 0) (progn (insert "<htmlurl url=\"http://") (insert home) (insert "\" name=\"") (insert home) (insert "\">\n&nl;"))) (if (> (length traducteur) 0) (progn (setq email-traducteur (read-from-minibuffer "Email traducteur : ") home-traducteur (read-from-minibuffer "Home page traducteur : http://")) (insert "Traducteur : ") (insert traducteur) (insert "&nl;\n") (if (> (length email-traducteur) 0) (progn (insert "<htmlurl url=\"mailto:") (insert email-traducteur) (insert "\" name=\"") (insert email-traducteur) (insert "\">&nl;\n"))) (if (> (length home-traducteur) 0) (progn (insert "<htmlurl url=\"http://") (insert home-traducteur) (insert "\" name=\"") (insert home-traducteur) (insert "\">&nl;\n"))))) (insert "&etago;author>\n<date>\n") (insert date) (insert "\n&etago;date>\n\n<abstract>\n") (setq point-debut (point)) (insert "\n&etago;abstract>\n<toc>\n\n<sect>\n<p>\n\n\n&etago;sect>\n\n&etago;article>\n") (goto-char point-debut) )))) </verb> </article>