Configurer Emacs

Temps de lecture : 6 minutes

Configurer Emacs pour coder en python3 comme sur un IDE spécialisé nécessite de mettre en place une configuration.

Sans aucune configuration, Emacs est capable de reconnaître un script python, il permet d'écrire du code indenté correctement comme tout éditeur de texte. Avoir un IDE python nécessite quelques efforts supplémentaires.

Cet article parle d'un un work in progress et d'autres articles viendront compléter celui-ci sur ce sujet.

Avant-propos

Quelques raccourcis à connaître

  • C-g : permet d'annuler une action : indispensable, c'est LE raccourcis à connaitre;
  • C-x C-f : cherche un fichier / un répertoire et l'affiche dans un buffer. Si c'est un fichier qui n'existe pas alors emacs ouvre un buffer vide portant le nom du fichier;
  • C-x k : ferme un buffer (kill), demande une confirmation qu'il suffit de valider par un appui la touche Entrée;
  • C-x C-s : sauvegarde du fichier en cours d'édition;
  • C-x C-w : enregistre sous un autre nom et ce dernier devient le nouveau fichier en cours d'édition;
  • C-x C-c : fermer Emacs;
  • M-! : ouvre une ligne de commande;
  • M-x : permet de saisir une commande en tapant les première lettres puis complétion avec la touche TAB;
  • C-h : affiche l'aide globale d'Emacs;
  • C-h m : affiche l'aide sur le mode en cours d'utilisation;
  • M-g g : aller à la ligne, très pratique;
  • F11 : activation / désactivation du mode plein écran.

C : touche Clrl ; M : touche Alt

Création du fichier ~/.emacs.d/init.el

Si ce fichier n'est pas créé au préalable alors Emacs sauvegardera sa configuration dans un fichier .emacs (option par défaut).

Ouvrir Emacs et créer le fichier init.el : C-x C-f ~/.emacs.d/init.el. Enregister-le sans rien y écrire C-x C-s et fermer-le C-x k.

Désormais, emacs écrira sa configuration dans ce fichier plutôt que dans un fichier .emacs.

Est-ce utile ? Cela permet d'avoir la totalité de la configuration d'Emacs à l'intérieur du répertoire .emacs.d/. Plus facile à manipuler qu'un répertoire .emacs.d/ + un fichier .emacs.

Dans la suite, je ne parle que du fichier ~/.emacs.d/init.el abrégé en init.el mais si vous utilisez un fichier ~/.emacs, c'est exactement la même chose.

Configuration par le menu Options

Un premier lieu pour configurer emacs est le menu Options.

Choix du thème

Menu : Option -> Customize Emacs -> Custom Themes

Choisir un thème (par exemple wheatgrass : un thème sombre dans les tons vert/bleu/marron).

Ensuite, cliquer sur le bouton Save Theme Settings pour sauvegarder la configuration.

Select more than one theme at a time : si la case est cochée alors plusieurs thèmes peuvent être utilisés en même temps (je n'ai jamais testé).

Dans le fichier init.el, tout à la fin, la configuration issu de l'interface emacs se retrouve après la ligne (custom-set-variables.

Pour comprendre certains réglages : t = True et nil = False pour le langage LISP qui sert à coder emacs.

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.

 '(cua-mode t nil (cua-base))
=> Utiliser C-x, C-c, C-v et C-z : pour couper, copier, coller et annuler comme dans la plupart des éditeurs actuels (cocher Use CUA keys)

 '(custom-enabled-themes (quote (wheatgrass)))
=> Mise en place du thème sombre wheatgrass

 '(display-time-mode t)
=> afficher l'heure dans la barre d'état (show/hide et cocher Time, load ansd mail).

 '(fill-column 110)
=> passer la ligne à 110 caractères.

 '(global-display-line-numbers-mode t)
=> toujours afficher les numéros de ligne

 '(package-selected-packages
   (quote
    (frame-mode markdown-preview-eww pyenv-mode lsp-mode json-mode eglot jedi elpy anaconda-mode auto-complete-rst flycheck-pycheckers python-mode magithub magit python projectile pipenv exec-path-from-shell markdown-mode)))
=> les packages installés via Manage Emacs Packages

 '(python-shell-interpreter "python3")
=> l'interpréteur python par défaut est python3

 '(show-paren-mode t)
=> Affiche en surbrillance la parenthèse (crochet ou accolade) complémentaire (cocher Highlight Matching Parenthesis) 

 '(size-indication-mode t)
=> indique la taille du fichier dans la barre d'état (ex. 2.6k)

 '(tool-bar-mode nil))
=> ne pas afficher la barre d'outils (show/hide, Toolbar et fixer la valeur à None).

(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(default ((t (:family "DejaVu Sans Mono" :foundry "PfEd" :slant normal :weight normal :height 120 :width normal)))))
=> Réglage de la police par défaut via Set default Font - 120 correspond à 12pt.

Dans le menu Options : Save Option permet d'écrire les modifications dans le fichier init.el ou .emacs.

Ajouter le mode markdown et le dépôt MELPA

Voir cet article : Dompter Emacs #5 installer Markdown et grammalecte avec MELPA

Quelques ajouts manuels dans le fichier init.el

;; C-a marks the whole buffer
(global-set-key (kbd "C-a") 'mark-whole-buffer)

=> Définit le raccourcis Ctrl-a pour tout sélectionner.

;; Open .init.el with C-x c
(defun dotemacs ()
  (interactive)
  (switch-to-buffer (find-file-noselect "~/.emacs.d/init.el")))
(global-set-key (kbd "C-x c") 'dotemacs)

=> Une petite fonction pour charger le fichier init.el à l'aide du racourcis ctrl+x c

;; flycheck mode
(global-flycheck-mode 1)
(with-eval-after-load 'flycheck
  (add-hook 'flycheck-mode-hook #'flycheck-pycheckers-setup))

=> Configuration de flycheck pour analyser le code à la volée si le mode le permet.

Transformer emacs en IDE python

Par défaut, le mode python (python-mode) est accessible directement dans Emacs ainsi que des réglages.

Options->Customize Emacs->Browse Customization Groups

Group Programming -> Group Languages -> Group Python -> Option Python Shell Interpreter

J'ai défini python3 sous Debian Buster car par défaut, c'est python2 qui est lancé.
On peut être plus précis, tout dépend de ce qu'il y a dans votre /usr/bin.

olivier@lmde:~$ ls /usr/bin | grep python
dh_python2
dh_python3
python
python2
python2.7
python2.7-config
python2-config
python3
python3.7
python3.7-config
python3.7m
python3.7m-config
python3-config
python3m
python3m-config
python-config
x86_64-linux-gnu-python2.7-config
x86_64-linux-gnu-python2-config
x86_64-linux-gnu-python3.7-config
x86_64-linux-gnu-python3.7m-config
x86_64-linux-gnu-python3-config
x86_64-linux-gnu-python3m-config
x86_64-linux-gnu-python-config

Ne pas oublier de cliquer sur le bouton apply and save pour sauvegarder les réglages.

Je peux de nouveau travailler uniquement en python3 dans mon éditeur.

Quelques packages de plus pour un premier IDE python

Un certain nombre de packages ont été ajouté conformément à l'article :

https://www.emacswiki.org/emacs/PythonProgrammingInEmacs

Avec le réglage du PATH de l'article (Problème de PATH) et le réglage flycheck mode dans init.el, j'ai désormais un début d'IDE avec un contrôle du code au fur et à mesure de son écriture. Les warnings de pylint sont rendus en orange et les erreurs apparaissent en rouge.

Créer une commande exécuter un script python

La commande C-c C-p : ouvre un shell python interactif en python2 sous Debian buster, python3 sous Archlinux (on peut le régler aussi en ipython).

Exécuter la commande C-c C-c pour exécuter le script python. Cela fonctionne mais pas toujours. par exemple, un programme qui utilise pygame sera lancé mais pas affiché.

Une solution rapide et sale : j'ai créé une macro clavier Emacs pour lancer le fichier principal de l'application puis j'ai lié cette macro à la touche F9..

;; run odysseus program
(fset 'run-odysseus
      [?\M-! ?p ?y ?t ?h ?o ?n kp-3 ?  ?o ?d tab return])

(global-set-key (kbd "<f9>") 'run-odysseus)

Pour fonctionner, la macro doit être lancé à partir du répertoire contenant le fichier principal du programme (ici odysseus.py). Par contre, le fichier n'a pas à être ouvert.

Enregistrer une macro clavier

F3, faire la combinaison de touches voulue et terminer l'enregistrement par F4. attention : cela n'enregistre que les touches, pas les mouvements / clics de souris.

Sauvegarder la macro dans init.el

  • Donner un nom à la macro à l'aide de la commande M-x name-last-kbd-macro
  • Ouvrir le fichier de configuration init.el et positionner le curseur à l'endroit où la macro sera écrite.
  • Taper la commande : M-x insert-kbd-macro
  • Pour en savoir plus : https://www.emacswiki.org/emacs/KeyboardMacros

Naviguer dans les def et class d'un fichier

;; add imenu index
(global-set-key (kbd "<f5>") 'imenu-add-menubar-index)

imenu est un mode mineur d'emacs. Il permet d'ajouter un index sur un fichier source qui permet de naviguer avec les noms de classes et fonctions (def).
J'ai vu plusieurs façons de l'utiliser, notamment de l'automatiser mais ce n'est pas encore fonctionnel chez moi. J'ai donc lié la fonction ajoute un index imenu à la barre de menu à la touche F5. il faut une seconde environ pour que le menu soit créé, le temps qu'il analyse le code source.

Pas super confortable mais rapidmeent mis en oeuvre.

Ressources

Je suis entrain de faire une configuration personnelle en partant de mes problèmes à résoudre dans le cadre du développement de mon application odysseus. Des besoins qui sont spécifiques.

J'ai lu bon nombre de pages sur internet pour trouver des solutions à mes besoins, en voici un échantillon :

Et il y en a encore beaucoup d'autres, d'aussi bonne qualité...

Bonus

Lancer emacs à partir d'un terminal de plusieurs façons :

  • emacs : lance emacs de la même manière que la commande du menu
  • emacs -q : lance emacs sans lire la configuration locale et affiche la page d'accueil par défaut.
  • emacs -Q : lance emacs sans lire la configuration locale et n'affiche pas la page d'accueil par défaut.
  • emacs -nw : lance emacs directement dans le terminal, à vous les joies d'emacs uniquement au clavier sans environnement graphique.