;;; -*- lexical-binding: t -*- ;;; init.el --- Initialization file for Emacs ;;; Commentary: Emacs Startup File --- initialization for Emacs (require 'package) (require 'use-package) ;;; On définit ici les langues avec lesquelles on souhaite travailler. ;;; On associe le code langue (détecté par guess-language) au dictionnaire ;;; à utiliser et au nom de la langue. ;;; Mettez en premier la langue que vous souhaitez être par défaut si ;;; l'auto détection échoue. (setq my/langues '( (fr . ("french" "Français")) (en . ("english" "English")) ) ) ;;; Langues pour le traducteur. (setq my/langues-traduction '(fr en)) ;;; Fonction qui vérifie qu'une erreur est de type Aspell. (defun my/is-aspell-error (err) "Retourne vrai si l'erreur est de type Aspell" (string-match-p "aspell" (symbol-name (flycheck-error-checker err)))) (defun my/is-aspell-error-at-pos (pos) "Retourne vrai si l'erreur a la position est de type Aspell" (let* ( ;; Lit les erreurs Flycheck au point. (errors (flycheck-overlay-errors-at pos)) ;; Regarder si c'est une erreur Aspell d'après le nom du vérificateur ;; ayant rapporté l'erreur. (aspell-error (seq-find #'my/is-aspell-error errors))) aspell-error)) ;;; Fonction qui regarde l'erreur située sous le clic souris. ;;; Si c'est une erreur Grammalecte, elle appelle la fonction de ;;; correction Flycheck-grammalecte qui affiche une popup. ;;; Si c'est une erreur Aspell, idem, mais en appelant la fonction ;;; de correction Flyspell en popup. (defun my/correct-at-click (event) "Corrige l'erreur Flycheck au clic" ;; Fonction qui peut être affectée aux clics et qui prend l'événement ;; souris en paramètre. (interactive "e") (save-excursion ; Restaurer la position du point (Le curseur texte.) à la fin. (mouse-set-point event) ; On déplace le point sous le clic souris. (if (my/is-aspell-error-at-pos (point)) ;; Si c'est une erreur Aspell, afficher le popup Flyspell. (call-interactively 'flyspell-correct-word) ;; Si c'est une erreur Grammalecte, appeller sa fonction de correction ;; avec popup. (call-interactively 'flycheck-grammalecte-correct-error-at-click)))) ;;; Cette fonction fonctionne comme la précédente, mais directement utilisable ;;; avec un raccourci clavier. (defun my/correct-at-point (pos) "Corrige l'erreur Flycheck au point" (interactive "d") (if (my/is-aspell-error-at-pos pos) ;; Pour Aspell, appeler la fonction flyspell-correct configurée, ;; typiquement pour choisir le mot correct dans une liste textuelle. (call-interactively 'flyspell-correct-wrapper) ;; Sinon, utiliser la correction Grammalecte. Elle effectue la correction ;; proposée directement. (call-interactively 'flycheck-grammalecte-correct-error-at-point))) ;;; Cette fonction détecte la langue du tampon (defun my/set-buffer-dictionary () "Detecte la langue du tampin et renseigne le dictionnaire ispell local." (interactive) (unless ispell-local-dictionary (let ((lang (guess-language-buffer))) (when lang (ispell-change-dictionary (cadr (assoc lang guess-language-langcodes))) )))) ;;; =========================================================================== ;;; Configuration Flycheck ;;; ;;; Flycheck est un paquet qui souligne les mots rapportés en erreur par ses ;;; "checkers". ;;; =========================================================================== (use-package flycheck :ensure t :init (global-flycheck-mode) :config ;; Si on n'est pas en mode graphique, changer la couleur des mots plutôt ;; que les souligner (ce qui ne fonctionne pas toujours suivant les polices ;; de caractères). (unless (display-graphic-p) (set-face-attribute 'flycheck-error nil :underline nil :background "red" :foreground "white") (set-face-attribute 'flycheck-warning nil :underline nil :background "yellow" :foreground "black")) ;; CTRL C -> correction Aspell ou Grammalecte en utilisant la fonction ;; définie plus haut. :bind (:map flycheck-mode-map ("C-;" . my/correct-at-point)) ) ;;; =========================================================================== ;;; Configuration Flyspell (correction orthographique) ;;; Ce paquet propose des mots possibles quand l'utilisateur choisit d'en ;;; corriger un. ;;; =========================================================================== (use-package flyspell :ensure t :hook ((text-mode . flyspell-mode) (prog-mode . flyspell-prog-mode)) :custom (ispell-program-name "aspell") (ispell-dictionary (cadar my/langues)) ;; Neutraliser le raccourci clavier "C-;" installé par Flyspell. :bind (:map flyspell-mode-map ("C-;" . nil)) ) ;;; Le paquet flyspell-correct est une couche d'abstraction permettant ;;; d'utiliser des correcteurs différents. Par exemple un correcteur via popup, ;;; ou bien des menus textuels Helm ou Ivy. (use-package flyspell-correct :ensure t ) ;;; =========================================================================== ;;; Configuration Flycheck-aspell ;;; =========================================================================== ;;; Vérifier automatiquement le tampon quand on vient de sauver un mot dans ;;; le dictionnaire. Cette fonction est lancée après ispell-pdict-save ;;; (voir ci-dessous). (defun my/flycheck-recheck (&rest IGNORE) (when (bound-and-true-p flycheck-mode) (flycheck-buffer))) ;;; Flycheck-aspell lance Aspell sur le tampon et souligne les mots qui ;;; sont mal orthographiés. (use-package flycheck-aspell :ensure t :config ;; Définir un vérificateur pour les tampons sans mode (mode "fundamental") et ;; les fichiers texte. (flycheck-aspell-define-checker "text" "Text" ("--mode" "url") (fundamental-mode text-mode)) ;; Ajouter tous les vérificateurs aspell. (dolist (checker '(c-aspell-dynamic text-aspell-dynamic html-aspell-dynamic mail-aspell-dynamic markdown-aspell-dynamic nroff-aspell-dynamic tex-aspell-dynamic texinfo-aspell-dynamic xml-aspell-dynamic)) (add-to-list 'flycheck-checkers checker)) ;; Vérifier le tampon après l'ajout d'un mot dans le dictionnaire. (advice-add #'ispell-pdict-save :after #'my/flycheck-recheck) ;; Vérifier le tampon après changement du dictionnaire. (advice-add #'ispell-change-dictionary :after #'my/flycheck-recheck) ;; Lancer une détection de la langue quand on ouvre un fichier (add-hook 'find-file-hook #'my/set-buffer-dictionary) ) ;;; =========================================================================== ;;; Configuration Flycheck-grammalecte (correction grammaticale) ;;; =========================================================================== ;;; Correcteur de grammaire pour flycheck. Il souligne les endroits où se ;;; trouvent des erreurs de grammaire. (use-package flycheck-grammalecte :ensure t :after flycheck-aspell :config ;; Ces valeurs sont renseignées par le Flake Nix avec le chemin ;; du répertoire correct. Pour GRAMMALECTE_SITE, on doit faire une ;; recherche parmi les sous-répertoires pour trouver celui qui contient ;; les fichiers Lisp. (let* ((base-dir "@GRAMMALECTE_SITE@") (found-file (car (directory-files-recursively base-dir "flycheck-grammalecte\\.el"))) (setq grammalecte--site-directory (file-name-directory found-file)))) (setq grammalecte-python-package-directory "@GRAMMALECTE_PYTHON@") ;; Ne pas vérifier les mises à jour Grammalecte disponibles. (setq grammalecte-check-upstream-version-delay 0) ;; Activez ou non ces options suivant vos besoins. (setq flycheck-grammalecte-report-apos nil ; Apostrophes typographiques. flycheck-grammalecte-report-esp nil ; Espaces et tabulations. flycheck-grammalecte-report-nbsp nil ; Espaces non sécables. flycheck-grammalecte-report-typo nil ; Symboles typographiques. ) ;; Mise en place de Flycheck-grammalecte. (flycheck-grammalecte-setup) ;; Grammalecte installe une correction sur clic droit, on l'enlève, car ;; nous voulons notre propre fonction "my/correct-at-click" qui discerne ;; si l'erreur sur laquelle on clique vient de Aspell ou de Grammalecte. (keymap-unset flycheck-mode-map "") (keymap-set flycheck-mode-map "" #'my/correct-at-click) ;; Flycheck ne peut lancer qu'un "checker" à la fois. Ici, on dit ;; de lancer Grammalecte après Aspell. Et ce, pour chaque checker aspell. (dolist (checker '(c-aspell-dynamic text-aspell-dynamic html-aspell-dynamic mail-aspell-dynamic markdown-aspell-dynamic nroff-aspell-dynamic tex-aspell-dynamic texinfo-aspell-dynamic xml-aspell-dynamic)) (flycheck-add-next-checker checker 'grammalecte)) ;; Placer le vérificateur Grammalecte en fin de liste de Flycheck ;; pour qu'il ne prenne pas la place de Aspell, ce qui ferait que ;; Aspell ne serait jamais utilisé. (setq flycheck-checkers (delete 'grammalecte flycheck-checkers) flycheck-checkers (append flycheck-checkers '(grammalecte))) ) ;;; =========================================================================== ;;; Configuration de Guess-language ;;; =========================================================================== (use-package guess-language :ensure t :custom ;; Définir les langues à détecter à partir de notre liste. (guess-language-languages (mapcar #'car my/langues)) (guess-language-langcodes (mapcar ;; Transforme notre liste de langue au format guess-language. (lambda (entry) (let* ((key (car entry)) (values (cdr entry)) (dict-name (car values)) (display-name (cadr values)) (key-string (symbol-name key))) (cons key (list dict-name nil key-string display-name)))) my/langues)) :config ;;Désactiver la détection automatique paragraphe par paragraphe. (remove-hook 'flyspell-incorrect-hook #'guess-language-function t) (remove-hook 'post-command-hook #'guess-language--post-command-h t) (advice-remove 'flyspell-buffer #'guess-language-flyspell-buffer-wrapper) ) ;;; =========================================================================== ;;; Configuration Go-translate ;;; =========================================================================== ;;; Go translate permet de traduire du texte. Il peut utiliser des services en ;;; ligne, mais ici on appelle "Libre Translate" installé en service local. (use-package gt :ensure t ;; Pour traduire une sélection: "CTRL c" puis "t". :bind ("C-c t" . gt-translate) :custom ;; On définit le couple de langue par défaut. (gt-langs my/langues-traduction) ;; Utiliser Libre Translate installé en local. (gt-libre-host "http://localhost:5000/") :config ;; GT permet de créer des traducteurs personnalisés. Ici on défini un ;; traducteur qui opère sur une sélection texte (Faite avec "CTRL espace" ;; ou bien avec la souris). ;; Le résultat s'affiche dans un autre tampon ; il suffit ensuite de copier-coller. (setq gt-default-translator (gt-translator :taker (gt-taker :text 'selection :pick nil :prompt nil) :engines (list (gt-libre-engine :key "")) :render (gt-buffer-render))) ) (use-package flyspell-correct-ivy) ;; Local Variables: ;; fill-column: 80 ;; display-fill-column-indicator-mode: t ;; ispell-dictionary: "francais" ;; End: