Cet article est publié sous licence CC BY-NC-SA
Il y a quelques jours, j’ai fait une présentation en interne de l’éditeur de texte que j’utilise au quotidien. Faisant quasiment tout dans Emacs, mes collègues souhaitaient découvrir cet outil.
La présentation semble avoir été réellement appréciée, des installations d’Emacs s’en sont même suivies !
J’ai donc décidé de regrouper les informations distillées pendant cette présentation pour en faire un article et vous en faire profiter.
Emacs est un éditeur libre et gratuit, extensible, paramétrable et bien plus encore. Emacs est auto-documenté, tout ce que vous pouvez faire dans Emacs possède une documentation, chaque variable, chaque fonction, chaque raccourci de déplacement. Si vous vous posez une question sur un raccourci clavier, il possède de la documentation directement depuis l’éditeur.
Emacs possède un tutoriel qui vous permettra de mettre le pied à
l’étrier. Il vous explique son fonctionnement tout en vous faisant
parcourir et éditer un fichier texte. Il est accessible via C-h t
.
Emacs est capable d’accomplir toutes les tâches que vous pouvez vouloir faire avec un éditeur moderne : linting, détection de code smell, correction orthographique, compilation, recherches avancées, macros, fenêtrage, …
Une fois Emacs lancé, quelqu’un qui le maitrise peut quasiment passer sa journée sans en sortir et y effectuer toutes ses tâches.
Emacs est une valeur sûre, il existe depuis 30 ans, il est maintenu par une communauté active et n’est pas prêt de disparaitre. En capitalisant dessus, vous vous assurez que vous pourrez encore vous en servir dans 20 ans tout en conservant vos habitudes.
Parcourir et éditer des fichiers est un élément central de notre travail, il n’est donc pas du tout aberrant de mettre plusieurs mois à maîtriser parfaitement son outil si on peut s’en servir pendant les 20 prochaines années pour gagner du temps au quotidien.
C’est bien tout ça, mais qu’est qu’on peut faire avec ? La liste est longue à vrai dire puisqu’on peut pratiquement tout faire depuis Emacs :
Pourquoi sous OS X ? Parce que c’est l’OS que j’utilise tout simplement et que je peux donc en parler en connaissance de cause. Pour les autres systèmes, votre gestionnaire de paquets vous offre sans aucun doute un paquet adapté.
Pour avoir un Emacs pleinement fonctionnel et bien intégré sous OS X, voici la meilleure façon de l’installer :
$ brew install emacs --with-cocoa --with-dbus --with-imagemagick --with-librsvg --with-mailutils
$ brew install gnutls
$ brew install aspell --with-lang-fr --with-lang-en
Vous aurez donc un Emacs avec le support de Cocoa et notamment de l’affichage / traitement des images directement dans l’éditeur.
On installe ensuite gnutls pour pouvoir contacter des hôtes distants en HTTPS, puis Aspell afin d’avoir de la correction orthographique pour le français et l’anglais.
Rien de bien particulier à ceci près que vous pouvez lancer Emacs en mode démon ce qui accélère le temps de chargement des autres clients que vous lancerez par la suite et que ça leur permettra de communiquer entre eux (partage de configuration, de buffers, etc).
En ce qui me concerne, le démon se lance au démarrage de ma session et j’utilise ensuite le client pour lancer Emacs soit dans le terminal :
$ emacsclient -t
Soit en mode GUI :
$ emacsclient -c
Il peut donc être intéressant de créer quelques alias pour vous faciliter la vie :
alias e=emacsclient -t
alias ec=emacsclient -c
Les utilisateurs aguerris ont tendance à configurer leur Emacs de A à
Z en Elisp dans leur fichier .emacs.d/init.el
. C’est le chemin le
plus difficile quand on débute puisqu’il faut découvrir les modes /
packages qui nous intéressent puis les paramétrer pour qu’ils collent
à nos préférences en définissant des variables, en appelant des
fonctions, etc. C’est le meilleur moyen d’avoir un Emacs aux petits
oignons mais que je déconseille aux débutants puisque ça peut vite
devenir décourageant / chronophage. Seuls les plus motivés passeront
par là.
Une solution intermédiaire est de passer par l’outil de configuration intégré / graphique de configuration. Tous les paquets / modes peuvent être configurés via un outil qui présente toutes les options disponibles, leur fonction ainsi que les valeurs possibles. Pour accéder à cet outil, il suffit de faire un :
M-x customize
M
correspond à la touche meta qui par défaut est Alt
, perso je l’ai
rebindé sur Cmd
parce que j’ai besoin de mon Alt
pour entrer des
caractères spéciaux.
Une fois cette commande lancée, un buffer vient présenter les différentes sections disponibles, on peut naviguer au clavier ou encore à la souris (sik). Chaque section présentera des sous-sections plus spécifiques jusqu’à arriver aux variables de configuration à proprement parler.
Je vous laisse découvrir, vous pouvez y passer la journée si vous voulez faire le tour. Absolument tout est configurable, de l’apparence, à la gestion des tabulations, de l’ajout de retour à la ligne en fin de fichier, la complétion, les réglages par langage, etc.
Si vous voulez rapidement avoir un environnement «prêt à l’emploi» qui même s’il ne vous convient pas à 100% vous permettra d’avoir un setup assez bien pensé pour pouvoir travailler sans avoir à vous poser trop de questions, vous pouvez utiliser une des deux distributions phares.
La première, Prelude, respecte l’esprit originel d’Emacs, il va simplement charger les paquets indispensables et les configurer au mieux pour une utilisation standard. C’est la distribution que je conseille aux nouveaux venus sous Emacs qui n’ont pas fait un crochet par Vim avant.
Par défaut tous les modules disponibles (langages, completion, etc), ne sont pas activés. Il vous faut les dé-commenter selon vos besoins.
Vous pouvez consulter la liste des raccourcis clavier ajoutés par Prelude.
Comme toujours avec Emacs, si quelque chose ne vous convient pas, vous pouvez le modifier dans votre fichier de configuration pour l’adapter à vos besoins.
La deuxième, Spacemacs, est elle un
remaniement assez radical de la façon dont fonctionne Emacs. Emacs
devient modal et utilise l’édition à la Vim (99% de ce qui est
utilisable dans Vim le devient dans Emacs). Le lancement des commandes
est lui aussi revu. Plus question de passer par des raccourcis du type
C-x r l
ou M-x calendar
. Tout se passe en mode normal grâce au
leader space, la touche espace, qui permet de passer en mode commande
et qui classe les différentes possibilités sous des raccourcis
mnémoniques. C’est la distribution que je recommande aux débutants
sous Emacs qui viennent de Vim. Ils ne seront pas perdu pour
l’édition.
Vous pouvez lire la documentation condensée qui résume bien l’esprit et les buts de cette distribution.
L’activation ou non de fonctionnalités se fait par la notion de
layers
. Un layer va activer un ensemble de fonctionnalités pour un
besoin précis (un langage, la complétion, une application comme IRC,
le pair-programming). Vous pouvez consulter
la
liste des layers disponibles directement sur le site.
Cette distribution peut-être installée en deux versions, une complète avec la majorité des layers déjà activés ou une version dite de base qui n’installera que le minimum vital, laissant à votre charge d’activer les layers que vous voulez utiliser. Je recommande de commencer par la version complète pour débuter quitte à faire marche arrière ensuite pour alléger votre setup.
Spacemacs, par sa nature est plus difficile à faire évoluer selon vos
besoin. Il faut créer des layers en
respectant
certaines conventions mais
aussi il faudra remapper tous les raccourcis clavier du mode que vous
ajoutez si vous voulez qu’ils soient disponibles via le space leader
sinon vous vous retrouverez à avoir un mix de space leader et de
commandes plus classiques à la C-x C-c t
.
Ce n’est pas insurmontable mais la création de votre premier layer vous demandera un peu de temps.
Pour finir, notez qu’il est tout à fait possible d’avoir un Emacs classique avec de l’édition modale à la Vim. Pour cela, il suffit d’installer / activer le mode Evil. Ce mode à lui seul ajoute l’édition modale avec la prise en charge de la quasi totalité du vocabulaire Vim. Vous aurez donc un Emacs classique, avec ses raccourcis classiques mais de l’édition modale.
Emacs est livré de base avec un gestionnaire de paquets qui permet de voir ce qui est disponible, de filtrer sur des mots-clés, d’installer et mettre à jour des paquets.
Si vous estimez qu’il vous manque quelque chose, une application, une fonctionnalité d’édition, c’est le premier endroit où regarder. Quelqu’un a sûrement déjà eu le même besoin que vous et aura créé un paquet. Voyons comment faire. Les commandes listées ci dessous sont destinées à un Emacs classique (non Spacemacs).
La première chose à faire est d’ajouter une des sources majeure de
paquets à votre configuration, étape inutile si vous utilisez Prelude
ou Spacemacs qui l’aura déjà fait pour vous. Si ce n’est pas le cas,
ouvrez votre fichier .emacs.d/init.el
:
C-x C-f ~/.emacs.d/init.el RET
et ajoutez :
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
(package-initialize)
qui aura pour effet d’ajouter la sources MELPA à vos sources de paquets.
Vous pouvez ensuite recharger votre configuration avec :
M-x eval-buffer
qui va lire le code elisp du buffer actuel et l’exécuter.
On peut maintenant lister les paquets avec M-x
package-list-packages
. La liste est longue, on peut donc la filtrer
avec f
suivie de mots-clés, ruby
par exemple ce qui aura pour
effet de restreindre la liste aux paquets qui contiennent ce terme
dans leur nom ou leur description.
Si vous trouvez un paquet qui vous intéresse, vous pouvez le marquer
pour installation avec i
, vous pouvez répéter l’opération pour
d’autres paquets. Une fois terminé, x
exécutera réellement les
actions. Vos nouveaux paquets sont disponibles à l’usage.
Si vous voulez plus d’informations sur un paquet, positionnez vous sur
sa ligne et tapez ?
.
Pour sortir du gestionnaire de paquet, il suffit de presser q
.
La plupart des paquets lorsqu’ils sont installés fonctionneront sans
plus de configuration, mais tous peuvent prendre des options de
configuration qui permettront de personnaliser leur fonctionnement. On
peut retrouver ses options dans l’outil de configuration (M-x
customize
ou M-x customize-group le_nom_du_paquet
).
Voyons maintenant les commandes les plus utiles, ce sont des commandes natives mais qui pour la plupart peuvent être améliorée par l’utilisation d’un paquet, notamment Helm qui ajoutera des possibilités de complétion évoluées sur de nombreuses commandes.
Sachez qu’il est toujours possible d’interrompre une commande avec
C-g
, si par exemple vous avez commencé un mauvais raccourci clavier.
Je ne parlerai ici que des raccourcis d’origine d’Emacs, pas de ceux
de Spacemacs. Pour ceux qui utilisent Spacemacs, la documentation du
site reprend la plupart des raccourcis clavier mnémoniques. Aussi le
mode mineur which-key
est activé, dès lors que vous aurez tapé
espace, une liste des raccourcis possibles sera affichée. Pour les
déplacement dans le buffer, vous pouvez vous référer
au Vim Cheat Sheet. Si vous connaissez Vim
vous savez déjà vous déplacer dans les buffers sous Spacemacs.
Ouvrir ou créer un fichier : C-x C-f le_chemin
À noter qu’avec Helm ou même Ido d’activé, on peut passer des chemins
partiel pour rechercher un fichier, des regexp, ajouter un ~
en fin
de ligne pour revenir au home, /ssh:
pour ouvrir des fichier
distants, …
Une fois un fichier ouvert, on peut évidemment se déplacer avec les flèches mais également utiliser des raccourcis clavier :
Se déplacer
avant | arrière | |
---|---|---|
caractère | C-f | C-b |
mot | M-f | M-b |
ligne | C-n | C-p |
écran | C-v | M-v |
Tous les mouvements peuvent être précédés par un argument numérique
qui représente le nombre de fois à exécuter la commande. Disons que je
fasse C-12 M-f
alors j’avancerais de 12 mots.
Les arguments numériques sont très utiles et souvent utilisés, de ce fait il existe plusieurs façon de les déclarer :
C-u 12
C-1 C-2
M-1 M-2
Aller à
début de | fin de | |
---|---|---|
ligne | C-a | C-e |
phrase | M-a | M-e |
paragraphe | M-{ | M-} |
buffer | C-< | M-> |
On constate que pour toutes les commandes les mouvements effectués via
control
ne dépendent pas du contexte (caractères, lignes) alors que
les mouvements utilisant meta
sont eux dépendants du contexte (mot,
phrase, paragraphe). Elles dépendent donc du mode majeur dans lequel
vous vous trouvez.
D’autres raccourcis qui dépendent du mode majeur activé sont :
C-M-{f,b}
: s-exp (avant / arrière par expression)C-M-{d,u}
: haut / bas par voisinNotez qu’il est possible d’utiliser M
avec les flèches. M-→
et
M-←
font respectivement avancer ou reculer le curseur d’un
mot. M-↑
et M-↓
fera remonter / descendre le paragraphe courant
s’il est en mode texte.
On peut déplacer le curseur au milieu de la frame, puis en haut, puis
en bas en répétant M-r
. On peut également déplacer la ligne courante (là où
le curseur est positionné) au milieu de la frame, en haut puis en bas
en répétant C-l
.
On peut aussi scroller page par page, vers le bas avec C-v
et
vers le haut avec M-v
.
Pour se rendre à une ligne donnée M-g M-g
puis le numéro de la
ligne. Pour se rendre à une colonne donnée, on utilisera M-g tab
L’autre méthode de déplacement que j’utilise souvent et qui s’avère très efficace est la recherche incrémentale. Au fur et à mesure de la recherche, les occurrences s’affichent en sur-brillance et on peut se déplacer de l’une à l’autre.
Pour démarrer une recherche incrémentale, on utilise C-s
puis on
tape du texte. La répétition de C-s
aura pour effet de passer à
l’occurrence suivante jusqu’à la fin du buffer. Si on essaie à
nouveau, Emacs nous demandera si on veut repartir au début du buffer.
Si on arrête notre recherche (avec C-g
ou RET
), il nous est
possible de la relancer avec C-s C-s
.
Pour une recherche dans le sens inverse, on utilisera C-r
. Notez que
ces recherches sont des recherches exactes du texte entré. Si vous
voulez rechercher par regexp c’est possible grâce à C-M-s
.
Pour une aide ultra complète sur les recherches incrémentales, je vous
conseille l’aide en ligne via C-s C-h C-h m
.
Sans nécessiter l’installation de paquet supplémentaire (et il en existe des tas pour optimiser vos déplacements), il reste encore deux fonctionnalités qui vous permettront de vous déplacer plus vite.
Il y a tout d’abord le mark ring. Chaque déplacement ou action
significative dans le buffer crée l’ajoute d’une marque dans le mark
ring qui est donc en quelque sorte un historique circulaire des
déplacements dans le buffer. Il est possible de déplacer dans le temps
en remontant de marques en marques. Avec l’habitude cette
fonctionnalité est très pratique et permet de largement améliorer sa
vitesse de navigation. Pour sauter de marques en marques il suffit
d’utiliser C-u C-space
. Il est également possible de poser une
marque de manière explicite grâce au raccourci C-SPC C-SPC
.
L’autre technique consiste a utiliser des registres nommés. Il est possible d’enregistrer dans Emacs des positions de curseur ou des régions dans des registres. Chaque registre a un nom composé d’une seule lettre (minuscule ou majuscule) ou un chiffre.
Pour copier une région dans un registre, on utilisera le raccourci
C-x r s A
où A
est la lettre représentant le registre.
Pour insérer le texte d’une région préalablement sauvegardée dans un
registre, on utilisera C-x r i A
où A
est toujours le caractère
représentant le registre à utiliser.
Pour sauvegarder la position du curseur dans un registre on passera
par C-x r SPC A
où A
est le caractère représentant le registre.
Pour y retourner on utilisera C-x r j A
.
Vous pouvez également rechercher et remplacer du texte. En faisant
M-%
on vous demande le terme de recherche puis un terme de
remplacement. Une fois la recherche lancée, chaque occurrence est
passée en revue et on vous demande si vous voulez (y) ou non (n)
remplacer l’occurrence courante. Il est également possible de dire que
vous voulez remplacer toutes les occurrences sans plus de validation
(!).
Le remplacement est assez intelligent pour détecter la casse de l’occurrence courante, Si l’occurrence commence par une majuscule, le remplacement vous proposera la version capitalisée de votre terme de remplacement.
Le kill-ring est une sorte de mémoire des choses qui sont copiées, coupées ou supprimées qu’il est possible de rappeler quand bon nous semble pour récupérer un des éléments supprimé plus tôt et s’en servir.
Tout d’abord comment “killer” des éléments ?
Voici quelques raccourcis :
C-k
: supprime depuis le curseur jusqu’à la fin de la ligneM-d
: supprime le mot derrière le curseurM-k
: supprime depuis le curseur jusqu’à la fin de la phraseC-del
: supprime le mot avant le curseurS-C-del
: supprime toute la ligneFaites quelques essais puis tapez C-y
, vous verrez que le dernier
éléments qui avait été supprimé vient d’être inséré. Vous pouvez aussi
faire M-y
pour parcourir la liste de tout ce qui se trouve dans le
kill-ring pour l’insérer à la position du curseur.
On l’a déjà mentionné mais M-x
permet de lancer une commande. Il y
en a des centaines disponibles, il est donc impossible de faire la
liste mais on peut par exemple faire M-x calendar
, M-x calc
, M-x
browse-web
, M-x revert-buffer
.
Quelques modes livrés de base avec Emacs :
Permet d’afficher une liste des déclarations du buffer courant (méthodes, classes, sections en markdown, etc) et de s’y déplacer rapidement:
Commande: C-x c i
Permet de poser un marque page sur n’importe quel buffer (fichier, répertoire, fichier distant, mail, recherche web, …) et d’y retourner facilement. Contrairement aux registres, les bookmarks sont des références persistante qu’on peut donc réutiliser d’une session à l’autre.
Commandes :
C-x r m
Ajoute un bookmark à la position du curseurC-x r b
Saute à un bookmarkC-x r l
Liste l’ensemble des bookmarksPour naviguer dans un répertoire et y effectuer des opérations comme le renommage, la copie, la création de sous-répertoire, …
Dans ce mode on peut activer la fonction édition qui transforme la liste des fichiers en un simple buffer éditable, dès qu’on quittera le mode, les modifications seront effectuées.
Commandes :
C-x d
Ouvre le minibuffer pour demander quel répertoire ouvrir,
par défaut le répertoire du buffer courant est sélectionnéC-x j
Ouvre dired dans le répertoire courant avec le curseur
positionné sur la ligne correspondant au fichier courantPour avoir de l’aide sur un raccourci clavier, une fonction, une variable ou encore tout ce qui pourrait correspondre au terme de recherche.
Commandes :
C-h k
Obtenir de l’aide sur un raccourci donnéC-h f
Obtenir de l’aide sur une fonction donnéeC-h v
Obtenir de l’aide sur une variable donnéeC-h a
Obtenir de l’aide à propos d’un sujetC-h o
Obtenir de l’aide à propos d’un symboleEmacs intègre un gestionnaire de fenêtre qui permet de splitter horizontalement ou verticalement une frame, de ne garder ou ne fermer que la courante. On peut également ouvrir de nouvelles frames ou les fermer.
Commandes :
C-x 2
Split horizontalC-x 3
Split verticalC-x 1
Ne garder que la fenêtre couranteC-x 0
Fermer la fenêtre couranteC-x o
Basculer d’une fenêtre à l’autreÀ associer avec windmove
pour faciliter le déplacement entre fenêtre
via S-fleche
.
Elle permettent de sélectionner une région dans le buffer pour y faire quelque chose (supprimer, remplacer, indenter, …).
Commandes :
C-space
sélection manuelleC-x h
buffer completM-h
paragraphe courantPermet de sélectionner une région rectangulaire pour la supprimer, y ajouter du texte identique sur chaque ligne, etc.
Explications et raccourcis clavier
Sert à automatiser des tâches répétitives comme “Aller au bout de la ligne, supprimer les 2 derniers caractères, ajouter une virgule”
Commandes :
F3
pour démarrer la macroF4
pour stopper la macroF4
pour la jouerM5-F4
pour la jouer 5 foisM0-F4
pour la jouer jusqu’à ce qu’une erreur se produiseEmacs embarque une interface normalisée pour la gestion des outils de versionnement, que le projet utilise Git, Mercurial, Bazar ou encore SVN, une interface toujours identique est disponible pour gérer le versionnement (ajout de fichier, commits, logs, …).
Commande : C-x v
Flycheck est un mode mineur pour effectuer du linting automatique sur votre code avec mise en évidence des erreurs et raccourcis pour les parcourir.
En Ruby par exemple on aura les alertes de l’interpréteur Ruby plus ceux de Rubocop s’il est installé. Survoler une erreur donnera son détail, on peut même demander à Rubocop de les corriger pour nous.
Une fois ce mode actif, les erreurs orthographiques seront mises en évidence et peuvent même être corrigées automatiquement. Ce mode peut s’activer sur tout le buffer, pour un mail ou un article de blog par exemple mais ne s’appliquer que sur les commentaires en mode programmation.
Flyspell peut être configuré pour qu’il fasse en sorte d’utiliser une langue différente en fonction du contexte.
Sans aucun doute l’un des modes les plus emblématique d’Emacs. Org mode permet de faire de la publication, de gérer son planning, sa todo list, de faire du GTD, du Pomodoro, de filtrer les éléments en fonction de tags, du statut, d’afficher les événements à venir dans un agenda, d’exporter son contenu vers de nombreux formats et bien d’autres choses encore.
C’est un mode à propos du quel il faut absolument se documenter et tester, n’importe quel utilisateur d’Emacs y trouvera un intérêt.
Ce mode mineur permet de couper automatiquement les lignes à un nombre de caractères donnés. Il est paramétrable par mode.
Il existe aussi de très nombreuses extensions qu’on peut installer, en voici quelques unes que j’utilise :
Ajoute la notion de projet à Emacs, par exemple ouvrir un fichier qui est versionné avec Git créera un projet Projectile, il est ensuite possible de ne naviguer que dans les fichiers de ce projets, faire des recherches ou remplacement en son sein, lancer l’outil de versionnement, tuer tous les buffers relatifs à ce projet, naviguer dans les buffers relatifs au projets, passer à un autre projet, …
C’est une version améliorée de l’outil de versionnement et dédiée à la gestion des projets géré avec Git. Ce package met à votre disposition toutes les commandes possibles et imaginables de Git de façon très compréhensible et s’intègre parfaitement avec l’éditeur. Un must-have.
C’est un outil de collection de snippets pour s’épargner de la frappe sur des constructions récurrentes (comme un if / else / end) par exemple.
C’est un outil d’assistance pour Ruby qui utilise son REPL avec le code de votre app pour pouvoir fournir des informations à propos des ses classes et modules et qui permet de savoir où chaque méthode est définie.
Ses fonctionnalités sont :
Permet de faire de la recherche ultra rapide dans tous les fichiers d’un projet par exemple.
Ajoute de la complétion sur à peu près toutes les commandes.
Permet de gérer des terminaux multiples dans Emacs simplement, ça permet aussi d’avoir un raccourci pour avoir un petit terminal affichable / masquable en un raccourci dans un buffer donné.
Détection ou sélection d’une version de Ruby dans Emacs.
Gestion intelligente des paires (parenthèses, guillemets, crochets,…).
Permet d’avoir un affichage graphique de l’arbre des changements du buffer courant et de revenir en arrière dans les modifications en sautant d’une branche à l’autre. Chaque modification peut être accompagnée de son diff et de l’heure où elle a eu lieu.
Permet d’organiser la configuration de son .init.el
plus efficacement,
il va également télécharger automatiquement les paquets manquants et
faire du lazy loading pour améliorer les temps de chargement. Si vous
pensez créer votre propre configuration maison, il faut l’utiliser
plutôt que d’avoir à gérer tous les détails à la main.
C’est un mode mineur qui affiche les raccourcis claviers disponibles quand on a commencé à en entrer un et qu’on ne le termine pas. Pratique pour découvrir les raccourcis des différents modes ou quand on a un trou de mémoire.
L’équipe Synbioz.
Libres d’être ensemble.
Nos conseils et ressources pour vos développements produit.