# Emacs avancé

# Aller plus loin avec GNU Emacs

Cette page contient une collection d'astuces pour l'utilisateur déjà rompu à GNU Emacs. Si vous êtes débutant et souhaitez vous initier à Emacs, allez plutôt voir le tutorial de tuteurs.

## Abréviations

### Principe

Vous connaissez déjà la commande `M-/` qui permet de compléter un mot en cours de frappe (sinon, voir le tutorial. Dans le même genre, emacs gère les abréviations.

Le mode mineur « abbreviation » vous permet, comme son nom l'indique, de définir des abréviations qu'emacs se chargera de développer au cours de l'édition du fichier. Par exemple, vous pouvez définir l'abréviation ENS qui se développera en « École Normale supérieure. »

Essayons un peu. Tapez `M-x abbrev-mode` pour basculer dans le mode « abbreviation » (Cf. la mode line). Tapez ensuite l'abréviation de votre choix (pour des raisons évidentes, ne choisissez pas un mot existant). Si vous souhaitez des abréviations locales (limitées au mode dans lequel vous vous trouvez), tapez ensuite `C-x ail`. Pour les abréviations globales (qui s'appliquent à tous les modes), c'est `C-x aig`. Tapez ensuite la version développée, puis appuyez sur `ENTER`. Dorénavant, dans cette session, à chaque fois que vous taperez « ENS », emacs développera en « École Normale supérieure. »

Pour sortir du mode abréviation, tapez `M-x kill-all-abbrevs`.

### Correction d'orthographe à la volée

On peut s'en servir pour faire comme dans MS Word et définir une liste de mots sur lesquels on fait tout le temps des coquilles. Genre « teh » pour « the » ou « poru » pour « pour ». Il suffit de dire à Emacs que ce sont des abréviations pour qu'il les remplace au vol par le mot orthographié correctement.

Commençons par indiquer à emacs que l'on souhaite utiliser le mode abréviation par défaut, que l'on a un fichier d'abréviations qui s'appelle `~/.abrev` et que l'on souhaite sauvegarder ce fichier à chaque fois. D'abord, on crée le fichier `.abrev`, vide pour l'instant.

    clipper ~ $ touch .abrev

Puis on indique dans son `.emacs` :

    (setq-default abbrev-mode t)
    (read-abbrev-file "~/.abrev")
    (setq save-abbrevs t)

Quittez puis relancez emacs tout seul, « Abbrev » figurera dans la mode line. Suivez la procédure décrite ci-dessus : on tape l'abréviation, puis `C-x aig` ou `C-x ail`, l'abréviation développée, puis `Enter`. Répétez l'opération autant de fois que souhaité pour constituer votre liste d'abréviations. Ensuite, on sauvegarde cette liste : `M-x write abbrev-file` puis `Enter`. Emacs vous demande alors le nom de votre fichier, tapez donc `~/.abrev` puis `Enter`.

Par la suite, pour ajouter de nouvelles abréviations, contentez-vous de les définir comme indiqué ci-dessus, emacs vous demandera si vous voulez sauvegarder votre fichier d'abréviations. Il suffira de répondre oui.

Pour effacer une abréviation, tapez `M-x edit-abbrevs` qui lance l'éditeur d'abréviations (pour simplement voir la liste, c'est `M-x list-abbrevs`). Ladite liste ressemble à ceci :

    (global-abbrev-table)

    "gwb"          1    "George W. Bush"
    "usa"	       1    "États-Unis"
    "pour"	       1    "pour"

Entre parenthèses, emacs vous dit qu'il s'agit d'abréviations globales (si elles avaient été locales, vous auriez vu `(text-mode-abbrev-table)`, ou `(fundamental-mode-abbrev-table)`, etc.). La colonne de gauche affiche les abréviations proprement dites, la seconde colonne est la cuisine interne d'emacs, la colonne de droite contient les abréviations développées. Pour effacer une abréviation, utiliser une commande standard pour effacer la ligne en question, `C-k` par exemple, puis sauvegardez.

Attention, n'essayez pas d'ajouter à la main de nouvelles lignes à la liste. Effacer est la seule opération sûre.

## Bookmarks

Vous connaissez les bookmarks (alias « signets » pour Netscape ou « favoris » pour Internet Explorer) dans un navigateur. Eh bien dans emacs, il y en a aussi. Ils jouent très exactement le rôle de marque-pages : vous pouvez ainsi retrouver exactement l'endroit où vous en étiez d'une session à l'autre.

Commande | Commande complète | Action
--- | --- | ---
C-x r m `Enter` | _ | Pose un bookmark à l'endroit où se trouve le point
C-x r m <nom> `Enter` | M-x bookmark-set | Pose un bookmark et lui donne un nom
_ | M-x bookmark-delete <nom> | Détruit le bookmark <nom>
C-x r b <nom> | M-x bookmark-jump | Aller au bookmark <nom>
C-x r l | M-x bookmark-list | Lister tous les bookmarks
_ | M-x bookmark-file | Sauve les bookmarks

## Histoires de répertoires (Dired)

Emacs vous permet d'agir sur vos répertoires : regarder le contenu d'un répertoire, effacer des fichiers, les renommer, les copier, etc. Bref, tout ce que vous faites d'ordinaire avec les commandes `cp`, `rm` ou encore `mv` sous UNIX. Tout cela, grâce à Dired (DIRectory EDitor)...

Commençons par demander à Emacs de lire un répertoire. Par exemple, le répertoire `armoire/` de tuteurs.

    clipper ~ $ emacs ~tuteurs/armoire

On obtient alors le résultat suivant, similaire à ce que vous aurait donné un `ls -la` sur le même répertoire :

      /users/staffs/tuteurs/armoire:
      used 8 available 222601
      drwxr-xr-x   3 tuteurs       512 Jan  8 02:30 .
      drwxr-xr-x  30 tuteurs      2560 Apr  1 20:06 ..
      drwxr-xr-x   2 tuteurs       512 Jan  8 02:32 affiche
      -rw-r--r--   1 tuteurs      1334 Oct 14  2002 inventaire.txt
      -rw-r--r--   1 tuteurs       954 Nov 14 11:24 livres.txt

Vous pouvez vous déplacer dans Dired à l'aide de la touche `n`, de la barre d'espace ou encore de `C-n`. Pour éditer un fichier, appuyez sur `e`. Pour simplement jeter un coup d'œil au fichier, `v` demande à emacs d'afficher le fichier dans un buffer en lecture seule appelé « View ». On quitte ce buffer avec un simple `q`.

Avant toutes choses, attention : dans Dired, vous travaillez directement sur vos fichiers, pas par l'intermédiaire d'un buffer. Quand vous effacez un fichier, c'est définitif.

Autre remarque : si vous modifiez le contenu de votre directoire en dehors de Dired (par exemple, en suspendant emacs pour revenir au shell), il faudra relancer Dired pour prendre en compte les modifications du disque (`C-x C-f <répertoire>`).

### Effacer un fichier

Le mécanisme est identique que celui pour effacer un buffer dans la liste des buffers (`C-x C-b`). Placez votre curseur sur la bonne ligne puis tapez sur `d`. Un « D » apparaît alors sur la ligne, tout à gauche :

      /users/staffs/tuteurs/armoire:
      used 8 available 222601
      drwxr-xr-x   3 tuteurs       512 Jan  8 02:30 .
      drwxr-xr-x  30 tuteurs      2560 Apr  1 20:06 ..
    D drwxr-xr-x   2 tuteurs       512 Jan  8 02:32 affiche
      -rw-r--r--   1 tuteurs      1334 Oct 14  2002 inventaire.txt
    D -rw-r--r--   1 tuteurs       954 Nov 14 11:24 livres.txt

Pour aller plus rapidement, `#` marque comme à effacer tous les fichiers d'auto-save (ceux dont le nom commence et finit par des #, précisément) et `~`, tous les fichiers de backup (dont le nom finit en ~). Pour enlever la marque d'effacement d'un fichier, appuyez sur `u` (comme « undelete »).

Quand vous avez fini, et que vous souhaitez vraiment détruire les fichiers, tapez `x`. Emacs vous demandera de confirmer la destruction des fichiers marqués.

### Copier et renommer

Pour copier, tapez `C` (ou `M-x dired-do-copy`) sur le fichier à copier. Emacs vous demande alors le nom du nouveau fichier. Pour renommer, même principe en tapant `R` (ou `M-x dired-do-move`).

### Récapitulons

Dired vous permet de faire quasiment toutes les opérations sur fichier ou répertoire que les commandes UNIX standard. Le tableau suivant récapitule des points déjà expliqués et vous présente d'autres possibilités.

Commande | Nom complet | Action | Équivalent UNIX
--- | --- | --- | ---
e | _ | Éditer le fichier | emacs
R | M-x dired-do-rename | Renommer le fichier | cp
C | M-x dired-do-copy | Renommer le fichier | mv
d | M-x dired-do-delete | Marquer pour l'effacement | rm
~ | _ | Marquer pour l'effacement tous les fichiers de backup | rm *~
# | _ | Marquer pour l'effacement tous les fichiers d'autosave | rm *#
u | _ | Enlever la marque d'effacement | _
+ | M-x dired-create-directory | Créer un répertoire | mkdir
M | M-x dired-do-chmod | Changer les droits d'accès | chmod
G | M-x dired-do-chgrp | Changer le groupe | chgrp
O | M-x dired-do-chown | Changer le propriétaire du fichier | chown
S | M-x dired-do-symlink | Faire un lien symbolique | ln -s
H | M-x dired-do-hardlink | Faire un lien dur | ln
Z | M-x dired-do-compress | Compresse un fichier (avec gunzip) | gzip

## Lire les pages de man

Vous pouvez également lire des pages de man directement dans emacs, grâce à la commande `M-x man`. Appuyez sur `Enter`, puis emacs vous demandera quelle page de man vous souhaitez lire. Par défaut, il s'agit du mot sur lequel est placé votre curseur. Vous pouvez également spécifier la section dans laquelle se trouve la page recherchée. Par exemple, vous recherchez la page de man du test, célèbre distraction normalienne, qui se trouve dans la section I :

    Manual entry: test I

Ce qui vous donne :

    Misc. Manual Pages                                        TEST(I)

    NAME
         test - distraction normalienne

    DESCRIPTION
         Le  test est une distraction spécifiquement normalienne.  Le
         test consiste à dire ou faire quelque chose avec l'intention
         de  tirer  de  son  interlocuteur  une réaction précise.  Si
         cette réaction se produit effectivement, on  dira  « test »,
    --11:%%-F1  *Man test I* { page 1 of 1}     (Man)--L1--Top---------------------

Il est plus facile de lire une page de man dans emacs qu'en invoquant la commande `man` dans le shell. Seul inconvénient : vous ne pouvez pas interrompre emacs pendant qu'il est en train de mouliner à la recherche de la page de man demandée, pas même avec `C-g`...

## Utiliser des time stamps

Ce qu'on appelle time stamp ici, c'est la date précise d'un événement. Emacs permet d'insérer automatiquement des time stamps, typiquement pour indiquer la date de dernière modification d'un fichier.

Par exemple, pour insérer automatiquement la date à chaque sauvegarde du fichier, commencez par écrire dans votre `.emacs` :

    (add-hook 'write-file-hooks 'time-stamp)

Ensuite, dans votre fichier, indiquez dans les 8 premières lignes :

    Time-stamp: <>

Lors de votre prochaine sauvegarde, emacs indiquera la date entre les <> :

    Time-stamp: <2003-07-27 22:18:53 monlogin>

Comme vous le voyez, par défaut la date est indiquée au format année-mois-jour, suivie de votre login. À chaque fois que vous sauvegarderez ce fichier, emacs mettra à jour la date.

## Emacs comme shell de login

Non, je rigole...

Auteur : Marie-Lan Nguyen.