Tutoriel.org
Un court tutoriel pour Emacs
1 Historique
Emacs (initialement pour *Editing MACroS* running on TECO) fut créé par Richard M. Stallman (dit RMS) et Guy L. Steele en 1976. Il s’agissait alors d’une collection de macro-commandes pour simplifier l’utilisation de TECO (1964) qui était langage de programmation pour l’édition de fichier orienté ligne.
En 1983 RMS lance le projet GNU et l’une de ses premières tâches est de le doter d’un éditeur digne de ce nom. Profitant de son expérience et en s’inspirant de Gosling Emacs il crée GNU Emacs. Pour cela, il l’écrit en C et permet l’écriture d’extensions en Emacs Lisp. C’est probablement cette extensibilité qui fait que malgré son âge avancé, Emacs est l’un des outils les plus utilisés pour le développement.
2 Lancement d’Emacs
Pour lancer Emacs, il suffit de taper la commande
emacs
dans un terminal. Si le terminal ne permet pas l’ouverture de fenêtres
graphiques (pas de DISPLAY
), Emacs démarrera alors en mode texte. Si
on utilise l’option -nw
, pour no window, on force le lancement
d’Emacs en mode texte.
emacs -nw
Attention dans ce mode, pour quitter Emacs, il faut utiliser le
raccourcis clavier C-x C-c
(contrôle-x puis contrôle-c). Une
dernière option pratique est l’option -q
. Son effet est de lancer
Emacs sans utiliser la configuration locale.
emacs -q
3 Prise en main
La prise en main d’Emacs n’est pas difficile pour une utilisation basique. En mode graphique Emacs dispose de menus qui permettent d’accéder à toutes les opérations classiques. Néanmoins, pour l’utiliser plus efficacement, il convient de comprendre un peu son fonctionnement.
Comme on l’a dit, Emacs a vu le jour comme un ensemble de macros, c’est-à-dire des enchaînements de commandes simples ou d’autres macros. Ces macros (ou plus précisément ces fonctions) sont toujours un des piliers du fonctionnement d’Emacs. Le nombre de fonctions proposées par Emacs est très important et pour y accéder rapidement Emacs permet l’usage de raccourcis clavier. C’est en apprenant et en utilisant ces raccourcis qu’on gagne en productivité. L’utilisation de la souris avec Emacs est donc souvent contre productive. Enfin on peut facilement créer et enregistrer des enchaînements de commandes pour éviter les tâches répétitives.
Une première façon d’apprendre un peu Emacs est d’effectuer le
tutoriel intégré qu’il propose. Pour démarrer le tutoriel il suffit
de saisir le raccourcis C-h t
. Pour le novice, cela signifie qu’on
doit taper sur la touche contrôle (C
) et sur la touche h
simultanément, puis sur la touche t
seulement.
3.1 Interface
Globalement, l’interface d’Emacs est assez intuitive, mais elle a conservé tous les ingrédients qui en faisaient sa richesse alors que ce n’était pas une application graphique (la première version graphique de GNU Emacs est la 19, sortie en 1994). Certains de ses concepts ne sont donc pas si communs de nos jours.
3.1.1 Buffers
Un buffer est une zone tampon et la plus petite unité d’édition. Il correspond en général à la vue d’un fichier édité.
3.1.2 Windows
Il est possible de visualiser plusieurs buffers simultanément dans Emacs. Chaque vue est appelée fenêtre. Attention, dans le jargon Emacs, une fenêtre n’est pas à confondre avec les fenêtres gérées par le window-manager de l’interface graphique (voir figure fig:trois-windows, où un cadre Emacs est découpé en trois fenêtres). On peut afficher un même buffer dans différentes fenêtres et il peut être modifié dans n’importe laquelle de ses vues.
3.1.3 <sec:frames> Cadre (frames)
Lorsqu’il est exécuté en mode graphique, une même instance d’Emacs peut proposer plusieurs cadres (frames) d’affichage. Il s’agit en fait de plusieurs fenêtres du gestionnaire graphique.
Dans l’exemple de la figure fig:deux-frames, il s’agit bien de la même instance d’Emacs : on a lancé un seul exécutable, mais on a ouvert un cadre (frame) supplémentaire. Dans chacun des cadres, on affiche une vue d’un même buffer d’édition, c’est-à-dire que le même buffer peut être modifié par l’intermédiaire de l’un ou l’autre des cadres.
3.1.4 Modeline
Dans Emacs, chaque buffer est délimité en bas par la
modeline. Il s’agit d’une zone dans laquelle sont affichées divers
informations quant au mode de fonctionnement d’Emacs dans son
buffer. On la voit en action sur la figure fig:emacs-modeline, le
mode majeur est CMake
, le fichier édité s’appelle CMakeList.txt
,
enfin, on travaille sur la branche develop
.
3.1.5 Minibuffer
Le minibuffer est un buffer spécial d’Emacs. C’est la zone
d’interaction avec l’utilisateur. C’est là qu’on doit répondre aux
éventuelles questions d’Emacs et c’est là qu’on tape les commandes. Il
faut donc le garder constamment à l’oeil. Voir la
figure fig:emacs-minibuffer (ici une exécution de grep
dans Emacs en
préparation). Pour exécuter une commande dans le minibuffer il faut
taper M-x
.
3.2 Fonctions
Dans Emacs, tout est fonction. Et toute fonction peut-être surchargée localement (dans un buffer), une famille de buffers (un mode) ou globalement (dans tout Emacs).
Par exemple, presser une touche (quel que soit le contexte) déclenche l’appel d’une fonction et cette fonction dépend du contexte dans lequel la touche est pressée. C’est ce concepts qui fait d’Emacs un outil aussi puissant et versatile. Les fonctions peuvent être de deux types. Ce sont
- soit des fonctions internes (écrites en
C
), - soit des fonctions utilisateur écrites en
ELisp
.
Par le passé, ce deuxième type de fonctions pouvait dégrader les
performances d’Emacs (si bien que certains lui donnaient l’acronyme
récursif Emacs Makes All Computer Slow). Mais les gains de
performances des ordinateurs et l’utilisation d’ELips
byte-compilé
plutôt que simplement interprété ont corrigé ce défaut.
4 Quelques raccourcis
On présente dans cette partie certains raccourcis utiles. Lorsque les raccourcis de cette configuration diffèrent des raccourcis standard d’Emacs, on l’indique.
Mais rappelons tout d’abord les notations et principes.
-
C-a
signifie qu’on appuie simultanément sur les touchesCtrl
(contrôle) eta
. -
C-M-a
signifie qu’on appuie simultanément sur les touchesCtrl
,Meta
(Alt
sur les claviers modernes) eta
. -
C-S-a
signifie qu’on appuie simultanément sur les touchesCtrl
,Maj
eta
. -
C-a C-b c
signifie qu’on appuie simultanément sur les touchesCtrl
eta
, puis simultanément sur les touchesCtrl
etb
, puis sur la toucheb
.
On ne liste ici que quelques unes des commandes (et raccourcis), seulement une liste de celles qu’on juge importantes.
Noter que cette configuration utilise le mode which-key
, dont l’une
des fonctionnalités est de fournir une aide dans le minibuffer lors
de la saisie de commandes. Par exemple, si on tape C-x
, au bout d’un
instant which-key
affiche dans le minibuffer la liste des
commandes qui commencent par C-x
. C’est donc un excellent moyen de
retrouver les raccourcis et d’en apprendre de nouveaux. Cette aide est
évidemment contextuelle.
4.1 Commandes générales
Raccourci | Description |
---|---|
C-x C-c |
Sort d’Emacs |
C-g |
Interrompt la commande en cours |
C-S-g |
Force l’interruption de la commande |
M-x |
Lance une commande (dans le minibuffer) |
4.2 minibuffer
Lors d’une interaction avec le minibuffer, on a accès à certains raccourcis qui facilitent son utilisation.
Raccourci | Description |
---|---|
M-x |
Lance une interaction dans le minibuffer |
C-x ESC ESC |
Édite la dernière commande dans le minibuffer |
TAB |
Complète l’entrée autant que possible |
Cette configuration utilise swiper
, donc toutes les interactions
effectuées dans le minibuffer proposent la liste des commandes
disponibles qui correspondent à la chaîne entrée (SPC
faisant office
de n’importe quelle liste de caractères). Il est alors possible de
naviguer dans cette liste (en utilisant les flèches du clavier pas
exemple)
4.3 Obtenir de l’aide
On peut lancer l’aide en tapant C-h
et en suivant les indications du
minibuffer.
Raccourci | Description |
---|---|
C-h t |
Lance le tutoriel intégré |
C-h m |
Informations sur le mode courant |
C-h i |
Accède à la documentation (info ) |
C-h a |
à propos (interaction dans le minibuffer) |
4.4 Naviguer dans un buffer
Au delà des flèches et autres touches usuelles du clavier, Emacs propose d’autres moyens de se déplacer dans un buffer.
Raccourci | Description |
---|---|
C-b |
Recule d’un caractère |
C-f |
Avance d’un caractère |
M-b |
Recule d’un mot |
M-f |
Avance d’un mot |
C-p |
Ligne précédente |
C-n |
Ligne suivante |
C-a |
Début de ligne |
C-e |
Fin de ligne |
M-a |
Début de la phrase |
M-e |
Fin de la phrase |
M-m |
Début de l’indentation |
M-g g numéro
|
Positionne le curseur à la ligne numéro numéro |
Noter qu’on peut généralement utiliser des combinaisons de Ctrl
,
Meta
,… avec les touches de déplacement du clavier (comme les
flèches).
4.5 Marquer une zone d’un buffer
Une zone est délimitée par une une marque (position de départ) et la position courante du curseur Créer une zone consiste donc à poser une marque, puis à déplacer le curseur pour la délimiter. Tous les caractères compris entre ces deux positions font partie de la zone.
Raccourci | Description |
---|---|
C-SPC ou C-@
|
Pose une marque |
C-g |
Supprime la marque |
C-x C-x |
Inverse la marque et le curseur |
C-= |
Sélectionne un mot ou étend la sélection |
Noter qu’un enchaînement de C-=
permet d’étendre rapidement la zone
aux entités faisant sens. En effet, C-=
s’arrête aux guillemets
encadrant une chaîne de caractères, aux paramètres ou au corps d’une
fonction par exemple, ce qui permet de facilement les sélectionner.
4.6 Éditer le contenu d’un buffer
Le commandes citées ici concernent essentiellement les modes d’édition classiques. Il est possible que pour certains modes les raccourcis ne fonctionnent pas ou n’aient simplement pas de sens. Dans ces modes d’édition classiques (modes de saisie par exemple), le clavier fonctionne normalement. On précise simplement ici quelques commandes usuelles.
L’action des commandes d’édition décrites ci-dessous est effectuée relativement à la position courante du curseur.
Raccourci | Description |
---|---|
DEL |
Efface un caractère vers la gauche |
C-d ou SUPR
|
Efface le caractère sous le curseur |
DEL ou SUPR
|
Efface une zone sélectionnée |
C-DEL , M-DEL ou C-w
|
Coupe le mot vers la gauche |
M-d |
Coupe le mot vers la droite |
M-0 C-k |
Coupe jusqu’au début de la ligne |
C-k |
Coupe jusqu’à la fin de la ligne |
C-w |
Coupe une zone sélectionnée |
M-w |
Copie une zone sélectionnée |
M-z caractère
|
Coupe jusqu’au prochain caractère caractère |
C-_ ou C-/ ou C-x u
|
Annule la dernière saisie/commande |
Noter qu’avec cette configuration d’Emacs, si le caractère à effacer est un blanc, tous les blancs suivants dans la direction d’effacement sont supprimés.
Puisqu’on vient d’aborder comment copier ou couper une zone du
texte, nous allons décrire le coller. Là encore, le vocable Emacs
n’est pas standard. L’action couper dans Emacs se nomme /kill/ et
coller, /yank/. On comprend ainsi mieux les choix de lettres k
et y
dans ce contexte.
Raccourci | Description |
---|---|
C-y |
Colle la dernière sélection copiée |
M-y |
Remplace le texte collé par la copie précédente |
En fait, Emacs conserve toutes les copies en mémoire (kill-ring) et
on peut donc les utiliser à tout moment. Dans sa version de base,
parcourir le kill-ring nécessite d’abord un coller. C’est-à-dire
qu’il faut effectuer C-y
and de taper M-y
pour le parcourir.
Cette configuration d’Emacs utilise swiper
et le parcours du
kill-ring est amélioré. En effet, swiper
propose l’utilisation
directe de M-y
et plutôt que de remplacer le texte en ligne comme
le fait la version de base, on y accède dans le minibuffer. On peut
alors le parcourir, soit en continuant à presser M-y
, soit en
utilisant les flèches du clavier, soit même en entrant les une partie
du texte comme pour les recherches.
4.7 Gestion des buffers, fenêtres et cadres
4.7.1 buffers
Dans cette configuration, on utilise le paquet IBuffer
à la place du
mode Buffer
classique. Il fonctionne avec les mêmes raccourcis
de base.
Raccourci | Description |
---|---|
C-x b |
Choisit un autre buffer |
C-x C-b |
Ouvre le mode IBuffer
|
C-x k |
Choisit un buffer à fermer |
C-x k RET |
Ferme le buffer courant |
Lorsqu’on ferme un buffer, si les données n’ont pas été sauvegardées Emacs invite l’utilisateur à le faire.
4.7.2 Fenêtres
Raccourci | Description |
---|---|
C-x 1 |
Agrandit la fenêtre pour qu’elle occupe tout le cadre |
C-x 2 |
Découpe la fenêtre courante horizontalement |
C-x 3 |
Découpe la fenêtre courante verticalement |
C-x 0 |
Ferme la fenêtre courante |
C-x o |
Positionne le curseur dans une autre fenêtre |
Pour la gestion des fenêtres, on utilise le mode ace-window
qui
ajoute la fonctionnalité suivante. Si plus de deux fenêtres sont
actives dans le cadre courant, C-x o
affiche alors des numéros dans
chacune des fenêtres. On entre ce numéro pour basculer dans la fenêtre
choisie.
4.7.3 Cadres (frames)
Raccourci | Description |
---|---|
C-x 5 0 |
Ferme le actif cadre |
C-x 5 1 |
Ferme tous les autres cadres |
C-x 5 2 |
Crée un nouveau cadre |
4.8 Fichiers
Raccourci | Description |
---|---|
C-x C-f |
Recherche incrémentale d’un fichier ou le crée |
C-x C-s |
Sauvegarde le buffer courant |
C-x s |
Sauvegarde tous les buffers |
C-x C-w |
Sauvegarde le buffer courant dans un nouveau fichier |
C-x i |
Insère le contenu d’un fichier dans le buffer |
Ouverture de fichiers/répertoirs distants.
À noter que cette configuration d’Emacs utilise le mode TRAMP
pour
(Transparent Remote Access, Multiple Protocols) qui permet
l’ouverture de fichiers à distance depuis Emacs.
Pour que l’édition distante fonctionne, il suffit que la connexion par
ssh
soit autorisée.
L’intérêt de ce mode est évident puisqu’on n’a pas besoin de
réinstaller l’environnement Emacs sur cette nouvelle machine, pour
travailler dans son environnement usuel. Il suffit de pouvoir s’y
connecter par ssh
.
Pour ouvrir un fichier distant, il suffit d’utiliser le raccourci
C-x C-f
, puis d’écrire dans le minibuffer
/sshx:username@hostname:
À partir de là, si on presse RET
, Emacs ouvrira un dired
buffer
(c’est à dire un buffer permettant de manipuler les fichiers du
répertoire HOME
de l’utilisateur sur la machine distante. On peut
aussi utiliser TAB
pour voir alors la liste des fichiers accessibles
dans le minibuffer, la complétion fonctionnant comme en local.
Une fois un fichier ouvert, il est manipulé classiquement dans le buffer et seule la sauvegarde du fichier nécessite la connexion.
4.9 Recherche
Raccourci | Description |
---|---|
C-s |
Recherche une chaîne dans le buffer vers le bas |
C-r |
Recherche une chaîne dans le buffer vers le haut |
C-S-s C-w |
Complète la chaîne à chercher avec le mot courant |
C-M-s |
Recherche une expression régulière vers le bas |
C-M-r |
Recherche une expression régulière vers le haut |
Une fois une occurrence trouvée, on peut poursuivre la recherche vers
le bas ou vers le haut, en faisant respectivement C-s
ou
C-r
. Puisqu’on utilise pas le mode standard de recherche d’Emacs,
mais le mode swiper
, il est possible de naviguer dans le
minibuffer avec les flèches pour se déplacer d’une occurrence à
l’autre.
Quand la recherche est terminée,
- soit on utilise
C-g
pour revenir où on était quand on a commencé la recherche, - soit
RET
pour continuer l’édition du buffer à la position de l’occurrence.
Une autre particularité intéressante de swiper
est son utilisation
de SPC
qui sert de joker pendant les saisies. Voir par exemple, la
figure fig:recherche-swiper, où on a lancé une recherche puis tapé
y t x(
dans le minibuffer, les lignes correspondantes y sont
affichées. On peut parcourir cette liste à l’aide des flèches du
clavier, le buffer de recherche suit l’occurrence sélectionnée.
Attention si on utilise C-S-s C-w
, on n’utilise pas swiper
pour la
recherche, mais l’outil recherche incrémentale classique d’Emacs. Il
est possible d’ajouter des mots à la recherche en faisant à nouveau
C-w
.
4.10 Remplacement de texte
Raccourci | Description |
---|---|
M-% |
Remplacer les occurrences d’une chaîne par une autre |
La recherche des chaînes à remplacer se déroule depuis la position du curseur vers la fin du buffer.
Il s’agit d’un mode interactif. Pour chaque occurrence de la chaîne à remplacer, Emacs attend une validation.
- Pour remplacer l’occurrence trouvée, taper
y
. - Pour ne pas la remplacer, presser
n
. - Pour interrompre le processus de remplacement, taper
q
ouC-g
. - Pour tout remplacer, jusqu’à la fin du buffer, taper
!
.
Noter que le mode de remplacement est intelligent au sens où il respecte la case si possible.
Si on demande le remplacement de foo
par bar
on obtient les
résultats suivants.
Chaîne initiale | Résultat |
---|---|
foobar |
barbar |
barfooFoobar |
barbarBarbar |
Foobar |
Barbar |
FOO |
BAR |