Ours & Hippy — le blogOurs & Hippyourshippy@huoc.orgtag:blog.huoc.org,2009:atom2010-02-20T10:02:19+01:00tag:blog.huoc.org,2009:posts/8
xmlgrep by examples: playing with Atom
2009-06-17T14:23:11+02:002009-06-22T14:30:22+02:00Nhat Minh Lê (rz0)
<p><i>Edited 22.06.</i> <strong>Incompatible syntax changes</strong> and more examples.
</p><p>Since Matthew Sporleder <a class="extern" href="http://mail-index.netbsd.org/tech-userlevel/2009/06/16/msg002258.html">on tech-userlevel</a> has (implicitly)
suggested that xmlgrep could be used to dissect Atom feeds, but was
a bit lost at how to do it exactly, I thought I’d post a little demo
of a console session playing with an Atom file and xmlgrep (as well as
some other command-line tools).
</p><p>First, let’s fetch the feed:
</p><pre><code>$ ftp http://mspo.com/blog/atom.xml
[...]
</code></pre>As a side effect of xmlgrep, we might want to indent the XML file to
make it human-readable:
<pre><code>$ xmlgrep '*' atom.xml | more
</code></pre>List all posts in the NetBSD category with their IDs:
<pre><code>$ xmlgrep -x 'entry[category/@term=NetBSD]/(title|id)/.' atom.xml
tag:blogger.com,1999:blog-6347225410141611306.post-1131641169617411392
NetBSD quotas - quickstart
tag:blogger.com,1999:blog-6347225410141611306.post-1939815769827620970
NetBSD device drivers - easier than you might think
[...]
</code></pre><p>Those of you yet unfamiliar with the syntax might have some trouble
understanding. The previous pattern could be read "select a text child
of an id or title element, itself a child of an entry element, which
contains a category element which has an attribute child term equal to
NetBSD." Step by step, you should notice that <code>a[b]</code> is read "a such
that b", <code>|</code> stands for "or", <code>/</code> for "child of", <code>@</code> for "attribute",
<code>.</code> for "text", and the braces are used for grouping purposes.
</p><p>Now, let’s select a post by ID:
</p><pre><code>$ xmlgrep -x 'entry[id/.~"post-1939"]#' atom.xml
</code></pre>Or, select a post by title and view its contents using w3m:
<pre><code>$ xmlgrep -x 'entry[title/.~"device drivers"]/content/.' atom.xml |
> sed -e 's/&lt;/</g' -e 's/&gt;/>/g' -e 's/&amp;/\&/g' |
> w3m -T text/html
</code></pre><p>As a side note, I should mention that up to now we have used
subpatterns quite a lot. This is because the Atom feed specification
does not force an order (or does it?) on the children of <code>entry</code>
elements. With more precise knowledge of the order of elements
relative to each other, we could have optimized the pattern to use <code>%</code>
and <code>%%</code> where possible. Subpatterns <em>are</em> costly, but for data sets
this size, we probably don’t care much.
</p><p>Let’s print all entry titles which date from March 2009 using the fact
that we <em>know</em> the <code>updated</code> element comes before the <code>title</code> one:
</p><pre><code>$ xmlgrep -x 'entry/updated[.~"^2009-03"]%%title/.' atom.xml
</code></pre>A friend of mine told me it would be useful to have arithmetic
predicates. I think they will feature in xmltools sooner or later, but
even without them, it is still possible to do some simple statistics,
by combining the results with <b>awk(1)</b>, for example. The following
one-liner counts the number of posts that have no older than March:
<pre><code>$ xmlgrep -x 'entry/updated/.' atom.xml | awk -F - '$2>=3' | wc -l
</code></pre><p>That’s it; I hope this will help people who want to get started with
xmlgrep. If you have other good examples you’d want me to elaborate,
do not hesitate to send me a mail!
</p>
tag:blog.huoc.org,2009:posts/40
Écrire du code C avec Emacs
2008-05-27T00:00:00+02:002010-02-20T10:02:19+01:00Nhat Minh Lê (rz0)
<div class="Edito"><p>Et de deux ! —rz0
</p></div><p>Cet article d’introduction s’intéresse aux aspects basiques liés
à l’écriture et à la gestion du code C basique avec Emacs, et, bien
sûr, aux fonctionnalités qui vous y aideront.
</p><h3>Édition du code avec le <code>c-mode</code>
</h3><p>Le mode d’édition du code C dans Emacs se nomme très simplement le
<code>c-mode</code> et est inclus par défaut avec l’éditeur ; vous pouvez aussi
obtenir la dernière version du mode (qui est développé en dehors
d’Emacs lui-même) sur le site du <a class="extern" href="http://cc-mode.sourceforge.net/">cc-mode</a>. Le <code>c-mode</code> offre
plusieurs fonctionnalités et commandes intéressantes.
</p><h4>Indentation automatique
</h4><p>Tout d’abord, comme tous les modes de programmation dans Emacs, le
<code>c-mode</code> possède l’indentation automatique. Cela signifie que la
touche <code>TAB</code> (ou, de manière équivalente, <code>C-i</code>) n’est pas utilisée
pour insérer un caractère « tabulation » mais pour <em>indenter</em> la ligne
actuelle, c’est-à-dire aligner le début de celle-ci sur la colonne
adéquate, comme vous le feriez vous-même si Emacs n’était pas là. Il
est important de remarquer que cette opération ne tient absolument pas
compte de l’indentation actuelle de la ligne : qu’elle soit trop
décalée à gauche ou à droite, Emacs la replacera au bon endroit.
</p><p>Emacs indentera la ligne selon deux informations : le <em>contexte
syntaxique</em> (si vous êtes au début d’une instruction, au milieu d’un
appel de fonction, etc.) et le <em>style</em> sélectionné (par exemple, K&R
ou BSD ; voyez mon <a href="http://blog.huoc.org/votre-premier-dotemacs.html">introduction à la configuration
d’Emacs</a> pour plus d’informations).
</p><p>Comme il peut devenir lassant de devoir appuyer (quoique ce ne soit
qu’une seule fois) sur la touche <code>TAB</code> à chaque début de ligne, sachez
que vous pouvez aller à la ligne et indenter en une seule commande :
<code>C-j</code> (<code>newline-and-indent</code>).
</p><p>Mais l’indentation d’Emacs ne se limite pas à la ligne actuelle !
Vous pouvez également lui demander d’indenter tout un bloc ou une
fonction pour vous. Il s’agit respectivement des commandes <code>C-M-\</code>
(<code>indent-region</code>) et <code>C-c C-q</code> (<code>c-indent-defun</code>), qui indentent la
région actuelle (la zone de texte située entre la marque, usuellement
apposée par <code>C-SPC</code>, et le curseur) et la fonction dans laquelle se
trouve le curseur. En théorie, vous pourriez indenter tout le fichier
ainsi, mais je vous le déconseille ; l<code>algorithme est lent et perd en
précision si les constructions sont trop vilaines ou complexes. En
revanche, si vous effectuez une modification au milieu d'un bloc, et
que, par exemple, vous supprimez un niveau d'indentation, ces
commandes peuvent s'avérer très utiles.
Parfois, en revanche, vous voulez aligner des éléments (comme le
ferait la touche</code>TAB<code>en temps normal) sans qu'Emacs n'essaie
d'indenter la ligne. Pour cela, vous pouvez utiliser la commande</code>M-i<code>(</code>tab-to-tab-stop<code>). C'est le cas, par exemple, si vous alignez vos
déclarations ou vos instructions dans un</code>switch<code>.
Pour résumer, voici un tableau des commandes d'indentation et
d'alignement :
|</code>TAB<code> | indente la ligne actuelle |
|</code>C-j<code> | retour à la ligne et indentation simultanés |
|</code>C-M-‘ | indente la région actuelle <br />
</p><table><tr><td><code>C-c C-q</code> </td><td>indente la fonction actuelle
</td></tr><tr><td><code>M-i</code> </td><td>aligne le curseur sur la prochaine colonne de tabulation
</td></tr></table><h4>Gestion des commentaires
</h4><p>De même qu’Emacs sait indenter le code automatiquement, il sait
insérer des commentaires au bon endroit ; pour se faire, il vous
suffit d’actionner la commande <code>M-;</code> (<code>comment-dwim</code>). Que vous soyez
sur une ligne vide ou non, Emacs déterminera la syntaxe
à adopter. C’est la commande idéale pour ceux qui trouvent les
commentaires de type C (<code>/* ... */</code>) trop longs à taper.
</p><p>De plus, Emacs dispose des commandes de traitement de régions
suivantes : <code>comment-region</code> et <code>uncomment-region</code>. Elles sont
accessibles par <code>M-x</code> et qui peuvent être associées à une combinaison
de votre choix si vous en sentez le besoin. Je vous laisse deviner ce
qu’elles font. Elles peuvent être utiles à ceux qui aiment isoler des
morceaux de code avec des commentaires (personnellement, je préfère
utiliser <code>#if 0</code>).
</p><table><tr><td><code>M-;</code> </td><td>insère un commentaire
</td></tr></table><h4>Déplacements contextuels
</h4><p>Enfin, le <code>c-mode</code> dispose de mécanismes de navigation
contextuelle. La plupart des commandes utilisées sont communes à tous
les modes d’édition mais leur fonctionnement a été adapté à la
structure du code C.
</p><p>Vous pouvez, comme toujours, vous déplacer de mot en mot avec les
habituels <code>M-b</code> (<code>backward-word</code>) et <code>M-f</code> (<code>forward-word</code>).
</p><p>Juste au niveau supérieur, les commandes <code>C-M-b</code> (<code>backward-sexp</code>) et
<code>C-M-f</code> (<code>forward-sexp</code>) vous permettent de sauter d’un bout à l’autre
d’expressions équilibrées (un groupe entre parenthèses, crochets ou
accolades). En complément, <code>C-M-u</code> (<code>backward-up-list</code>) et <code>C-M-d</code>
(<code>down-list</code>) naviguent à travers les niveaux de parenthésage :
<code>C-M-u</code> vous amène au début du groupe dans lequel se situe le curseur
et <code>C-M-d</code> vous transporte au début du prochain groupe à l’intérieur
de l’expression actuelle. Le plus simple est encore de les essayer
pour en voir les effets !
</p><p>Vous pouvez également vous déplacer au début et à la fin des
instructions avec <code>M-a</code> (<code>c-beginning-of-statement</code>) et <code>M-e</code>
(<code>c-end-of-statement</code>), respectivement.
</p><p>Enfin, les commandes <code>beginning-of-defun</code> et <code>end-of-defun</code> font, sans
surprise, le voyage au début et à la fin d’une définition de fonction.
</p><p>Récapitulons les commandes directement accessibles :
</p><table><tr><td><code>C-b,</code> <code>C-f</code> </td><td>déplacement au mot
</td></tr><tr><td><code>C-M-b,</code> <code>C-M-f</code> </td><td>déplacement à l’expression (équilibrée)
</td></tr><tr><td><code>C-M-u,</code> <code>C-M-d</code> </td><td>déplacement à l’expression (équilibrée)
</td></tr><tr><td><code>M-a,</code> <code>M-e</code> </td><td>déplacement à l’instruction
</td></tr></table><h3>Plusieurs fichiers sources
</h3><p>Avec ce que nous venons juste de voir, nous sommes maintenant capables
d’éditer un fichier source C. Toutefois, la plupart des projets ne
sont pas constitués d’un seul fichier, aussi, nous allons nous pencher
sur la gestion de plusieurs fichiers dans Emacs. Cette section n’est
pas directement liée à la programmation en C, mais la question revient
fréquemment chez les novices, et c’est pourquoi j’ai décidé de la
traiter ici.
</p><h4>Hiérarchies de fichiers
</h4><p>Typiquement, le scénario est le suivant : vous possédez plusieurs
fichiers sources regroupés dans un dossier. Quelque chose que beaucoup
de gens aiment faire est pouvoir regarder la hiérarchie des fichiers
et naviguer de fichier en fichier. Pour cela, Emacs offre deux
mécanismes : <code>dired,</code> un explorateur de fichiers, et la <code>speedbar,</code>
une barre latérale.
</p><p>Selon vos goûts, vous préférerez sans doute l’un ou l’autre. Les
différences sont multiples : <code>dired</code> possède plus de facilités pour la
gestion des hiérarchies de fichiers et de dossiers, avec toutes les
fonctions classiques que l’on pourrait attendre d’un explorateur de
fichiers, et se présente comme une application Emacs à part entière,
utilisant ses propres <i>buffers</i>. À l’opposé, la <code>speedbar</code> s’affiche
dans un cadre (<i>frame</i>) à part, et son contenu est constamment
recalculé de sorte que le dossier affiché dans la barre soit toujours
celui du fichier actuel.
</p><div class="Remarque"></div><p>Si vous n’êtes pas habitué à la terminologie emacsienne, sachez qu’une
<em>fenêtre</em> correspond à une division de l’affichage d’Emacs (ce que
vous obtenez avec <code>C-x 2</code> par exemple) tandis qu’un cadre est un
ensemble de fenêtres indépendant, ce qui, en mode graphique,
correspond, pour la plupart des gestionnaires de fenêtres, à ce qu’ils
appellent une <em>fenêtre.</em> Sauf mention contraire, nous utiliserons ici
le vocabulaire d’Emacs.
</p><p>À l’usage, l’un ou l’autre est assez naturel. Pour lancer <code>dired,</code>
utilisez la commande <code>C-x d</code> (<code>dired</code>) ou <code>C-x C-f</code> (<code>find-file</code>) avec
le chemin d’un dossier. Pour lancer la <code>speedbar,</code> tapez <code>M-x
speedbar</code> ; un cadre devrait apparaître à côté de votre cadre
principal.
</p><p>Une fois à l’intérieur de l’un ou l’autre, placez-vous sur un fichier
et tapez <code>RET</code> (<code>dired-advertised-find-file</code> ou <code>speedbar-edit-line</code>)
pour le visiter. Sous <code>dired,</code> vous avez l’option de visiter le
fichier dans une autre fenêtre avec <code>o</code>
(<code>dired-find-file-other-window</code>).
</p><p>Si vous voulez parcourir des sous-dossiers, sachez que <code>dired</code> prône
une disposition plane tandis que la <code>speedbar</code> affiche les dossiers et
les fichiers sous forme arborescente. Lorsque votre curseur est sur
une ligne correspondant à un sous-dossier, tapez <code>i</code> sous <code>dired</code> ou
<code>+</code> dans la <code>speedbar</code> (respectivement, <code>dired-maybe-insert-subdir</code> et
<code>speedbar-expand-line</code>) pour insérer son listage dans le <i>buffer</i>
actuel. Pour supprimer l’affichage d’un sous-dossier, placez-vous sur
son en-tête (son chemin, juste au-dessus du listage, pour <code>dired,</code> ou
son nom dans l’arborescence, pour la <code>speedbar</code>) et exécutez la
commande <code>M-x dired-kill-subdir</code> ou <code>-</code> (<code>speedbar-contract-line</code>),
pour <code>dired</code> et la <code>speedbar</code> respectivement. Au lieu de l’effacer
complètement, <code>dired</code> vous propose aussi d’utiliser la commande <code>$</code>
(<code>dired-hide-subdir</code>), qui, malgré son nom, permet de cacher <em>et</em> de
découvrir le contenu du dossier.
</p><div class="Remarque"><p>Si votre gestionnaire de fenêtres ne vous permet pas de déplacer
facilement le focus au clavier, sachez qu’Emacs vous permet d’aller
de cadre en cadre avec <code>C-x 5 o</code> (<code>other-frame</code>).
</p></div><p>Et comme précédemment, un petit récapitulatif :
</p><table><tr><td>  </td><td><code>dired</code> </td><td><code>speedbar</code>
</td></tr><tr><td>parcourir un dossier </td><td><code>C-x d</code> </td><td>automatique
</td></tr><tr><td>visiter un fichier </td><td><code>RET</code> </td><td><code>RET</code>
</td></tr><tr><td>insérer un sous-dossier </td><td><code>i</code> </td><td><code>+</code>
</td></tr><tr><td>cacher un sous-dossier </td><td><code>$</code> </td><td><code>-</code>
</td></tr></table><h4>Plusieurs fichiers dans Emacs
</h4><p>Maintenant que vous savez accéder facilement à plusieurs fichiers de
votre projet, vous risquez fort d’être vite submergé par le grand
nombre de <i>buffers</i> ouverts. Emacs ne dispose pas de tabs (ce n’est
pas comme si vous alliez vous servir de votre souris pour y accéder,
de toute manière). En revanche, plusieurs modes sont disponibles pour
gérer vos <i>buffers</i>. Je ne vais pas tous les passer en revue ici, je
ne donnerai qu’une seule solution.
</p><p>La première commande à connaître pour bien gérer vos multiples
<i>buffers</i> est sans doute <code>C-x C-b</code> (<code>list-buffers</code>). Elle démarre le
gestionnaire de <i>buffers</i>. Ce dernier se présente comme une simple
liste des <i>buffers</i> ouverts. Vous pouvez y effectuer les opérations de
navigation habituelles, dont la recherche (avec <code>C-s</code>
(<code>isearch-forward</code>) pour les étourdis). <code>RET</code>
(<code>Buffer-menu-this-window</code>) vous permet de visiter le <i>buffer</i> à la
ligne actuelle. Une autre utilisation très pratique est de supprimer
plusieurs <i>buffers</i> à la fois. Pour cela, marquez chaque <i>buffer</i>
à détruire avec la commande <code>d</code> (<code>Buffer-menu-delete</code>). La lettre <code>D</code>
apparaît alors à gauche du nom. La commande <code>x</code>
(<code>Buffer-menu-execute</code>) effectue l’opération de nettoyage en
elle-même. Ainsi, si vous vous êtes trompé dans votre marquage, vous
pouvez revenir en arrière en utilisant la commande <code>u</code>
(<code>Buffer-menu-unmark</code>) sur la même ligne.
</p><p>Tout cela est bien utile pour faire le ménage mais ne vous aide guère
pour votre besoin le plus simple : naviguer de <i>buffer</i> en
<i>buffer</i>. Pour cela, il y a bien sûr la commande <code>C-x b</code>
(<code>switch-to-buffer</code>) par défaut d’Emacs pour changer de <i>buffer</i>. Mais
elle n’est pas très pratique ; en effet, elle demande d’entrer le
début du nom pour accéder au <i>buffer</i>. Fort heureusement, il existe
(au moins) un mode qui vous permet de changer de <i>buffer</i> en tapant
quelques lettres n’importe où dans le nom. Je vous présente là
l’<code>iswitchb-mode</code>. Pour l’essayer, il vous suffit d’effectuer la
commande <code>M-x iswitchb-mode</code> ; de même pour le désactiver. Pour
l’adopter définitivement, ajoutez à votre <code>.emacs</code> la ligne :
</p><pre><code>(iswitchb-mode t)
</code></pre><p>La combinaison <code>C-x b</code> invoquera à présent <code>iswitchb-buffer</code>. Si vous
l’essayez, vous remarquerez que la liste des <i>buffers</i> qui sont encore
candidats à la sélection est maintenant affichée à côté de votre
saisie. Dans ce mode, les commandes <code>C-r</code> (<code>iswitchb-prev-match</code>) et
<code>C-s</code> (<code>iswitchb-next-match</code>) vous permettent de faire défiler les
éléments de la liste de manière cyclique, et <code>RET</code> sélectionne le
premier <i>buffer</i> de la liste. Ainsi, vous n’aurez plus à taper le
début exact du nom que vous voulez, il vous suffira simplement
d’entrer quelques lettres remarquables et, moyennant quelques
rotations de la liste, vous arriverez rapidement à destination.
</p><p>Vous pouvez aussi demander à utiliser des expressions régulières. La
commande <code>C-t</code> (<code>iswitchb-toggle-regexp</code>), dans l’<code>iswitchb-mode,</code>
vous permet cela. Par exemple, pour obtenir une liste des fichiers
C ouverts, vous pourriez utiliser le motif <code>\.c$</code>. Veuillez cependant
prendre note du fait que les expressions régulières d’Emacs diffèrent
d’autres syntaxes, soyez donc averti et pensez à lire le manuel (avec
<code>C-h i</code> (<code>info</code>), par exemple) si vous désirez en faire bon usage.
</p><p>Avec l’habitude, ce système très flexible remplace avantageusement les
tabs. Vous n’êtes plus lié à une liste prédéfinie ; vous avez la
possibilité de fabriquer rapidement la vôtre, adaptée à votre
requête. Du reste, il vous permettra de même d’aller de <i>buffer</i> en
<i>buffer</i>. Et tout cela pour un encombrement nul dans vos autres
actions !
</p><p>Et pour les petits étourdis :
</p><table><tr><td><code>C-x C-b</code> </td><td>gestionnaire de <i>buffers</i>
</td></tr><tr><td><code>C-x b</code> </td><td>change de <i>buffer</i>
</td></tr><tr><td><code>C-r</code> et <code>C-s</code> </td><td>défilement de la liste (dans <code>iswitchb</code>)
</td></tr><tr><td><code>C-t</code> </td><td>activation des <i>regexps</i> (dans <code>iswitchb</code>)
</td></tr></table><h4>Édition simultanée de plusieurs fichiers
</h4><p>Bien sûr, vous n’êtes pas encore capable de vous dédoubler pour éditer
plusieurs fichiers à la fois, mais parfois, vous pourriez vouloir
afficher deux fichiers (voire plus) côte à côte.
</p><p>Pour se faire, rien de plus simple. Il vous suffit de partager votre
affichage en deux : verticalement avec <code>C-x 2</code>
(<code>split-window-vertically</code>) ou horizontalement avec <code>C-x 3</code>
(<code>split-window-horizontally</code>). Pour passer d’une fenêtre à l’autre,
utilisez <code>C-x o</code> (<code>other-window</code>). Enfin, <code>C-x 0</code> (<code>delete-window</code>) et
<code>C-x 1</code> (<code>delete-other-windows</code>) vous permettent respectivement de
supprimer la fenêtre sur laquelle se trouve le focus et de ne laisser
qu’elle.
</p><p>Ainsi, vous pourrez plus facilement comparer ou transférer du code
d’un fichier à un autre.
</p><p>Sachez également qu’il existe des commandes qui marient une action
donnée à un changement de fenêtre, telles que<code>C-x 4 f</code>
(<code>find-file-other-window</code>) et <code>C-x 4 b</code>
(<code>switch-to-buffer-other-window</code>). La première ouvre un fichier,
à l’instar de <code>C-x C-f</code> (<code>find-file</code>) mais l’affiche dans une fenêtre
séparée. La seconde agit comme <code>C-x b</code> (<code>switch-to-buffer</code>) mais, de
même, place le contenu dans une autre fenêtre. Si le cadre n’est
constitué que d’une fenêtre, celui-ci est automatiquement scindé en
deux.
</p><table><tr><td><code>C-x 2,</code> <code>C-x 3</code> </td><td>création de fenêtres
</td></tr><tr><td><code>C-x o</code> </td><td>déplacement de fenêtre à fenêtre
</td></tr><tr><td><code>C-x 0,</code> <code>C-x 1</code> </td><td>suppression de fenêtres
</td></tr><tr><td><code>C-x 4 f</code> </td><td>visite un fichier dans une autre fenêtre
</td></tr><tr><td><code>C-x 4 b</code> </td><td>affiche un <i>buffer</i> dans une autre fenêtre
</td></tr></table><h3>Gestion de l’historique des modifications avec VC
</h3><p>Le dernier outil essentiel à tout projet sérieux est un gestionnaire
de versions. Si vous n’êtes pas familier avec ce concept, voici une
brève introduction. Vos fichiers seront amenés à grandement évoluer
avec les phases d’essai, de correction, d’essais publics,
d’amélioration, etc. Il est donc primordial de contrôler ces
changements sous forme de <em>versions.</em> Des logiciels spécialisés
appelés « systèmes de contrôle de versions » (VCS, <i>Version Control
Systems</i> en anglais) permettent de faire cela. Nous n’entrerons pas
ici dans le détail du fonctionnement de ceux-ci, mais le principe
général est le suivant : chaque fichier est associé à une copie
<em>persistante,</em> qui représente tous ses états depuis le début, toutes
ses <em>versions,</em> sous forme de différences. Cela signifie qu’une
version n’est pas stockée en entier mais uniquement sous une forme
<em>relative à une version voisine.</em> Dans sa réalisation la plus
classique, par exemple, si vous ajoutez une ligne à un fichier, le
fichier de contrôle, contenant la copie persistante, enregistrera une
différence d’une ligne par rapport à la version précédente.
</p><p>Emacs intègre un support de certains de ces systèmes, dont RCS, CVS,
SVN et Git. Pour illustrer cette intégration, qui porte le petit nom
de VC pour, vous l’aurez deviné, <i>Version Control,</i> nous allons nous
intéresser au plus simple d’entre eux : RCS. Mais les commandes
demeurent approximativement les mêmes quel que soit le programme de
gestion de versions.
</p><p>Traditionnellement, les fichiers de contrôle de RCS sont stockés
localement dans un sous-dossier de celui où se situent vos fichiers
sources, ce sous-dossier portant le nom <code>RCS</code>. Si vous ne le créez pas
par vous-même, Emacs vous le proposera en temps voulu.
</p><p>L’utilisation de VC repose sur la commande <code>C-x v v</code>
(<code>vc-next-action</code>). Comme son nom l’indique, elle fait… des choses,
selon l’état actuel du fichier. Avec RCS, un fichier peut avoir
plusieurs états. Dans son utilisation classique, ce sont les suivants.
</p><ol><li><p>Au départ, le fichier est inconnu de RCS. Lorsque vous
l’enregistrez auprès de ce dernier (avec <code>C-x v v</code>), celui-ci
s’approprie le contenu. Le fichier et la version la plus récente
connue de RCS sont alors les mêmes.
</p></li><li><p>À ce stade, vous ne pouvez pas modifier le fichier à nouveau. Il
vous faut prévenir RCS de votre intention, ceci afin d’empêcher que
plusieurs personnes ne modifient le même fichier en même
temps. Cette action s’appelle le verrouillage et s’effectue aussi
par <code>C-x v v</code>. Une fois le fichier verrouillé, vous êtes sûr qu’il
est la seule copie de travail existante.
</p></li><li><p>Une fois vos modifications effectuées, <code>C-x v v</code> synchronise votre
brouillon avec la copie de contrôle. VC vous demande alors de
fournir un commentaire décrivant les changements, commentaire qui
sera inscrit dans une espèce de journal de bord du fichier. La
fenêtre d’édition du message est tout à fait banale et la validation
est obtenue par le traditionnel <code>C-c C-c,</code> valable pour la plupart
des formulaires sous Emacs. Après cette étape, le fichier et la
version la plus récente connue de RCS sont à nouveau les mêmes.
</p></li></ol><p>Tout ceci est bien joli, mais à quoi serviraient un historique et un
journal que l’on ne peut consulter ?
</p><p>La commande <code>C-x v ~</code> (<code>vc-version-other-window</code>) vous permet
d’accéder au contenu d’une version antérieure de votre fichier. Le
numéro de la version vous sera demandé. Mais que faire si vous ne vous
rappelez plus de la bonne version ? C’est à cela que servent les
commentaires que vous avez pris soin d’entrer tout au long de votre
travail ! Pour voir la liste des versions ainsi que les messages
associés, tapez <code>C-x v l</code> (<code>vc-print-log</code>).
</p><p>Une fois la version voulue récupérée dans un <i>buffer</i> secondaire, vous
pouvez afficher les deux <i>buffers</i> en parallèle comme nous avons vu
précédemment. Mais VC propose une commande intéressante pour vous
aider à voir les différences entre vos versions : <code>C-x v =</code>
(<code>vc-diff</code>). Elle vous propose une comparaison rapide de deux
versions, avec la différence placée dans un <i>buffer</i> à part.
</p><p>Cela peut sembler beaucoup de choses à enregistrer si vous n’avez
jamais utilisé de VCS auparavant, mais j’ai moi-même débuté dans ce
domaine avec VC qui est, à mon avis, un moyen simple de se
familiariser avec le concept tout en restant bien au chaud dans son
éditeur préféré. Et pour vous y aider, voici un… récapitulatif !
Avouez que vous ne vous y attendiez pas.
</p><table><tr><td><code>C-x v v</code> </td><td>change d’état
</td></tr><tr><td><code>C-x v ~</code> </td><td>ressuscite une version
</td></tr><tr><td><code>C-x v l</code> </td><td>invoque la liste des versions
</td></tr><tr><td><code>C-x v =</code> </td><td>compare deux versions
</td></tr></table><p>Cette présentation de VC et de RCS achève ce premier article. Dans le
prochain chapitre (peut-être…<sup>α),</sup> nous parlerons de la compilation de
fichiers et de projets écrits en C, à l’aide de <i>makefiles</i>, le tout
depuis Emacs. Contrairement à ce premier tutoriel, il sera bien moins
porté sur Emacs lui-même que sur les outils à mettre en œuvre pour
compiler depuis Emacs, c’est-à-dire GCC et <code>make</code>.
</p><div class="Notes"><p>α : L’histoire nous a montré que ce « peut-être » a su se
transformer en « non ». :)
</p></div><div class="Remarque"><p>Je remercie Metzgermeister et nicofrand pour la relecture de cet
article.
</p></div>
tag:blog.huoc.org,2009:posts/39
Votre premier .emacs
2008-05-04T00:00:00+02:002010-02-20T10:02:19+01:00Nhat Minh Lê (rz0)
<div class="Edito"><p>Cela faisait un moment que je voulais migrer tous mes modestes
écrits sur la même plateforme ; voilà un pas de plus dans cette
direction avec la réédition de ce petit classique du fond de mon
tiroir ! —rz0
</p></div><p>Ceci n’est pas une introduction à Emacs en soi mais à sa
configuration. Si vous connaissez les bases, avez lu le tutorial
intégré ou quelque chose d’équivalent, que vous arrivez à vous
déplacer, écrire du texte, et éditer des fichiers dans Emacs, mais
souhaitez changer certains paramètres de son comportement, cet article
est peut-être pour vous.
</p><p>Cette introduction à la configuration vous apprendra au passage les
bases de la syntaxe utilisée pour écrire le fichier <code>.emacs</code> ; si vous
voulez juste copier et coller des bouts de code, cet article n’est pas
pour vous.
</p><p>Je ne documente ici ni XEmacs, ni NTEmacs, seulement GNU Emacs, soyez
averti. Ce n’est pas que j’aie quoi que ce soit contre ceux-ci, mais
je ne connais pas bien les autres emacs.
</p><h3>Comment configurer Emacs ?
</h3><p>Il existe trois moyens de configurer Emacs : par le menu, par une
application intégrée appelée <em>customize</em> ou en éditant le fichier
<code>.emacs</code>, situé dans votre dossier personnel (<code>$HOME</code> pour les
étourdis).
</p><p>Cet article porte sur l’édition du fichier <code>.emacs</code>, mais je vais tout
de même passer en revue les autres possibilités pour vous expliquer
pourquoi nous n’allons pas y avoir recours.
</p><h4>Par le menu
</h4><p>La première méthode n’a pas besoin d’explications ; si vous lisez
ceci, vous savez probablement vous servir d’une souris, ou d’un
clavier, ce qui est encore mieux, et quoi qu’il en soit, c’est
suffisant pour configurer Emacs par le menu. Cette approche est
toutefois très limitée, les options du menu étant ce qu’elles sont, et
rien de plus.
</p><h4>Par customize
</h4><p>La deuxième offre un choix beaucoup plus important d’options ;
quasiment tout ce qui est utile en terme de configuration directe peut
être réalisé par cette interface. Pour l’invoquer, il suffit
d’utiliser la commande <code>customize</code> (invoquée par <code>M-x customize</code> comme
vous vous en doutez si vous avez eu une introduction décente à Emacs ;
sinon, sachez que <code>M-x</code> signifie « la touche <code>X</code> en maintenant la
touche <i>Meta</i>, <i>Alt</i> sur les claviers de PC, enfoncée »).
</p><p>À partir de là, l’interface est assez simple : il y a des options,
avec leur description, et leur valeur actuelle, modifiable, ainsi que
des dossiers avec plus d’options et des sous-dossiers. Pour tout
sauvegarder, il y a un bouton en haut du <i>buffer</i>. Cela écrira dans le
fichier <code>.emacs</code>, par défaut.
</p><p>Cette méthode a cependant un défaut : les modifications que vous
apportez à votre configuration sont ensuite difficilement rectifiables
directement en éditant le fichier produit par l’outil. De même, les
changements effectués en dehors du mode customize, tels que ceux
opérés sur le fichier <code>.emacs</code>, se marient assez mal avec celui-ci.
</p><div class="Remarque"><p>De plus, d’une version à l’autre d’Emacs, customize ne semble pas
demeurer totalement rétro-compatible dans le sens où le fichier
généré par customize dans une version récente risque de ne pas
fonctionner correctement avec une version précédente.
</p><p>Pour illustrer mon propos, je vais prendre mon exemple. J’ai un
thème de couleurs grandement personnalisé. Je l’avais débuté étant
sous Emacs 21, puis suis passé à Emacs 22 dès sa sortie. Je n’ai
rencontré aucun problème de transfert vers la nouvelle
version. Cependant, lorsque j’ai voulu prêter le fichier à quelqu’un
qui était encore sous Emacs 21, celui-ci n’a pas pu le lire
correctement !
</p><p>Il y a peut-être une façon ninja de faire cette manipulation mais je
ne suis pas au courant.
</p></div><h4>Par le fichier <code>.emacs</code>
</h4><p>Le fichier <code>.emacs</code> est un simple fichier contenant du texte. Simple ?
pas vraiment en vérité. Le format du fichier est loin de ressembler
à ce que vous avez sans doute l’habitude de voir avec d’autres
configurations. La configuration d’Emacs est écrite en Lisp, plus
précisément en Emacs Lisp. Si vous ne le savez pas, le Lisp est un
langage de programmation à part entière !
</p><p>En effet, la spécificité d’Emacs est d’être entièrement (ou presque)
programmable, grâce à son langage intégré. Tout (ou presque) dans
Emacs est Lisp. Les divers modes et applications dans Emacs sont codés
en Emacs Lisp, et de même la configuration est écrite en Lisp.
</p><p>Même lorsque vous éditez votre configuration à l’aide des menus ou de
customize, Emacs retranscrit vos modifications en Lisp et les
sauvegarde dans un fichier.
</p><p>En réalité, le fichier <code>.emacs</code> est aussi appelé <em>fichier
d’initialisation</em> car c’est simplement un programme écrit en Emacs
Lisp qui est exécuté au démarrage d’Emacs.
</p><p>L’intérêt de cette dernière méthode réside dans sa flexibilité ; vous
pouvez presque tout faire rien qu’en écrivant du code Lisp dans votre
.emacs, et même si toutes ces possibilités ne vous seront pas tout de
suite utiles, c’est également l’approche qui s’adapte le mieux à une
évolution vers une utilisation confirmée d’Emacs, qui implique
l’apprentissage de l’Emacs Lisp.
</p><h3>Une approche conseillée
</h3><p>Vous l’aurez compris, je vous recommande chaudement de configurer
votre Emacs en éditant le fichier <code>.emacs</code> par vous-même. Cependant,
le mode customize a un usage très important : parcourir l’ensemble des
paramètres disponibles pour une catégorie donnée. Pour cela, vous
pouvez utiliser la commande <code>customize-group</code> qui vous permet d’aller
directement à la configuration d’un groupe d’options particulier, dont
vous devez donner le nom. Généralement, c’est le nom correspondant
à l’application ou au mode que vous voulez configurer.
</p><p>Par exemple, pour voir les possibilités de personnalisation offertes
par ERC, le client IRC, vous exécuteriez la commande <code>customize-group
erc</code>. Nous verrons plus loin comment mieux exploiter ces
informations ; pour l’heure, vous ne pouvez sans doute que lire les
descriptions d’options.
</p><p>Une autre utilisation de customize que j’admets sans vraiment
conseiller est la mise en place d’un thème de couleurs. Le faire sans
customize est vraiment très pénible ; je l’ai fait, une fois, pour mon
thème de couleurs basique, pour la console, mais je ne le referai pas,
je crois. Nous verrons plus loin comment changer les polices et les
décorations du texte, pour créer un environnement un peu plus agréable
que le <i>look</i> par défaut.
</p><h3>Premiers pas
</h3><h4>Aperçu de la syntaxe Lisp
</h4><p>Configurer Emacs ne requiert pas de connaître parfaitement l’Emacs
Lisp, mais quelques rapides notions sont toutefois recommandées pour
comprendre la syntaxe des lignes d’exemples à venir.
</p><p>Le Lisp est un langage possédant une syntaxe extrêmement
régulière. Toutes les constructions (ou presque) prennent la forme
suivante :
</p><pre><code>(OPÉRATEUR OPÉRANDE ...)
</code></pre><p>Si vous avez déjà un peu programmé, sachez qu’<code>OPERATEUR</code> peut être
aussi bien une fonction qu’une instruction spéciale (un <code>if</code>, un
<code>while</code>, etc.). Sinon, retenez simplement que le premier mot dans la
liste indique l’action à effectuer.
</p><p>Et sans le vouloir, nous venons d’introduire la notion de <em>liste.</em> Une
liste, c’est exactement ce que je viens de vous montrer, une suite
d’éléments entre parenthèses, séparés par des blancs. Tout le code
écrit en Emacs Lisp est essentiellement constitué de listes donc !
</p><h5>Commentaires
</h5><p>Tous les langages de programmation civilisés possèdent leur syntaxe
pour inclure des commentaires dans le code, des lignes qui ne seront
pas interprétées par Emacs. Il suffit de pour cela de précéder le
texte à commenter par un point-virgule (ou plusieurs).
</p><pre><code>;; Ceci est un commentaire.
</code></pre><h3>Environnement
</h3><p>La première chose à savoir est qu’il existe plusieurs fichiers
similaires au .emacs qui contiennent divers morceaux de
configuration. Principalement, on peut prendre note des fichiers
suivants :
</p><dl><dt><code>$HOME/.emacs.el</code> ou <code>$HOME/.emacs</code></dt><dd><p>Votre fichier d’initialisation principal. Les fichiers de code Emacs
Lisp sont habituellement nommés avec un suffixe <code>.el</code> mais le .emacs
peut faire exception. Il existe quelque différences, mais elles ne
nous gêneront pas ici et je me référerai toujours à ce fichier comme
le .emacs bien que je l’ai moi-même appelé <code>.emacs.el</code>.
</p></dd><dt><code>$PREFIX/share/emacs/site-lisp/site-start.el</code></dt><dd><p>Le fichier global d’initialisation. Il joue le même rôle que le
.emacs dans votre dossier personnel mais est lu avant votre
.emacs. Il est souvent rempli à l’avance par votre installation dans
le cas des gestionnaire de paquets, qui s’en servent pour charger
des informations utiles sur les applications tierces qu’ils
installent pour Emacs.
</p><p><code>$PREFIX</code> est la racine où vous avez installé Emacs. Généralement
<code>$PREFIX</code> vaut <code>/usr</code> ou <code>/usr/local</code> ; sur certains systèmes, cela
peut être <code>/usr/pkg</code> ou, si vous l’avez installé dans votre dossier
personnel, <code>$HOME/local</code>.
</p></dd><dt><i>fichiers de configuration des applications</i></dt><dd><p>Emacs est un environnement de travail qui peut accueillir des
applications (spécifiquement développées pour Emacs). Chaque
application possède souvent son propre fichier qui est lu au
chargement de celle-ci. Par exemple, Mew utilise <code>$HOME/mew.el</code>.
</p></dd><dt><i>fichiers de configuration auxiliaires</i></dt><dd><p>Vous pouvez également scinder votre .emacs en plusieurs fichiers,
lorsque celui-ci deviendra relativement volumineux. Ce ne sera pas
le cas aujourd’hui, aussi, nous n’aborderons pas ce sujet dans cet
article.
</p></dd></dl><h3>Premier réglage : le système de codage de caractères
</h3><p>Emacs étant avant tout un éditeur de texte, son interface ainsi que la
plupart des informations qu’il lit, stocke et échange demeurent sous
forme textuelle. Un réglage très global et très important est donc le
système de codage par défaut.
</p><div class="Remarque"><p>Pour ceux d’entre vous qui ne savent pas ce qu’est un système de
codage de caractères, c’est simplement la représentation numérique
(« binaire ») des caractères (lettres, chiffres, symboles) qui
forment le texte. Pour plus d’informations, vous pouvez consulter la
<a class="extern" href="http://fr.wikipedia.org/wiki/Codage de caractères">page Wikipédia sur le codage de
caractères</a>.
</p></div><p>Il existe plusieurs options pour configurer en finesse les différents
codages ; le réglage principal est obtenu par la commande
<code>set-language-environment</code>. La syntaxe est la suivante :
</p><pre><code>(set-language-environment "NOM")
</code></pre><p>Il faut bien sûr remplacer <code>NOM</code> par le nom de l’environnement de
votre choix. Les valeurs d’intérêt pour nous seront <code>"UTF-8"</code> si vous
souhaitez avoir un environnement utilisant principalement l’UTF-8, ou
<code>"Latin-1"</code> si vous voulez de l’ISO-8859-1. Les deux sont capables de
représenter les caractères français ; l’UTF-8 permet en plus les
caractères internationaux, provenant d’autres langues. Si vous ne
savez pas pour lequel opter, je vous conseille l’UTF-8 ; la tendance
actuelle va vers UTF-8 et les deux environnements de bureau dominants,
à savoir GNOME et KDE, l’utilisent, par défaut.
</p><p>Rajoutez la ligne qui convient à votre .emacs. S’il n’existe pas,
créez le.
</p><h3>Organisation de vos fichiers
</h3><p>Votre .emacs ne contenant actuellement qu’une seule ligne, il semble
superflu d’essayer de le diviser en plusieurs fichiers. Toutefois, en
prévision des modifications que nous allons effectuer par le biais de
customize, afin de mettre en place un thème de couleurs, un petit
arrangement s’impose.
</p><p>Par défaut, customize s’amuse à écrire dans votre .emacs, ce qui est
très mal venu, surtout si vous utilisez un gestionnaire de versions
comme RCS ou Git.
</p><p>Il est très simple cependant de l’instruire de sorte à ce que le
contenu soit placé dans un fichier réservé, de manière civilisée. Le
nom de ce fichier est donné par la variable <code>custom-file</code>.
</p><h4>Variables dans Emacs
</h4><p>Dans Emacs, une variable est l’association d’une valeur (« quelque
chose ») à un nom (un <em>symbole</em> dans le vocabulaire emacsien).
</p><p>Ici, le symbole est <code>custom-file</code> et la valeur est le nom du fichier.
</p><p>On change la valeur d’une variable avec la forme :
</p><pre><code>(setq SYMBOLE VALEUR)
</code></pre><p>Dans notre cas, la ligne devient :
</p><pre><code>(setq custom-file "NOM-DU-FICHIER")
</code></pre><p>Remarquez que le nom du fichier est entre guillemets droits ; c’est la
manière d’écrire du texte (des <em>chaînes de caractères</em> pour ceux qui
ont quelque expérience en programmation) en Emacs Lisp.
</p><p>Par exemple, vous pourriez appeler ce fichier <code>.emacs-custom.el</code> et le
placer dans votre dossier personnel, comme ceci :
</p><pre><code>(setq custom-file "~/.emacs-custom.el")
</code></pre><p>J’ai fait exprès d’utiliser le tilde, au cas où vous douteriez
qu’Emacs le reconnaisse à l’instar du <i>shell.</i>
</p><p>La syntaxe d’affectation (changement de valeur d’une variable) est
très utile pour la configuration et n’est pas propre à la variable
<code>custom-file</code> ; beaucoup d’options sont modifiables de cette
manière. J’aurais pu vous donner directement l’instruction tout
entière, mais, désormais, vous saurez reconnaître une
affectation. C’est un premier pas sur la voie du programmeur Emacs
Lisp ! :)
</p><p>Toutefois, dans ce cas précis, simplement changer la valeur de la
variable ne suffit pas. Cette manipulation va dire à customize
d’inscrire ses modifications dans le fichier, mais celui-ci ne sera
pas lu par Emacs lui-même comme l’est votre .emacs (et par voie de
conséquence, comme l’étaient les ajouts faits par customize
à celui-ci, avant que nous ne décidions de les détourner).
</p><p>Pour charger ce fichier dans la mémoire d’Emacs et l’exécuter, nous
allons employer la fonction <code>load</code> comme ceci :
</p><pre><code>(load custom-file)
</code></pre><p>Cette ligne est à placer après avoir donné à la variable <code>custom-file</code>
sa valeur, bien entendue ; en effet, on demande ici à Emacs de lire le
fichier dont le nom est donné par la variable custom-file. On aurait
pu écrire :
</p><pre><code>(load "~/.emacs-custom.el")
</code></pre><h4>Variables dans customize
</h4><p>Maintenant que nous avons eu un bref aperçu des variables,
rappelez-vous customize et de son utilisation en tant qu’explorateur
d’options.
</p><p>Dans l’interface de customize, vous trouverez beaucoup d’options de
configurations ; chacune porte un nom, qui, en règle générale,
correspond à celui d’une variable, avec des espaces à la place des
tirets et des majuscules au début des mots. L’option <code>Ceci Est Une
Option</code> est en vérité la variable <code>ceci-est-une-option</code>.
</p><p>La description ainsi que les menus vous donnerons une petite idée des
valeurs acceptables et vous pourrez modifier la variable dans votre
.emacs. Remarquez que le menu offert par le bouton <code>State</code> vous
propose de voir l’expression Lisp telle que vous pourriez vouloir
l’inscrire dans votre .emacs.
</p><h4>Récapitulatif
</h4><p>Nous avons vu, dans cette partie, quelques réglages fondamentaux,
ainsi que la syntaxe pour affecter une valeur à une variable. Votre
.emacs devrait maintenant ressembler à ceci :
</p><pre><code>(set-language-environment "UTF-8")
(setq custom-file "~/.emacs-custom.el")
(load custom-file)
</code></pre><h3>Changer l’apparence d’Emacs
</h3><p>Ce n’est certainement pas le plus utile, mais c’est une question qui
revient fréquemment : comment changer l’apparence d’Emacs. La méthode
présentée ici n’est peut-être pas la plus propre, mais c’est celle que
je trouve la plus pratique, et pour quelque chose de secondaire tel
que l’affichage, elle conviendra bien.
</p><h4>Changer la police d’affichage
</h4><div class="Remarque"><p>Cette section n’a d’intérêt que si vous utilisez Emacs en mode
graphique. Autrement, il s’agit de configurer votre console et non
Emacs.
</p></div><p>L’interface d’Emacs est majoritairement constituée de texte, il est
important de configurer une police qui vous est agréable. La police
par défaut doit être monospacée, mais cela mis à part, vous pouvez
utiliser n’importe quelle police supportée par les applications
graphiques. Sous X, cependant, la version 22 ne supporte pas encore le
lissage des caractères. Je vous conseille donc de prendre une police
disponible en format <i>bitmap</i>. Personnellement, j’utilise
<a class="extern" href="http://www.is-vn.bg/hamster/">terminus</a> pour Emacs 22.
</p><p>Comme je l’ai indiqué auparavant, nous allons utiliser customize pour
modifier les paramètres d’affichage. La commande <code>M-x customize-face</code>
réalise cela.
</p><div class="Remarque"><p>Dans Emacs, « face » est le nom donné à un jeu d’attributs
d’affichage. Il y en a pour chaque type de caractère que vous pouvez
rencontrer dans un <i>buffer</i> : les caractères normaux, les mots-clés
ou encore les commentaires, dans du code.
</p></div><p>Emacs vous demande alors quel type de caractères modifier. Entrez
<code>default</code> pour personnaliser le type par défaut, dont les attributs
sont hérités par tous les autres, si ceux-ci ne fournissent pas les
leurs. Vous devriez alors obtenir une interface semblable à celle
représentée ci-dessous :
</p><pre><code>Default face: (sample) Hide Face
State: SAVED and set.
Basic default face.
Parent groups: Basic Faces
Choice: Value Menu
Attributes: [X] Font Family: xos4-terminus
[X] Width: Value Menu medium
[X] Height: Value Menu Height in 1/10 pt: 151
[X] Weight: Value Menu medium
[X] Slant: Value Menu normal
[X] Underline: Value Menu Off
[X] Overline: Value Menu Off
[X] Strike-through: Value Menu Off
[X] Box around text: Value Menu Off
[X] Inverse-video: Value Menu Off
[X] Foreground: gray88 (sample)
[X] Background: black (sample)
[X] Stipple: Value Menu None
[ ] Inherit: *
</code></pre><p>La plupart des champs devraient parler d’eux-mêmes. En vérité, pour le
type par défaut, nous ne voulons sans doute pas altérer d’autres
champs que <code>Font Family</code>, <code>Height</code>, <code>Foreground</code> et <code>Background</code>. Vous
pouvez obtenir une jolie liste des couleurs et leurs noms avec la
commande <code>M-x list-colors-display</code>.
</p><p>Expérimentez un peu pour obtenir ce qui vous convient. Pour appliquer
vos changements, actionnez le bouton <code>State</code> ; les choix proposés ne
posent aucune difficulté. Faites plusieurs fois <code>Set for Current
Session</code>, puis, lorsque vous êtes content de vos paramètres,
choisissez <code>Save for Future Sessions</code>.
</p><p>Cette manipulation est réalisable pour n’importe quel type ; pour
avoir accès à la liste complète, validez sans fournir de nom, lors de
l’invite offerte par <code>M-x customize-face</code>. Veuillez prendre note du
fait que seuls les types existants seront ainsi disponibles. En
particulier, si vous souhaitez personnaliser un module particulier, il
faudra le charger <em>avant</em> d’utiliser <code>M-x customize-face</code>. La plupart
des modules se chargent automatiquement lorsque vous tentez d’accéder
à un de leurs modes.
</p><p>Si vous voulez changer la manière dont s’affichent les titres sous le
mode LaTeX, tentez de visiter un fichier LaTeX avant d’utiliser <code>M-x
customize-face</code>.
</p><div class="Remarque"><p>Un moyen pratique de savoir quel type personnaliser est de placer
votre curseur sur un caractère présentant les propriétés que vous
voulez changer et d’invoquer <code>M-x customize-face</code> ; l’invite vous
proposera alors par défaut de changer le type dont est affecté ce
caractère !
</p></div><h4>Composants de l’interface
</h4><p>Après ce petit intermède en compagnie de customize, revenons
à l’édition de notre .emacs.
</p><p>Par défaut, Emacs affiche beaucoup de composants sans grand intérêt
dans son interface : un menu, une barre d’outils et même des barres de
défilement, mais oublie certaines informations importantes telles que
le numéro de la colonne à laquelle le curseur se situe. Nous allons au
plus vite remédier à cela.
</p><p>Le menu, les barres d’outils et de défilement peuvent être supprimés
avec les instructions suivantes :
</p><pre><code>(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
</code></pre><p>L’affichage du numéro de la colonne est obtenu par l’instruction :
</p><pre><code>(column-number-mode 1)
</code></pre><p>Le tout est bien sûr à placer dans votre .emacs, à la suite des
changements précédents. Voilà déjà quelques lignes de gagnées dans
votre espace de travail !
</p><h4>Autres paramètres d’affichage
</h4><p>Terminons notre petit tour d’horizon des options de configuration de
l’interface d’Emacs par quelques paramètres que vous pourriez vouloir
et qui adressent chacune un aspect différent de l’affichage d’Emacs.
</p><ol><li><p>La première est <code>truncate-partial-width-windows</code>. Par défaut, Emacs
replie automatiquement les lignes de texte dans les fenêtres en
plein écran, mais, si vous décidez de partager horizontalement votre
Emacs en deux fenêtres côte à côte, vous vous apercevrez qu’Emacs
tronque à présent les lignes trop longues. Pour empêcher cela, il
faut changer la valeur de la variable
<code>truncate-partial-width-windows</code> de <code>t</code> (qui signifie « vrai » en
termes booléens) à <code>nil</code> (qui signifie « faux »).
</p><pre><code>(setq truncate-partial-width-windows nil)
</code></pre><p>Emacs possède de même tout un tas de paramètres qui vous permettent
de changer la manière dont il affiche les éléments. N’hésitez pas
à fouiller pour en trouver d’autres !
</p><p>Mentionnons, par exemple, un petit réglage de confort sous la forme
de la variable <code>ring-bell-function</code>. Elle vous permet de spécifier
une fonction à appeler au lieu de faire sonner la petite alarme (qui
fait « bip ») interne de votre ordinateur. Il y a plusieurs valeurs
possibles, mais un choix convenable est le suivant :
</p><pre><code>(setq ring-bell-function 'ignore)
</code></pre><p>La fonction <code>ignore</code> ne fait rien ; du coup, vous n’aurez plus droit
à ces alarmes que personnellement je trouve perturbatrices.
</p></li><li><p>En deuxième, regardons comment on peut avoir l’heure tout en
restant dans Emacs. Cela fait partie des nombreux gadgets (mais qui
peuvent s’avérer utiles ; en l’occurrence, j’aime avoir l’heure dans
Emacs) disponibles sous Emacs.
</p><p>Pour activer l’affichage de l’heure dans la barre de modes,
inscrivez la ligne suivante dans votre .emacs.
</p><pre><code>(display-time-mode t)
</code></pre><p>Vous l’aurez peut-être remarqué, nous avons déjà vu plusieurs
fonctions dont le nom se termine par <code>-mode</code>. Ici, ce sont des modes
mineurs globaux. En d’autres termes, ce sont des fonctionnalités que
vous pouvez activer ou désactiver. À la différence des variables,
les modes fonctionnent dans une optique plus binaire : un mode est
actif ou il ne l’est pas. Les variables, quant à elles, permettent
de spécifier des valeurs particulières pour contrôler certains
aspects du fonctionnement d’Emacs.
</p></li></ol><h3>Changer les combinaisons au clavier
</h3><p>Maintenant que vous savez comment configurer l’apparence d’Emacs, nous
allons nous intéresser aux combinaisons au clavier. Emacs étant un
éditeur « orienté clavier », tout peut se faire au clavier. Mais cela
signifie aussi qu’il est important d’avoir des raccourcis pratiques.
</p><div class="Avertissement"><p>Cela ne signifie pas essayer de mettre <code>Ctrl-C</code> et <code>Ctrl-V</code> de
partout. Cela ne marchera pas comme vous voudrez. Emacs a ses
conventions et ses manières. Cette section vous apprend à ajouter
des commandes facilement accessibles par une combinaison de
touches ; elle n’est pas là pour vous inciter à faire de votre Emacs
un Notepad++ ou je ne sais quoi encore.
</p></div><h4>Notations des combinaisons dans Emacs
</h4><p>Si vous avez un minimum d’expérience sous Emacs, vous le savez déjà,
mais la notation des combinaisons de touches sous Emacs n’est pas la
même que sous d’autres environnements. Chaque touche modificatrice
(<code>Ctrl</code>, <code>Alt</code>, etc.) est représentée par une lettre et une
combinaison est notée <code>Mod-Reste</code> où <code>Mod</code> est la lettre correspondant
à la touche modificatrice et <code>Reste</code> est une combinaison.
</p><p>Les correspondances sont les suivantes :
</p><table><tr><td><code>Shift</code> </td><td><code>S</code>
</td></tr><tr><td><code>Ctrl</code> </td><td><code>C</code>
</td></tr><tr><td><code>Meta</code> (ou <code>Alt</code>) </td><td><code>M</code>
</td></tr></table><p>Par exemple, <code>C-a</code> est obtenu en maintenant <code>Ctrl</code> et en appuyant sur
<code>a</code>, et <code>C-M-f</code> est la combinaison de <code>Ctrl</code>, <code>Alt</code> et <code>f</code> sur un
clavier français usuel.
</p><h4>Combinaisons réservées
</h4><p>Emacs possède des conventions quant aux combinaisons que vous pouvez
utiliser et à celles qui sont réservées à différentes parties de
l’éditeur.
</p><p>Il vous faut simplement retenir que vous êtes autorisé à créer des
raccourcis débutant par <code>C-c</code> suivi d’une <em>lettre</em> pour vos besoins
personnels, en tant qu’utilisateur. Les autres combinaisons commençant
par <code>C-c</code> sont réservées aux modes majeurs et mineurs (ce n’est pas
important si vous ne savez pas bien ce que sont les uns et les autres)
et les autres espaces sont pris par Emacs lui-même ou des composants
spécialisés.
</p><h4>Fonctions, commandes et combinaisons
</h4><p>Pour pouvoir associer des commandes aux combinaisons de touches, il
faut d’une part savoir comment noter la combinaison et d’autre part
connaître la fonction à lui associer.
</p><p>Pour Emacs, chaque combinaison de touches invoque une <em>commande</em>
(encore appelée <em>fonction interactive</em>). Une commande est une
<em>fonction,</em> c’est-à-dire, dit simplement, une suite d’actions
à effectuer, soit écrite en Emacs Lisp, soit écrite en C et connue
nativement d’Emacs. Mais toutes les fonctions ne sont pas des
commandes. Il faut en effet qu’elles soient prévues pour être appelées
de manière interactive, par l’utilisateur. Toute fonction qui peut
être appelée <i>via</i> <code>M-x NOM-DE-LA-FONCTION</code> est une commande ; le but
de cette section est de vous permettre d’éviter d’avoir à taper le nom
de la commande à chaque fois, en lui associant un raccourci clavier.
</p><h4>La fonction <code>global-set-key</code>
</h4><p>C’est la fonction permettant d’attacher une combinaison de touches
à une commande, au niveau global, c’est-à-dire disponible partout
dans Emacs. La syntaxe est la suivante :
</p><pre><code>(global-set-key COMBINAISON COMMANDE)
</code></pre><p><code>COMBINAISON</code> est une séquence de touches. La manière la plus simple
de l’écrire est d’utiliser la fonction <code>kbd</code> comme ceci :
</p><pre><code>(kbd DESCRIPTION)
</code></pre><p><code>DESCRIPTION</code> est alors la description de touches telle qu’elle a été
présentée ci-dessus, entre guillemets droits. Par exemple :
</p><pre><code>(kbd "C-c g")
</code></pre><p>Le tout est à mettre à la place de <code>COMBINAISON</code>.
</p><p><code>COMMANDE</code> est, dans sa forme la plus simple, et la seule que nous
verrons dans cet article, le nom d’une fonction précédé d’une
apostrophe ; par exemple : <code>'replace-string</code>.
</p><p>Imaginons que vous vouliez attacher la commande <code>replace-string</code>
à la combinaison <code>C-c h</code>. Vous pourriez écrire la ligne suivante
dans le .emacs :
</p><pre><code>(global-set-key (kbd "C-c h") 'replace-string)
</code></pre><p>Dorénavant, lorsque vous rencontrerez une commande intéressante, sur
un wiki, un blog, ou dans le .emacs de quelqu’un d’autre, vous saurez
comment l’affecter aux touches de votre choix !
</p><p>Quelques commandes utiles qui ne demandent qu’à être affectées
</p><table><tr><td><b>Commande</b> </td><td><b>Description rapide</b>
</td></tr><tr><td><code>replace-string</code> </td><td>remplace un texte par un autre dans le <i>buffer</i>
</td></tr><tr><td><code>replace-regexp</code> </td><td>pareil que <code>replace-string</code> avec une <i>regexp</i>
</td></tr><tr><td><code>bury-buffer</code> </td><td>cycle parmi vos <i>buffers</i>
</td></tr><tr><td><code>kill-this-buffer</code> </td><td>détruit le <i>buffer</i> et ferme le fichier
</td></tr><tr><td><code>compile</code> </td><td>invoque make pour compiler vos fichiers sources
</td></tr><tr><td><code>gdb</code> </td><td>invoque gdb pour déboguer vos programmes
</td></tr></table><h3>Configurer Emacs pour programmer en C
</h3><p>Si vous avez lu et appliqué mes instructions jusqu’ici, votre Emacs
devrait être suffisamment configuré pour l’édition de fichiers de
texte. La plupart des utilisateurs d’Emacs le sont cependant pour
leurs besoins en matière de programmation. Aussi, cette avant-dernière
section adresse quelques points de configuration d’Emacs pour pouvoir
écrire du C dans de bonnes conditions.
</p><p>D’autres modes de langages de programmation ont des paramétrages
semblables, mais il n’y a pas de règle vraiment générale. Il vous
faudra lire les manuels correspondants.
</p><h4>Style d’indentation
</h4><p>L’une des fonctionnalités les plus appréciées d’Emacs est sa capacité
à indenter intelligemment le code selon le contexte. Le mode d’édition
du C, notamment, possède un indenteur relativement
performant. Cependant, par défaut, celui-ci suit les règles de
présentation du GNU. Si comme moi cela vous contrarie fortement, il
est aisé de changer de style. La variable <code>c-default-style</code> contient
le nom du style à utiliser, sous forme d’une chaîne de caractères
(entre guillemets). Les valeurs habituelles sont les suivantes :
</p><table><tr><td><code>"k&r"</code> </td><td>le style K&R, aussi appelé style kernel
</td></tr><tr><td><code>"bsd"</code> </td><td>le style Allman, aussi appelé style BSD
</td></tr><tr><td><code>"whitesmith"</code> </td><td>le style Whitesmiths
</td></tr><tr><td><code>"gnu"</code> </td><td>le style GNU, celui par défaut
</td></tr></table><p>Par exemple, si vous utilisez le style K&R, vous écrirez :
</p><pre><code>(setq c-default-style "k&r")
</code></pre><h4>Pas d’indentation, espaces et tabulations
</h4><p>En plus du style, il y a également une histoire de pas (ou largeur)
d’indentation. Par exemple, par défaut, Emacs indente vos blocs de 4,
en style K&R. Personnellement, j’utilise un pas de 8. Cela est obtenu
en changeant la valeur de la variable <code>c-basic-offset</code>. Pour moi :
</p><pre><code>(setq c-basic-offset 8)
</code></pre><p>De plus, la variable <code>indent-tabs-mode</code> contrôle l’usage des
tabulations pour l’indentation. C’est une variable booléenne. Une
valeur vraie (<code>t</code>) signifie que les tabulations seront utilisées dès
que possible tandis qu’une valeur fausse (<code>nil</code>) obligera Emacs
à n’utiliser que des espaces pour indenter. Par défaut, elle vaut
<code>t</code>. Je vous laisse deviner l’instruction à placer dans votre .emacs
si vous voulez des espaces !
</p><h4>Autres options
</h4><p>Le mode C étant l’un des plus populaires, il possède son lot de
paramètres intéressants ou obscurs que je vous laisse découvrir en
compagnie de la documentation. Vous pourriez vouloir personnaliser un
peu plus le style d’indentation en modifiant la variable
<code>c-offsets-alist</code>. Je ne détaillerai pas son fonctionnement ici, mais
n’hésitez pas à consulter <a class="extern" href="http://www.huoc.org/pub/index.html">mon .emacs</a> pour un petit
exemple.
</p><p>Avec tout cela, l’édition du code C devrait maintenant être tout
à fait satisfaisante. Ainsi, votre Emacs devrait maintenant être
relativement complet pour un début. Cet article s’achève ici et je
vous laisse comparer le résultat de votre apprentissage avec un
exemple de fichier <code>.emacs</code> écrit d’après ce tutoriel.
</p><h3>Exemple final d’un fichier <code>.emacs</code> basique
</h3><pre><code>;; Environnement
(set-language-environment "UTF-8")
(setq custom-file "~/.emacs-custom.el")
(load custom-file)
;; Affichage
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(column-number-mode t)
(setq truncate-partial-width-windows nil)
(setq ring-bell-function 'ignore)
(display-time-mode t)
;; Raccourcis
(global-set-key (kbd "C-c h") 'replace-string)
(global-set-key (kbd "C-c j") 'replace-regexp)
(global-set-key (kbd "C-c o") 'bury-buffer)
(global-set-key (kbd "C-c k") 'kill-this-buffer)
(global-set-key (kbd "C-c c") 'compile)
(global-set-key (kbd "C-c g") 'gdb)
</code></pre>