#+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