Ours & Hippy — le blog Ours & Hippy ourshippy@huoc.org tag:blog.huoc.org,2009:atom 2010-02-20T10:02:19+01:00 tag:blog.huoc.org,2009:posts/8 xmlgrep by examples: playing with Atom 2009-06-17T14:23:11+02:00 2009-06-22T14:30:22+02:00 Nhat 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 &quot;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.&quot; Step by step, you should notice that <code>a[b]</code> is read &quot;a such that b&quot;, <code>|</code> stands for &quot;or&quot;, <code>/</code> for &quot;child of&quot;, <code>@</code> for &quot;attribute&quot;, <code>.</code> for &quot;text&quot;, 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/.~&quot;post-1939&quot;]#' atom.xml </code></pre>Or, select a post by title and view its contents using w3m: <pre><code>$ xmlgrep -x 'entry[title/.~&quot;device drivers&quot;]/content/.' atom.xml | &gt; sed -e 's/&amp;lt;/&lt;/g' -e 's/&amp;gt;/&gt;/g' -e 's/&amp;amp;/\&amp;/g' | &gt; 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[.~&quot;^2009-03&quot;]%%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&gt;=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:00 2010-02-20T10:02:19+01:00 Nhat 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 «&#xA0;tabulation&#xA0;» 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,&#xA0;etc.) et le <em>style</em> sélectionné (par exemple, K&amp;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>&#xA0; </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,&#xA0;etc. Il est donc primordial de contrôler ces changements sous forme de <em>versions.</em> Des logiciels spécialisés appelés «&#xA0;systèmes de contrôle de versions&#xA0;» (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 «&#xA0;peut-être&#xA0;» a su se transformer en «&#xA0;non&#xA0;». :) </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:00 2010-02-20T10:02:19+01:00 Nhat 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&#xA0;21, puis suis passé à Emacs&#xA0;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&#xA0;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>,&#xA0;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 («&#xA0;binaire&#xA0;») 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 &quot;NOM&quot;) </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>&quot;UTF-8&quot;</code> si vous souhaitez avoir un environnement utilisant principalement l’UTF-8, ou <code>&quot;Latin-1&quot;</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 &quot;NOM-DU-FICHIER&quot;) </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 &quot;~/.emacs-custom.el&quot;) </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 &quot;~/.emacs-custom.el&quot;) </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 &quot;UTF-8&quot;) (setq custom-file &quot;~/.emacs-custom.el&quot;) (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&#xA0;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, «&#xA0;face&#xA0;» 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 «&#xA0;vrai&#xA0;» en termes booléens) à <code>nil</code> (qui signifie «&#xA0;faux&#xA0;»). </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 «&#xA0;bip&#xA0;») 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 «&#xA0;orienté clavier&#xA0;», 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>,&#xA0;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 &quot;C-c g&quot;) </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 &quot;C-c h&quot;) '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>&quot;k&amp;r&quot;</code> </td><td>le style K&amp;R, aussi appelé style kernel </td></tr><tr><td><code>&quot;bsd&quot;</code> </td><td>le style Allman, aussi appelé style BSD </td></tr><tr><td><code>&quot;whitesmith&quot;</code> </td><td>le style Whitesmiths </td></tr><tr><td><code>&quot;gnu&quot;</code> </td><td>le style GNU, celui par défaut </td></tr></table><p>Par exemple, si vous utilisez le style K&amp;R, vous écrirez : </p><pre><code>(setq c-default-style &quot;k&amp;r&quot;) </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&amp;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 &quot;UTF-8&quot;) (setq custom-file &quot;~/.emacs-custom.el&quot;) (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 &quot;C-c h&quot;) 'replace-string) (global-set-key (kbd &quot;C-c j&quot;) 'replace-regexp) (global-set-key (kbd &quot;C-c o&quot;) 'bury-buffer) (global-set-key (kbd &quot;C-c k&quot;) 'kill-this-buffer) (global-set-key (kbd &quot;C-c c&quot;) 'compile) (global-set-key (kbd &quot;C-c g&quot;) 'gdb) </code></pre>