\input texinfo.tex    @c -*-texinfo-*-

@c %**start of header
@setfilename modeasn1
@settitle Mode Emacs pour ASN.1
@syncodeindex vr cp
@syncodeindex fn cp
@syncodeindex ky cp
@finalout
@c %**end of header

@set edition 2.0
@set year 1999
@set month Août
@set copyright-owner-1 France Télécom - Branche Développement
@set copyright-owner-2 Centre National d'Études des Télécommunications

@set update-month @value{month} @value{year}
@c ------------

@tex
\gdef\putwordTableofContents{Table des Matières}
\gdef\putwordChapter{Section}
@end tex

@ifinfo
This file documents @dots{}

Copyright @value{year} @value{copyright-owner}
@end ifinfo
@c ------------

@titlepage
@title Mode Emacs pour ASN.1
@subtitle Manuel d'utilisation
@subtitle @value{update-month}
@author Guillaume LATU
@author Stéphane LEVANT
@author Olivier DUBUISSON
Email : @ @ @ @t{asn1@@cnet.francetelecom.fr}@*
Serveur : @ @ @t{http://asn1.elibel.tm.fr/fr/outils/emacs/}@*
France Télécom - Cnet DTL/MSV - F-22307 Lannion Cedex
@page
@vskip 0pt plus 1filll

@multitable @columnfractions .23 .77
@item
Copyright @copyright{} @value{year} 
@tab @value{copyright-owner-1} 
@item
@tab @value{copyright-owner-2}
@end multitable

@sp 3

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.@*
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.@*
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation approved
by France Télécom.
@page
@end titlepage
@c ------------

@c @headings off
@c @everyfooting @| @thispage @|
@headings on

@ifinfo

@c This document describes @dots{} 

@c This document applies to version @dots{} 
@c of the program named @dots{}

@c ------------
@node Top, Présentation du mode ASN.1, (dir), (dir)
@top Mode "ASN.1" pour Emacs

@c ------------

@end ifinfo

@c head
@c title Site ASN.1 - Outils - Mode Emacs - Manuel d'utilisation
@c description ASN.1 est une notation internationalement normalisée pour la communication entre systèmes hétérogènes. Cette page contient le manuel d'utilisation du mode ASN.1 pour (X)Emacs.
@c body

@c menu  Mode Emacs pour ASN.1
@menu
* Présentation du mode ASN.1::  
* Installation::                
* Commandes de base::           
* le menu ASN.1::               
* Compilation::                 
* Editeur syntaxique::          
* Personnalisation::            
* Configuration avancée::       
@end menu 


@c ------------


@c @iftex
@c @hyphenation{réa-li-sée ma-ni-pu-la-tion cons-truc-tion mo-di-fi-er}
@c @end iftex


@node Présentation du mode ASN.1, Installation, Top, Top
@chapter Présentation du mode ASN.1

@section Introduction au mode ASN.1

Un petit tutorial pour Emacs est disponible dans le fichier
@file{TUTORIAL}
 qui est normalement livré avec le mode ASN.1 pour Emacs.
Si vous ne connaissez pas Emacs, il est conseillé de lire ce fichier
 avant de poursuivre la lecture de cette documentation.

@section  Qu'est-ce qu'un mode Emacs ?
Un mode Emacs est une extension logicielle d'Emacs. Il permet
l'édition et la manipulation aisée d'un certain type de document.  Les
modes Emacs peuvent aider à l'édition de programmes écrits dans un
certain langage (@w{ex. :} C, Ada...) ; ils sont alors considérés comme des 
environnements de programmation.

Le moins spécialisé des modes Emacs est le @i{Fundamental Mode}.
Ce mode n'ayant aucune spécificité, le comportement d'Emacs
est celui défini par défaut. Tous les autres modes redéfinissent
un certain nombre de paramètres d'Emacs tels @w{que :}

@itemize @bullet

@item des raccourcis claviers spécifiques au mode,
@item la mise en couleur, en gras, en italique, de mots-clés,
@item l'indentation,
@item le comportement d'Emacs dans certaines situations.

@end itemize

Chaque @i{buffer} Emacs (tampon en français) se trouve dans un certain
@i{major mode} (mode majeur en français). Le nom de ce mode est toujours
inscrit dans la barre d'état du buffer, c'est le premier mot à
l'intérieur des parenthèses. Le buffer peut, par contre, se trouver sous 
plusieurs @i{minor modes} (modes mineurs en français), leurs noms suivent
alors le nom du mode majeur.

@section  Le mode ASN.1
Le mode ASN.1 présenté ici est un mode majeur, il @w{permet :}

@enumerate
@item 
@strong{une grande rapidité d'@w{écriture :}}
@itemize @minus
@item 
insertion simple et rapide de morceaux de code ASN.1,
@item 
complétion permettant d'éviter d'écrire ou de
réécrire certains mots ;
@end itemize
@item 
@strong{une réduction du nombre @w{d'erreurs :}}
@itemize @minus
@item 
Emacs introduit à notre place les mots-clés ;
@end itemize
@item 
@strong{une lisibilité accrue :}
@itemize @minus
@item  
mots-clés mis en couleur à l'écran,
@item 
impression papier avec mots-clés en gras ;
@end itemize
@item 
@strong{l'indentation automatique :}
@itemize @minus
@item 
certaines fautes d'écriture peuvent être ainsi décelées dans la spécification,
@item 
compréhension de la spécification nettement améliorée.
@end itemize

@end enumerate

Les fonctionnalités du mode sont décrites dans la suite de ce
document. Ne vous inquiétez pas de voir énormément de raccourcis
clavier définis ici. En effet les commandes lancées par ces
raccourcis claviers sont, pour la plupart, aussi présentes dans le
menu "ASN.1" de la barre des menus.
D'autre part vous retrouverez les raccourcis claviers indiqués dans
les menus, ce qui pourra vous aider à les apprendre.

 
@c ec
@node Installation, Commandes de base, Présentation du mode ASN.1, Top
@chapter Installation

@section Configuration requise

Ce mode ASN.1 est destiné à une utilisation sous GNU Emacs ou XEmacs. 
Il a été testé @w{sur :}

@table @asis
@item   @strong{PC}
Emacs 20.3

@item   @strong{Unix} 
Emacs 19.34, Emacs 20.3, XEmacs 20.2, XEmacs 20.4
@end table

 @w{Remarque :} si vous possédez déjà un Emacs ou un XEmacs, le numéro de version  
 s'obtient par exemple en tapant @w{@kbd{M-x emacs-version}}.@*
Ce mode Emacs devrait fonctionner sur tout GNU Emacs dont la version
est supérieure ou égale à 19.34, sur tout XEmacs de version
supérieure ou égale à 19.34.
Si vous possédez une vielle version d'Emacs (<20.0), il faut auparavant
installer le package custom, disponible a l'adresse suivante :
@t{http://www.dina.kvl.dk/~abraham/custom/}

Sur PC (configuration avec Windows 3.1), le mode Emacs est légèrement
limité par l'implantation 
actuelle @w{d'Emacs :} les entités sélectionnables (voir paragraphe
"Développement en ligne") qui changent de couleur sous Unix lorsque le
pointeur de la souris passe dessus, ne changent pas de couleur sur
PC.

@section Comment démarrer le mode ASN.1 

Tout d'abord, il faut que vous ayez effectué l'installation (voir
fichier @file{INSTALL}).
Une fois cela terminé, charger un fichier dont l'extension est @w{@code{".asn"}},
@w{@code{".ASN"}}, @w{@code{".asn1"}} ou @w{@code{".ASN1"}} active automatiquement le mode "ASN.1".
Le mode ASN.1 est bien en place si @w{@code{"ASN.1"}} apparaît dans la barre
d'état du buffer, entre les parenthèses. 

Une autre méthode pour rendre actif le mode ASN.1 dans le buffer
courant est d'exécuter la commande @w{@kbd{M-x asn1-mode}} (c'est à dire
de taper au clavier @w{@kbd{ESC}}, @w{@code{"x"}}, @w{@code{"asn1-mode"}} et enfin la touche
@w{@kbd{ENTER}}; pour plus d'explication sur les combinaisons de touches,
veuillez vous référer au tutorial Emacs qui se trouve dans le fichier 
@file{TUTORIAL}.

@w{Remarque :} le numéro de version du mode ASN.1 s'obtient  soit en
regardant le début du fichier @file{modeasn1.el}, soit en tapant dans un
 buffer en mode @w{ASN.1 :} @w{@kbd{M-x asn1-mode-version}}.


@c ec
@node Commandes de base, le menu ASN.1, Installation, Top
@chapter Commandes de base

@section Commandes qui concernent l'indentation

@table @kbd

@kindex TAB
@item TAB
Indente la ligne courante en fonction du contenu des lignes qui précédent.

@kindex ENTER
@item ENTER
Indente la ligne courante, va à la ligne après le
curseur, puis indente la nouvelle ligne
@kindex C-c C-r
@item C-c C-r
Indente la région sélectionnée

@kindex C-c C-b
@item C-c C-b
Indente le buffer (@strong{Attention}. l'exécution de cette commande peut
prendre beaucoup de temps)

@kindex M-i
@item M-i 
Insère une tabulation (on peut grâce à cette commande
faire des alignements en colonne pour les types CHOICE, SEQUENCE et SET
ou les classes d'objet informationnel).@* @w{Exemple :}
@itemize @minus

@item
tapez au clavier dans un buffer vide (le mode ASN.1 étant @w{activé) :}
@example
"champ1" M-i M-i "Type1" ENTER
"champ1bis" M-i M-i "Type2" ENTER
@end example

@item
vous @w{obtenez :}
@example
champ1          Type1
champ1bis       Type2 
@end example

@item
on constate que les deux références de type @w{@code{"Type1"}}
et @w{@code{"Type2"}} sont alignées verticalement.
@end itemize
@end table


@section Complétion de mots

@table @kbd
@kindex M-TAB
@item M-TAB
Essaye de compléter le mot qui précède le curseur.
La complétion est réalisée à partir d'une liste
contenant les mots réservés d'ASN.1 et d'autres
fréquemment utilisés dans l'écriture de spécifications
ASN.1 (@w{ex. :} @w{@code{itu-t(0)}}, @w{@code{HAS PROPERTY}}...). @* 
@w{Exemple :}
@itemize @minus     
@item
vous tapez au clavier @w{@code{"BEG"}} dans le buffer
qui est en mode ASN.1,
@item
vous tapez @w{@kbd{M-TAB}}, @w{@code{"BEG"}} est complété en @w{@code{"BEGIN"}}
@end itemize

Note : si plusieurs complétions sont possibles, celles-ci sont toutes
affichées.

@kindex M-/
@item M-/
Essaye de compléter le mot qui précède le curseur à
partir d'une liste composée de tous les mots
présents actuellement dans les buffers d'Emacs. Cette
commande est très utile et permet de ne pas réécrire
en entier un mot déjà écrit. Par exemple, si l'on a
déjà écrit le nom d'un type ASN.1 dans le début du
module et si l'on doit le réécrire à nouveau, au lieu
de le réécrire en entier, on tape juste le début et
puis l'on complète avec cette commande. @* 
@w{Exemple :}
@itemize @minus
@item 
Dans votre buffer vous @w{avez :}
@example
SET @{
  champ1     Type1,
  champ2     Type2,
  champ1bis  T
@end example

@item
vous voulez que le type de @w{@code{"champ1bis"}} soit
@w{@code{"Type1"}}. Vous placez donc le curseur juste
après @w{@code{"champ1bis T"}}, 

@item
vous composez alors
@w{@kbd{M-\}}, Emacs vous propose @w{@code{"Type2"}},

@item
 vous
retapez @w{@kbd{M-\}}, Emacs vous propose @w{@code{"Type1"}},
@end itemize
@end table


@section Recherche des références

Il est très utile de pouvoir afficher la définition d'une référence de
type, de valeur, de classe... ou
de chercher toutes les occurences d'une référence.
Ceci est possible via le menu "Reference".

Pour cela, il faut d'abord créer le fichier de références
(raccourci @w{@kbd{C-c C-a}}). Ensuite, on peut utiliser les autres entrées
du menu.

Voici un exemple tout simple :

@example
PetitEntier ::= INTEGER (0..121)

-- plusieurs lignes plus bas ...

Age ::= PetitEntier
@end example

On commence par créer le fichier de références en indiquant la liste des
fichiers ASN.1 dans lesquels on souhaite fairedes recherches :
@example
Fichiers ou chercher les references : *.asn
@end example
Ceci indique que toutes les références des fichiers d'extension @code{.asn}
vont être placées dans un fichier (@file{TAGS}). Emacs saura alors dans
quel fichier ASN.1 se trouve chaque définition.

Ensuite, pour trouver la définition de
@code{PetitEntier}, il suffit de taper @w{@key{M-.}} (entrée
"Trouver une Definition" du sous-menu "Reference"). Alors que le curseur
se trouve sur cette référence, Emacs propose de
rechercher la définition du mot sous le curseur.
Il suffit donc d'appuyer sur @kbd{@key{RET}}.
Sinon, il faut taper @code{PetitEntier} à la main (on dispose toutefois
de la complétion en appuyant sur @kbd{TAB}).
Emacs se rend immédiatement à l'endroit où se trouve la définition
(il ouvre le fichier correspondant si cela est nécessaire).

Il est également possible de se déplacer de module en module
(@w{@kbd{C-x [}} pour aller au module précédent et @w{@kbd{C-x ]}} pour
aller au module suivant) et de définition en définition
(@w{@kbd{C-@key{Up}}} pour aller à la définition précédente et
@w{@kbd{C-@key{Down}}} pour aller à la définition suivante).

@section Les types de commentaires

Les fonctionnalités d'Emacs incitent à différencier trois styles de 
@w{commentaires :} 
@enumerate
@item @strong{commentaires  @w{préfixes :}}
ces commentaires précèdent les
définitions de modules, les définitions de type, etc.
Ils sont indentés comme une ligne ordinaire. 
@item @strong{commentaires dans le @w{code :}}
ces commentaires sont insérés dans
les lignes de la spécification. Aucune question ne
se pose quant à l'indentation (la ligne est indentée sans tenir compte
des commentaires).  

@item @strong{commentaires @w{postfixes :}}
ce troisième type de commentaire est celui de fin de
ligne. Emacs permet d'aligner tous les 
commentaires de cette sorte sur la même colonne en fin de
ligne. Cette colonne est paramétrable comme expliqué ci-après.


@end enumerate
 @w{Exemple :}
@example
 -- commentaire préfixe
 ExempleType := SET @{    -- commentaire postfixe
  champ1        Type1,   -- commentaire postfixe
  champ2        Type2,   -- commentaire postfixe
  champ3 --expl-- Type1  -- commentaire postfixe
@}
@end example

@section Commandes qui concernent les commentaires

@table @kbd
@kindex M-;
@item M-;
insère un début de commentaire ASN.1 en fin de ligne
ou déplace le commentaire ASN.1 de cette ligne en fin
de ligne.
@kindex C-x ;
@item C-x ;
permet de changer le numéro de la colonne où sont
placés les commentaires en fin de ligne. Pour
utiliser cette commande, il suffit de se placer sur la
colonne où l'on veut que dorénavant tous les
commentaires soient indentés, puis d'exécuter la
commande. La valeur par défaut du numéro de colonne
 est @code{32}. À partir du moment où vous avez changé ce
numéro de colonne, tous les commentaires que vous
indenterez par la suite débuteront sur cette colonne,
par contre les commentaires déjà présents actuellement dans le
buffer courant ne sont pas automatiquement changés de
place et alignés sur cette colonne.
@end table

On a donc trois types de commentaires et deux commandes @w{d'indentation :}
@table @kbd
@kindex TAB
@item TAB
permet d'indenter les lignes de code et les
commentaires préfixes.
@kindex M-;
@item M-;
permet de déplacer le commentaire de fin de ligne vers
une colonne déterminée, afin que tous les
commentaires postfixes soient alignés verticallement.

@end table

@c ec
@node le menu ASN.1, Compilation, Commandes de base, Top
@chapter Le menu "ASN.1"

Au démarrage du mode, le menu "ASN.1" apparaît dans la barre des
menus. Il propose les commandes suivantes :

@table @kbd
@kindex TAB
@item TAB
"Indenter la Ligne"
@kindex C-c C-r
@item C-c C-r
"Indenter une Région"
@kindex C-c C-b
@item C-c C-b
"Indenter Tout"
@kindex M-;
@item M-;
"Indenter un Commentaire"
@kindex M-i
@item M-i
"Insérer une Tabulation"
@kindex M-TAB
@item M-TAB
"Complétion ASN.1"
@kindex M-/
@item M-/
"Complétion Usuelle"
@end table


@section Mise en français des menus


Il est possible d'avoir les menus, les messages et
plusieurs options de personnalisation en français.
Pour cela, sélectionner "Immediate Customize" et "Language" dans le menu
ASN.1.

@section L'entrée "Compiler"


@table @kbd
@kindex C-c C-c
@item C-c C-c
L'entrée "Compiler" du menu "ASN.1" permet
d'effectuer une compilation du fichier
correspondant au buffer courant. Voir 
la @ref{Compilation} pour plus de précisions.
@end table


@section Construction du menu syntaxique

L'entrée "Construire le menu syntaxique" permet de construire
le menu de syntaxe (la construction peut prendre quelques secondes).
Voir la @ref{Editeur syntaxique}.

Il est possible de construire le menu syntaxique automatiquement au
démarrage (voir la @ref{Personnalisation,Personnalisation Rapide}.).


@section L'entrée "Aide"

@table @kbd
@kindex C-c C-h
@item C-c C-h
"Aide" Vous permet d'obtenir la documentation que
vous lisez actuellement (en version hypertextuelle). 
@end table


@c ec
@node Compilation, Editeur syntaxique, le menu ASN.1, Top
@chapter Utilisation d'un compilateur

L'entrée "Compiler" du menu "ASN.1" permet de lancer un compilateur ou un
autre outil d'analyse directement sous Emacs. Si ce
compilateur produit des messages d'erreur
compréhensibles par Emacs, l'utilisateur pourra se déplacer aisément
d'erreur en erreur, Emacs plaçant automatiquement le curseur
sur la ligne où s'est 
produite l'erreur.
Par défaut, le mode ASN.1 est paramétré pour prendre en compte les
messages retournés par Asnp, un analyseur syntaxique pour ASN.1:1997
développé par France Télécom Cnet
(@t{http://asn1.elibel.tm.fr/fr/outils/asnp}).

@*

@table @kbd
@kindex C-c C-c
@item "Compiler" (C-c C-c)
 exécute la commande de compilation (redéfinissable
via le sous-menu "Personnalisation rapide") suivie des paramètres de
compilation (redéfinissables avec le même sous-menu)
suivie enfin du nom du fichier édité dans
le buffer courant. Une fois la compilation terminée,
on peut se rendre à n'importe quelle erreur indiquée
en cliquant avec la souris (bouton du milieu) sur la
ligne contenant l'erreur dans le buffer de compilation
(il est possible aussi de taper @w{@kbd{ENTER}} sur la ligne du
buffer de compilation contenant l'erreur).

Note : si plusieurs messages d'erreur
indiquent la même ligne et la même colonne, seul le premier message
sera actif. Le fait de cliquer sur les autres n'aura aucun effet.

@item "Commande de Compilation"
@kindex C-c C-p
Cet item permet de changer la
commande appelée lorsque l'entrée "Compiler" est exécutée. Si vous
utilisez Asnp comme analyseur syntaxique, il est très
important de préciser le chemin absolu où se trouve le fichier
Asnp, sinon le fichier contenant les messages d'erreur d'Asnp ne sera
pas trouvé.
@*
Exemple (si l'outil Asnp se trouve dans le répertoire
     @w{@file{/local/asn1/} ) :}
@itemize @minus
@item
 lancez "Commande de Compilation",
@item
 le message @w{@code{"Commande de compilation : "}} apparaît dans le
  minibuffer, 
@item 
entrez au @w{clavier :} @code{/local/asn1/asnp},
@item 
tapez sur @w{@kbd{ENTER}}.
@end itemize

@item "Parametres de Compilation"
@kindex C-c C-o
Cet item permet de changer les
paramètres de la commande exécutée par "Compile".@*
 @w{Exemple :} (si vous utilisez @w{Asnp) :}
@itemize @minus
@item
lancez "Parametres de Compilation",
@item
le message @w{@code{"Parametres de compilation : "}} apparaît dans le
  minibuffer,
@item
entrez au @w{clavier :} @w{@code{"-fr"}} 
(ce sont les paramètres par défaut),
@item
tapez sur @w{@kbd{ENTER}}.
@end itemize
@end table


@c ec
@node Editeur syntaxique, Personnalisation, Compilation, Top
@chapter Éditeur syntaxique

@section Construction facilitée de modules ASN.1

Notre but ici n'est pas de proposer un éditeur syntaxique complet. En
effet Emacs n'est pas adapté à la réalisation de tels éditeurs
qui vérifient à tout moment la correction lexicale, syntaxique et
sémantique du code édité. Par contre, le mode ASN.1 @w{permet :}
@itemize @minus
@item
de construire des modules ASN.1, en insérant des morceaux de
  grammaire,
@item
de repérer les erreurs syntaxiques, en appelant depuis Emacs
  un compilateur ou un analyseur syntaxique.
@end itemize
 @w{Remarque :} Le passage qui suit concernant le menu "ASN.1-Syntax" est
assez technique. Si vous voulez expérimenter par vous-même, voici un
@w{exemple :}
@itemize @minus
@item
    Lancez le mode ASN.1 dans un buffer vide d'Emacs
(@w{@kbd{M-x asn1-mode}}).
@item
    Dans le menu "ASN.1", sélectionnez l'entrée "Construire le Menu
    Syntaxique".
Attendez quelques instants jusqu'à ce que le menu
"ASN.1-Syntax" apparaisse dans la barre des menus.
@item
    Dans le menu "ASN.1-Syntax", sélectionnez le sous-menu
"ModuleDefinition" et, dans ce sous-menu, sélectionnez l'entrée
"insert" . Dans votre buffer, vous devez voir apparaître sous
le @w{curseur :} @w{@code{"--(ModuleDefinition)--"}}.
@item
     Cliquez (ESC et en même temps bouton gauche de la souris ou
bien pour les souris à trois @w{boutons :} bouton droit) sur ce
qui vient  @w{d'apparaître :} @w{@code{"--(ModuleDefinition)--"}}.
@w{@code{"--(ModuleDefinition)--"}} est alors remplacé dans le buffer 
 @w{par :} @*
@example
--$modulereference$-- --[DefinitiveIdentifer]--
DEFINITIONS --[TagDefault]-- --[ExtensionDefault]-- ::=
   BEGIN
     --[Modulebody]--
   END
@end example
@item
     En cliquant de la même manière que précédemment sur les
éléments en commentaire (que l'on appelle aussi métavariables)
qui sont apparus, vous allez pouvoir développer ces éléments pour
en faire apparaître de nouveaux. Ainsi vous pourrez construire
un module ASN.1 complet. 

@end itemize

@section Le menu "ASN.1-Syntax"

 @w{Remarque :} pour faire apparaître le menu "ASN.1-Syntax",
    sélectionner l'entrée "Construire le Menu
    Syntaxique" du menu ASN.1.

Le menu "ASN.1-Syntax" permet à l'utilisateur d'insérer des éléments
de la grammaire ASN.1:1997 dans le buffer.  Le menu présente un
certain nombre de non-terminaux de la grammaire ASN.1. Chacun donne
accès à un sous-menu. La première ligne d'un sous-menu comporte la
commande "insert". Cette commande permet d'insérer dans le buffer
courant (et à l'endroit du curseur) le non-terminal dont le sous-menu
est issu. @*
Le reste du sous-menu présente les différentes productions
du non-terminal.

Dans le menu "ASN.1-Syntax", la notation suivante est @w{employée :}
@itemize @minus

@item 
 Un mot entouré de @w{@code{"("}} et de @w{@code{")"}} représente un non-terminal.@*
   @w{Exemple : :} @w{@code{"(AssignmentList)"}}
@item
 Un mot entouré de @w{@code{"["}} et de @w{@code{"]"}} représente un non-terminal
  optionnel (on pourra l'éliminer par la suite si on ne souhaite pas le
  développer). @*
   @w{Exemple : :} @w{@code{"[DefinitiveIdentifier]"}}
@item
Un mot entouré de @w{@code{"$"}} et de @w{@code{"$"}} représente un terminal. @*
   @w{Exemple : :} @w{@code{"$modulereference$"}}
@item
Un mot entouré par aucun des symboles précédents est une
  simple chaîne de caractères.
@end itemize

En cliquant un non-terminal du menu, on fait apparaître un
sous-menu qui présente les différentes
productions par lesquelles le non-terminal peut être remplacé. Si la
règle comporte plusieurs
productions, chaque production commence par le @w{signe} @w{@code{"-> "}}
pour les différencier.   @*
 @w{Exemple : :} le sous-menu issu de "TaggedType" @w{est :}
@example
        "
        insert
        ------------
        -> <Tag>
           <Type>
        -> <Tag>
           IMPLICIT 
           <Type>
        -> <Tag>
           EXPLICIT
           <Type>
        "
@end example
La flèche indique le début de chaque production.

En cliquant sur un terminal ou une chaîne de caractères dans un sous
menu, on insère celui-ci dans le buffer courant. 

Les non-terminaux non optionnels sont insérés dans le buffer sous la
forme @w{suivante :} @w{@code{"--(non-terminal)--"}}, les non-terminaux optionnels sous
la @w{forme :} @w{@code{"--[non-terminal]--"}}  et les terminaux sous la @w{forme :}
@w{@code{"--$terminal$--"}}. @*

 @w{Exemple : :} 
@itemize @minus
@item
Le premier élément du menu "ASN.1-Syntax" est
"ModuleDefinition" qui est un sous-menu. Si vous cliquez sur
l'élément "insert" de ce sous-menu, le non-terminal
ModuleDefinition est inséré dans le buffer courant. Il
apparaît sous la @w{forme :} @w{@code{"--(ModuleDefinition)--"}}.
@item
Dans le sous-menu "ModuleDefinition", si vous cliquez sur
@w{@code{"$modulereference$"}}, le terminal @w{@code{modulereference}} est
introduit sous le curseur sous la @w{forme :}@*
@w{@code{"--$modulereference$--"}}.
@end itemize
 @w{Remarque :} les terminaux et non-terminaux  sont tous des commentaires
ASN.1, il est donc inutile de les supprimer avant de compiler puisu'ils
seront ignorés par les outils ASN.1.

@section Développement en ligne

Un non-terminal inséré à l'aide du menu "ASN.1-Syntax" est sensible
au passage du pointeur de la souris sur lui. En effet, lors du passage
de la souris, le non-terminal change de style d'écriture et de couleur
(sauf pour les utilisateurs d'Emacs sous PC en Windows 3.1). Ce signe
distinctif 
permet d'informer l'utilisateur que cet élément du texte interagit
avec la souris. Lorsque l'on clique un non-terminal (avec
le bouton du milieu ou le bouton droit pour une souris à deux boutons)
 un événement se produit. Cet événement peut  @w{être :} 
@itemize @minus
@item
 si la règle associée à ce non-terminal comporte une seule
  production, alors cette production est insérée dans le
  buffer courant et le non-terminal initial est effacé ;
@item
 si la règle associée à ce non-terminal comporte de
  multiples productions, un menu surgissant (ou @i{pop-up}
  menu en anglais) apparaît. Il suffit alors de cliquer sur la
  production souhaitée, celle-ci est insérée dans le buffer
  courant et le non-terminal initial est effacé. 
@end itemize
 @w{Exemple :}@*
en cliquant sur @w{@code{"--(ModuleDefinition)--"}}, ce morceau de texte
disparaît et le morceau de texte suivant est introduit en ses
lieu et @w{place :}
@example
--$modulereference$-- --[DefinitiveIdentifer]--
DEFINITIONS --[TagDefault]-- --[ExtensionDefault]-- ::=
   BEGIN
     --[Modulebody]--
   END
@end example

On a inséré la partie droite de la règle de la grammaire 
dont la partie gauche était @code{ModuleDefinition}. À partir de ce
squelette de module ASN.1, le module entier va pouvoir être
construit en cliquant sur les terminaux et non-terminaux pour les
développer.

Lorsque l'on clique sur un terminal, le minibuffer affiche le nom du 
terminal dont il s'agit et attend que vous tapiez quelque chose au
clavier. Ce que vous avez
tapé est analysé. Si le terminal que vous avez entré est incorrect, soit
Emacs le corrige par lui-même, soit il émet un message d'erreur et vous
devez ensuite entrer un terminal  correct.

 @w{Exemple :}@*
vous cliquez sur @w{@code{--$modulereference$--}} et tapez
@w{@code{"module1"}}
 dans
le minibuffer. Dans le buffer la chaîne de caractères
@w{@code{"Module1"}} est insérée. On constate que la casse de la
première lettre a été corrigée automatiquement.@* 

 @w{Autre exemple :}@*
vous cliquez sur @w{@code{--$number$--}} (vous pouvez faire apparaître
le terminal en utilisant "Completion d'Element Syntaxique" dont le
fonctionnement est expliqué au paragraphe suivant) et tapez
@w{@code{10.0}}. Le message suivant apparaît : @*  
@code{"The number you typed is not a correct number"} @*
En effet @code{number} désigne un entier naturel (qui ne comporte pas de
virgule).@*
Vous tapez alors @w{@code{10}}, le nombre est accepté et il est inséré
dans le buffer.
@* @*

 @w{Remarque :} le développement en ligne n'est totalement
opérationnel que si le menu de syntaxe "ASN.1-Syntax" est
construit. Par exemple, si
le menu "ASN.1-Syntax" n'est pas chargé et que vous cliquez sur un
non-terminal, celui-ci ne sera pas reconnu.


@section Les deux derniéres entrées du menu "ASN.1-Syntax"

Les deux derniéres entrées du menu "ASN.1-Syntax" @w{sont :}
@table @kbd
@kindex M-n
@item M-n
"Supprimer un Element Syntaxique" efface le terminal ou le non-terminal
qui est actuellement sous le curseur. Il est aussi tout simplement
possible de sélectionner le commentaire spécial et de l'effacer comme
n'importe quel autre élément du buffer.

@kindex M-[
@item M-[
"Completion d'Element Syntaxique" propose une complétion sur
l'ensemble des terminaux et non-terminaux. Ainsi vous pouvez
introduire dans le buffer n'importe quel terminal ou
non-terminal qui ne serait par exemple pas accessible avec
le menu "ASN.1-Syntax".@*
 @w{Exemple :}@*
@itemize @minus
@item vous tapez  @kbd{M-[},
@item vous voulez introduire le non-terminal @w{@code{ModuleDefinition}},
vous tapez @* @w{donc :}  @w{@code{"ModuleDef"}},
@item vous tapez @kbd{TAB} et @w{@code{"ModuleDef"}} est completé en 
@w{@code{"ModuleDefinition"}},
@item vous tapez @kbd{ENTER}, @w{@code{"--(ModuleDefinition)--"}} est
inséré dans le buffer.
@end itemize
@end table

 @w{Remarque :} la partie de la grammaire ASN.1:1997 accessible à
l'utilisateur via le menu "ASN.1-Syntax" n'est pas exactement la
grammaire de la norme mais elle lui est équivalente. Cette grammaire a
été légèrement réorganisée. D'autre part, les noms des non-terminaux ont
parfois été adaptés afin d'être, nous l'espérons, mieux compris.
Il faut préciser que l'ensemble de la grammaire n'est pas visible
dans le menu "ASN.1-Syntax". Il faut utiliser "Completion d'Element
Syntaxique" (@w{@kbd{M-[}}) si vous voulez introduire un non-terminal ou un
terminal qui n'apparaît pas dans le menu "ASN.1-Syntax". Il faut
utiliser la commande "ASN.1 Completion" (@w{@kbd{M-TAB}}) si vous voulez
introduire un mot-clé dans le buffer si celui-ci n'apparaît pas dans le menu
"ASN.1-Syntax". @* @*


@c ec
@node Personnalisation, Configuration avancée, Editeur syntaxique, Top
@chapter Personnalisation

@section Personnalisation rapide

Le sous-menu "Personnalisation rapide" permet de changer
directement certaines options de configuration du mode ASN.1 :

@itemize @minus
@item Modification du langage
@item Modification de la commande de compilation
@item Modification des paramètres de compilation
@item Construire le menu syntaxique au démarrage
@item Sauvegarder la commande et les paramètres de compilation
@end itemize

@section Utilisation des buffers "customize"

La configuration du mode ASN.1 se fait essentiellement à l'aide des
buffers dits "customize" d'Emacs. Le principe de ces buffers est très simple :
le nom de la variable correspondant à l'option est affichée en couleur.
La valeur de cette variable est affichée à sa droite.
(cliquer eventuellement sur [Show] pour voir cette valeur).
En dessous, se trouve la documentation sur cette variable.
(cliquer eventuellement sur [Show] pour voir toute la documentation).

Si quelque chose a été modifié, il
suffit d'appuyer sur @w{[Save for Future Session]} pour le sauvegarder.
Pour modifier simplement le paramètre pour cette session courante (sans rien
enregistrer), cliquer sur [State] et choisir l'entrée @w{[Set for
current session]}.

Pour quitter, appuyer sur @w{[Bury Buffer]}.

Sous XEmacs, [Show] est représenté par une petite flèche et
@w{[Bury Buffer]} est remplacé par un bouton "done".


@section Options générales

Les options paramétrables via l'entrée "Options Générales" sont :
@itemize @minus
@item Langage (français ou anglais)
@item Affichage ou non de la page de présentation au chargement du mode
@item Commande de compilation
@item Paramètres de compilation
@item Construction du menu syntaxique au démarrage
@item bouton de la souris à utiliser à la place du bouton 2
@item Utilisation ou non d'un buffer "customize" pour modifier les
couleurs. Par défaut, un buffer plus convivial est affiché (voir la
@ref{Personnalisation, Modification des couleurs}.)
@end itemize

@section Modification de l'indentation

Il est possible de paramètrer entièrement la valeur des variables
d'indentation des différentes construction d'ASN.1 (elles sont listées
dans la @ref{Configuration avancée}) via un buffer
"customize" d'Emacs.

@section Modification des couleurs

Il est possible de modifier toutes les couleurs du mode.
L'entrée "Styles d'Ecriture et Couleurs..." du sous-menu
"Personnalisation" affiche un
buffer semblable à un buffer "customize" mais plus convivial.

Les catégories d'expression qui peuvent être mises en couleurs sont :

@itemize @minus
@item @strong{Mots-clés participant à la structure d'un module} : @*
@w{@sc{"begin"}} 
@w{@sc{"definitions"}} 
@w{@sc{"end"}} 
@w{@sc{"exports"}} 
@w{@sc{"extensibility implied"}} @*
@w{@sc{"from"}} 
@w{@sc{"imports"}},
@item @strong{Mots-clés concernant les classes d'objets informationnels} : @*
@w{@sc{"abstract-syntax"}} 
@w{@sc{"by"}} 
@w{@sc{"class"}} 
@w{@sc{"constrained"}} 
@w{@sc{"instance of"}} @*
@w{@sc{"type-identifier"}} 
@w{@sc{"with syntax"}} 
@w{@sc{"unique"}},
@item @strong{Les expressions de sous-typage qui sont entre parenthèses}
@item @strong{Mots-clés et expressions concernant les tags} : @*
@w{@sc{"automatic"}} 
@w{@sc{"explicit"}} 
@w{@sc{"implicit"}}
@w{@sc{"tags"}} 
  ainsi que les tags @* (@w{ex. :} @code{[UNIVERSAL 22]}),
@item @strong{Mots-clés OPTIONAL/DEFAULT}
@item @strong{Mots-clés ayant trait au sous-typage} : @*
@w{@sc{"all"}} 
@w{@sc{"present"}} 
@w{@sc{"absent"}} 
@w{@sc{"optional"}} 
@w{@sc{"except"}} 
@w{@sc{"components of"}} 
@w{@sc{"except"}} 
@w{@sc{"includes"}} 
@w{@sc{"intersection"}} 
@w{@sc{"max"}} 
@w{@sc{"min"}} 
@w{@sc{"size"}} 
@w{@sc{"union"}}
@w{@sc{"with component"}} 
@w{@sc{"with components"}},
@item @strong{Mots-clés concernant les types structures} : @*
@w{@sc{"choice"}} 
@w{@sc{"sequence"}} 
@w{@sc{"set"}} 
@w{@sc{"of"}},
@item @strong{Mots-clés designant des types} : @*
@w{@sc{"bit string"}} 
@w{"BMPString"} 
@w{@sc{"boolean"}} 
@w{@sc{"character"}} 
@w{@sc{"embedded"}} 
@w{@sc{"pdv"}} @*
@w{@sc{"enumerated"}} 
@w{@sc{"external"}} 
@w{"GeneralizedTime"} 
@w{"GeneralString"} 
@w{"GraphicString"} @*
@w{"IA5String"} 
@w{@sc{"integer"}} 
@w{"ISO646String"} 
@w{"NumericString"} 
@w{"ObjectDescriptor"} @* 
@w{@sc{"object identifier"}}
@w{@sc{"octet string"}} 
@w{"PrintableString"} 
@w{"RELATIVE-OID"}  @*
@w{"T61String"}
@w{"TeletexString"}
@w{@sc{"real"}} 
@w{"UniversalString"} 
@w{"UTCTime"}  @*
@w{"UTF8String"}
@w{"VideotexString"}
@w{"VisibleString"}
@w{@sc{"null"}},
@item @strong{Mots-clés designant des valeurs} : @*
@w{@sc{"false"}} 
@w{@sc{"minus-infinity"}} 
@w{@sc{"plus-infinity"}} 
@w{@sc{"null"}} 
@w{@sc{"true"}}.
@item @strong{Expression qui suit le WITH SYNTAX entre accolades}
@end itemize


@c ec
@node Configuration avancée,  , Personnalisation, Top
@chapter Configuration avancée

Il est possible de modifier directement les options du mode en écrivant
du code Emacs-lisp dans le fichier @file{.emacs}.
Par exemple,
@w{@code{(setq asn1-language 'fr)}} donne à la variable
@code{asn1-language} la valeur @code{'fr},
ce qui signifie que le langage utilisé est le français.

NB :
Toutes les options de configuration sont accessibles depuis les 
buffers "customize".

Voici toutes les variables qui peuvent êtres modifiées :


@itemize @minus
@item asn1-language
@item asn1-data-presentation 
@item asn1-compile-command 
@item asn1-compile-switches 
@item asn1-data-syntax-menu-autoload 
@item asn1-data-use-colors 
@item asn1-data-change-modeline 
@item asn1-data-use-standard-custom

@item asn1-data-faces

@item asn1-data-bracket-indent-text 
@item asn1-data-indent-of-DEFINITIONS 
@item asn1-data-indent-in-DEFINITIONS-bloc
@item asn1-data-indent-of-BEGIN 
@item asn1-data-indent-in-BEGIN-bloc 
@item asn1-data-indent-of-END 
@item asn1-data-indent-of-IMPORTS 
@item asn1-data-indent-in-IMPORTS-bloc 
@item asn1-data-indent-of-EXPORTS 
@item asn1-data-indent-in-EXPORTS-bloc 
@item asn1-data-indent-of-FROM 
@item asn1-data-indent-of-\; 
@item asn1-data-indent-of-\@{

@item asn1-data-indent-of-\( 
@item asn1-data-indent-of-\[ 
@item asn1-data-indent-of-::= 
@item asn1-data-indent-WITH-SYNTAX

@item asn1-mode-hook 
@item asn1-add-syntax-menu-hook
@end itemize

@page


@section Ouvrages de référence


Emacs :

@itemize @minus
@item GNU Emacs Manual @*
@t{http://asn1.elibel.tm.fr/fr/outils/emacs/emacs.ps.gz} @*
@w{[ps.gz - 456 p. - 1064 Ko]}

@item GNU Emacs Lisp Introduction (version 1.05)@*
@t{http://asn1.elibel.tm.fr/fr/outils/emacs/emacs-lisp-intro.ps.gz} @*
@w{[ps.gz - 258 p. - 731 Ko]}

@item GNU Emacs Lisp Reference Manual (version 20-2.5)@*
@t{http://asn1.elibel.tm.fr/fr/outils/emacs/elisp.ps.gz} @*
@w{[ps.gz - 888 p. - 1643 Ko]}
@end itemize

XEmacs :

@itemize @minus
@item GNU XEmacs Introduction (version 20-2.5)@*
@t{ftp://ftp.lip6.fr/pub/emacs/xemacs/docs/a4/new-users-guide-a4.ps.gz} @*
@w{[ps.gz - 58 p. - 131 Ko]}

@item GNU XEmacs Manual @*
@t{ftp://ftp.lip6.fr/pub/emacs/xemacs/docs/a4/xemacs-a4.ps.gz} @*
@w{[ps.gz - 336 p. - 488 Ko]}

@item GNU XEmacs Lisp Reference Manual (version 3.1)@*
@t{ftp://ftp.lip6.fr/pub/emacs/xemacs/docs/a4/lispref-a4.ps.gz} @*
@w{[ps.gz - 828 p. - 1025 Ko]}
@end itemize

@c @node Index,  , Informations complémentaires, Top
@c @unnumbered Index

@c @printindex cp


@c ec
@contents

@c end-html
@bye
