#+title: Emacs Configuration #+PROPERTY: header-args :tangle init.el Les sections suivantes décrivent une configuration moderne et modulaire d'Emacs, adaptée aussi bien à un usage mobile que desktop, avec des raccourcis inspirés de Doom/SpaceMax et une expérience de complétion fluide et contextuelle. * Interface minimale et UTF-8 Une interface épurée pour se concentrer sur l'essentiel. #+begin_src emacs-lisp (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) (setq inhibit-startup-message t) (prefer-coding-system 'utf-8) #+end_src * Sauvegardes centralisées Tous les fichiers de sauvegarde sont regroupés dans un même dossier. #+begin_src emacs-lisp (setq backup-directory-alist `(("." . "~/.emacs-saves"))) (setq auto-save-file-name-transforms `((".*" "~/.emacs-saves/" t))) (make-directory "~/.emacs-saves" t) #+end_src * Complétion moderne Cette section active une suite d’outils de complétion efficaces et modulaires : - *Vertico* : interface minimale pour la complétion dans le minibuffer - *Orderless* : permet une complétion dans n’importe quel ordre - *Marginalia* : affiche des annotations contextuelles dans les listes de complétion - *Consult* : utilitaires pour la navigation et la recherche - *Corfu* : complétion inline (dans le buffer courant) - *Cape* : ajoute des sources à la complétion comme les fichiers, symboles, etc. #+begin_src emacs-lisp (use-package vertico :init (vertico-mode)) (use-package orderless :custom (completion-styles '(orderless))) (use-package marginalia :init (marginalia-mode)) (use-package consult :bind (("C-s" . consult-line) ("C-x b" . consult-buffer) ("M-g g" . consult-goto-line) ("M-g i" . consult-imenu))) (use-package corfu :custom (corfu-auto t) (corfu-cycle t) :init (global-corfu-mode)) (use-package cape :init (add-to-list 'completion-at-point-functions #'cape-file) (add-to-list 'completion-at-point-functions #'cape-dabbrev) (add-to-list 'completion-at-point-functions #'cape-symbol)) #+end_src * Programmation Lisp Utilisation de *SLY* avec Roswell pour interagir avec Common Lisp. #+begin_src emacs-lisp (setq inferior-lisp-program "ros run") (use-package sly :init (setq sly-lisp-implementations '((roswell ("ros" "run")))) :config (setq sly-symbol-completion-mode t)) #+end_src * Support LSP avec Eglot Active *Eglot* pour plusieurs langages (C, C++, Python…) afin d'obtenir la complétion, la navigation et la documentation. #+begin_src emacs-lisp (use-package eglot :hook ((python-mode . eglot-ensure) (c-mode . eglot-ensure) (c++-mode . eglot-ensure))) #+end_src * Ergonomie et raccourcis - *Which-key* : aide à la découverte des raccourcis - *Evil* : navigation façon Vim - *General* : création de raccourcis cohérents autour de la touche SPC #+begin_src emacs-lisp (use-package which-key :init (which-key-mode)) (use-package evil :init (evil-mode 1)) (use-package general :config (general-create-definer my/leader-keys :keymaps '(normal insert visual emacs) :prefix "SPC" :global-prefix "C-SPC") (my/leader-keys "f" '(:ignore t :which-key "fichier") "f f" '(find-file :which-key "ouvrir fichier") "f s" '(save-buffer :which-key "sauver") "b" '(:ignore t :which-key "buffer") "b b" '(consult-buffer :which-key "changer buffer") "w" '(:ignore t :which-key "fenêtres") "w v" '(split-window-right :which-key "split vertical") "w s" '(split-window-below :which-key "split horizontal") "w d" '(delete-window :which-key "fermer fenêtre") "h" '(:ignore t :which-key "aide") "h f" '(describe-function :which-key "fonction") "h v" '(describe-variable :which-key "variable") "h k" '(describe-key :which-key "touche") "p" '(:ignore t :which-key "projet") "p p" '(projectile-switch-project :which-key "changer projet") "d" '(:ignore t :which-key "Dired") "d d" '(dirvish :which-key "ouvrir Dired") "g" '(:ignore t :which-key "Magit") "g g" '(magit-status :which-key "status git"))) #+end_src * Gestion de projets Avec *Projectile*, navigation rapide entre projets, fichiers, buffers, etc. #+begin_src emacs-lisp (use-package projectile :diminish projectile-mode :config (projectile-mode) :custom ((projectile-completion-system 'default)) :bind-keymap ("C-c p" . projectile-command-map) :init (when (file-directory-p "~/projects") (setq projectile-project-search-path '("~/projects"))) (setq projectile-switch-project-action #'projectile-dired)) #+end_src * Gestionnaire de fichiers *Dirvish* est une surcouche moderne à Dired avec une interface à la Ranger. #+begin_src emacs-lisp (use-package dirvish :init (dirvish-override-dired-mode)) #+end_src * Thème et bascule jour/nuit Utilise *solarized-theme*, avec une fonction de bascule entre clair et sombre (F6). #+begin_src emacs-lisp (use-package solarized-theme) (load-theme 'solarized-light t) (defun toggle-solarized-theme () (interactive) (let ((current (car custom-enabled-themes))) (mapc #'disable-theme custom-enabled-themes) (load-theme (if (eq current 'solarized-light) 'solarized-dark 'solarized-light) t))) (global-set-key (kbd "<f6>") #'toggle-solarized-theme) #+end_src * Workspaces persistants Avec *Perspective*, on peut retrouver les fenêtres et buffers tels qu’on les avait laissés à la fermeture d’Emacs. #+begin_src emacs-lisp (use-package perspective :custom (persp-mode-prefix-key (kbd "C-c M-p")) :init (persp-mode) :config (setq persp-state-default-file "~/.emacs.d/perspectives") (add-hook 'kill-emacs-hook #'persp-state-save)) #+end_src * Auto-Tangle des fichiers Org Active automatiquement le tangle (extraction du code) pour les fichiers contenant ~#+auto_tangle: t~. #+begin_src emacs-lisp (use-package org-auto-tangle :hook (org-mode . org-auto-tangle-mode)) #+end_src * Chargement terminé #+begin_src emacs-lisp (message "✅ Emacs avec complétion moderne, workspaces, Solarized et raccourcis SPC") #+end_src