Installation
L’installation la plus simple de cette configuration se résume à renommer ce répertoire en
~/.emacs.d
Emacs fonctionne plus rapidement lorsqu’il est lancé en mode client (plusieurs client s’attachent à un même serveur). Pour bénéficier de cette optimisation ajouter les alias suivants à votre shell
alias emacs="emacsclient -q -a '' -c"
alias kill-emacs="emacsclient -q -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))'"
Tutoriels de M. Zamansky
Cette configuration d’Emacs est grandement (et librement) inspirée de celle proposée par Mike Zamansky.
Pour une excellente série tutoriels ainsi que la construction pas a pas de configurations, voir ci-dessous
Choix d’interface
Pas d’écran de bienvenue
(setq inhibit-startup-message t)
Augumente la mémoire pour le “garbage collector” => meilleures perfs
(setq gc-cons-threshold 64000000)
(add-hook 'after-init-hook
#'(lambda ()
;; restore after startup
(setq gc-cons-threshold 800000)))
Pas de toolbar
(tool-bar-mode -1)
Réponses par y ou n
(fset 'yes-or-no-p 'y-or-n-p)
Commentaires
Racourci | Description |
---|---|
C-c ; |
Commente ou décommente une région |
(global-set-key (kbd "C-c ;") 'comment-or-uncomment-region)
Affiche aussi le numéro de colone
(setq column-number-mode t)
Désactive l’auto-save
(setq auto-save-default nil)
Auto-fill
Utilise l’auto-fill
(turn-on-auto-fill)
… sauf quand on code
(add-hook 'prog-mode-hook (lambda () (auto-fill-mode -1)))
Supression des blancs inutiles
On retire les blancs qui traînent en fin de ligne à la sauvegarde d’un buffer
(add-hook 'before-save-hook
(lambda ()
(when (not (derived-mode-p 'ein:notebook-multilang-mode))
(delete-trailing-whitespace))))
Affichage de la fonction courante
(which-function-mode t)
Powerline
Un bel affichage pour la barre d’état (mode-line
)
(use-package powerline
:ensure t
:config (powerline-default-theme))
Try
Permet d’essayer des paquets (sans les installer de manère permanente)
(use-package try
:ensure t)
Posframe
Affiche des boites de dialogue
(use-package posframe
:ensure t)
Which key
Aide en ligne pour les raccourci (quelle touche ?)
(use-package which-key
:ensure t
:config
(which-key-mode))
Org mode
Org bullets makes things look pretty
(use-package org
:ensure t
:pin org)
(setenv "BROWSER" "firefox")
(use-package org-bullets
:ensure t
:config
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))
(custom-set-variables
'(org-default-notes-file (concat org-directory "/notes.org"))
'(org-export-html-postamble nil)
'(org-hide-leading-stars t)
'(org-startup-folded (quote overview))
'(org-startup-indented t)
'(org-confirm-babel-evaluate nil)
'(org-src-fontify-natively t)
)
(setq org-file-apps
(append '(
("\\.pdf\\'" . "evince %s")
("\\.x?html?\\'" . "/usr/bin/firefox %s")
) org-file-apps ))
(global-set-key "\C-ca" 'org-agenda)
(setq org-agenda-start-on-weekday nil)
(setq org-agenda-custom-commands
'(("c" "Simple agenda view"
((agenda "")
(alltodo "")))))
(global-set-key (kbd "C-c c") 'org-capture)
(defun make-capture-frame ()
"Create a new frame and run org-capture."
(interactive)
(make-frame '((name . "capture")))
(select-frame-by-name "capture")
(delete-other-windows)
(noflet ((switch-to-buffer-other-window (buf) (switch-to-buffer buf)))
(org-capture)))
(define-key org-mode-map (kbd "C-c >") (lambda () (interactive (org-time-stamp-inactive))))
(use-package htmlize :ensure t)
(setq org-ditaa-jar-path "/usr/share/ditaa/ditaa.jar")
Ace windows
Permet de changer facilement de fenêtre
(use-package ace-window
:ensure t
:init
(progn
(setq aw-scope 'global) ;; was frame
(global-set-key (kbd "C-x O") 'other-frame)
(global-set-key [remap other-window] 'ace-window)
(custom-set-faces
'(aw-leading-char-face
((t (:inherit ace-jump-face-foreground :height 3.0)))))
))
Ivy / Counsel
Interface de complétion
(use-package counsel
:ensure t
:bind
(("M-y" . counsel-yank-pop)
:map ivy-minibuffer-map
("M-y" . ivy-next-line)))
(use-package ivy
:ensure t
:diminish (ivy-mode)
:bind (("C-x b" . ivy-switch-buffer))
:config
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-count-format "%d/%d ")
(setq ivy-display-style 'fancy))
Swiper
Améliore la recherche incrémentale
(use-package swiper
:ensure t
:bind (("C-s" . swiper-isearch)
("C-r" . swiper-isearch)
("C-c C-r" . ivy-resume)
("M-x" . counsel-M-x)
("C-x C-f" . counsel-find-file))
:config
(progn
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-display-style 'fancy)
(define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
))
Avy
Saute très rapidement vers la zone de text contenant une lettre
(use-package avy
:ensure t
:bind ("M-s" . avy-goto-word-1))
Company
Boites de dialogue pour la complétion
(use-package company
:ensure t
:config
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 3)
(global-company-mode t))
(defun my/python-mode-hook ()
(add-to-list 'company-backends 'company-jedi))
(add-hook 'python-mode-hook 'my/python-mode-hook)
(use-package company-jedi
:ensure t
:config
(add-hook 'python-mode-hook 'jedi:setup)
)
(defun my/python-mode-hook ()
(add-to-list 'company-backends 'company-jedi))
(add-hook 'python-mode-hook 'my/python-mode-hook)
C++
Transforme Emacs en un véritable IDE en utilisant Irony
On branche Irony à Company
(use-package company-irony
:ensure t
:config
(add-to-list 'company-backends 'company-irony))
On active Irony pour le C++
(use-package irony
:ensure t
:config
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
Eldoc / Irony
Affiche la documentation des objets/functions dans le minibuffer
(use-package irony-eldoc
:ensure t
:config
(add-hook 'irony-mode-hook #'irony-eldoc))
Formatage automatique : clang-format
Création d’un racourci spécial pour formater une zone
(use-package clang-format
:ensure t
:bind
(("C-c C-f" . clang-format-region)))
Remplace l’indentation classique d’Emacs par clang-format en C/C++
(defun clang-format-c-mode-common-hook ()
(fset 'c-indent-region 'clang-format-region)
(define-key c-mode-base-map (kbd "<tab>") 'clang-format-region))
(add-hook 'c-mode-common-hook 'clang-format-c-mode-common-hook)
Force le formatage du fichier quand il est sauvgardé
(defun clang-format-buffer-on-save ()
"Add auto-save hook for clang-format-buffer-smart."
(add-hook 'before-save-hook 'clang-format-buffer nil t))
(add-hook 'c-mode-common-hook 'clang-format-buffer-on-save)
Coloration syntaxique (C++ moderne)
(use-package modern-cpp-font-lock
:ensure t
:init
(eval-when-compile
;; Silence missing function warnings
(declare-function modern-c++-font-lock-global-mode
"modern-cpp-font-lock.el"))
:config (modern-c++-font-lock-global-mode t))
Themes
Préchargement de quelques themes
(use-package cloud-theme :ensure t)
(use-package zenburn-theme :ensure t)
(use-package sourcerer-theme :ensure t)
(use-package monokai-theme :ensure t)
(use-package gruvbox-theme :ensure t)
(use-package bubbleberry-theme :ensure t)
(use-package solarized-theme :ensure t)
Chargement d’un theme
(load-theme 'sourcerer t)
Modeline
Augmente la taille de la police
(defvar my-font-size 140)
Taille de la Modeline
(set-face-attribute 'mode-line nil :height my-font-size)
Taille du titre
(set-face-attribute 'header-line nil :height my-font-size)
Taille des attributs
(set-face-attribute 'default nil :height my-font-size)
Taille de la fenêtre et position
(setq default-frame-alist
'((top . 0) (left . 0) ;; position
(width . 110) (height . 90) ;; size
))
Parenthèses arc-en-ciel
Améliore le visuel des parenthèses
(use-package rainbow-delimiters
:ensure t
:init
(eval-when-compile
;; Silence missing function warnings
(declare-function rainbow-delimiters-mode "rainbow-delimiters.el"))
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
Flycheck
On branche flycheck à Irony
(use-package flycheck-irony
:ensure t
:config
(eval-after-load 'flycheck
'(add-hook 'flycheck-mode-hook #'flycheck-irony-setup)))
On charge flycheck
(use-package flycheck
:ensure t
:init
(global-flycheck-mode t))
Active flycheck globalement
(add-hook 'after-init-hook #'global-flycheck-mode)
Python
Attention pour que la configuration fonctionne, il faut installer
virtualenv
. Pour les systèmes Debian
apt install virtualenv
(setq py-python-command "python3")
(setq python-shell-interpreter "python3")
(use-package elpy
:ensure t
:custom (elpy-rpc-backend "jedi")
:config
(elpy-enable))
(use-package virtualenvwrapper
:ensure t
:config
(venv-initialize-interactive-shells)
(venv-initialize-eshell))
YaSnippet
Le système de templates pour Emacs
(use-package yasnippet
:ensure t
:init (yas-global-mode 1))
(use-package yasnippet-snippets
:ensure t)
Divers paquets
Highlight line
Mise en valeur de la ligne courante
(global-hl-line-mode t)
Beacon
Flash de la ligne aux changements de page ou de buffer
(use-package beacon
:ensure t
:config
(beacon-mode 1))
hungry-delete
Suppression de tous les blancs quand appuie sur backspace ou delete
(use-package hungry-delete
:ensure t
:config
(global-hungry-delete-mode))
Multiple-cursors
Permet l’utilisation de plusieurs curseurs simultanément
(use-package multiple-cursors
:ensure t)
Expand-region
Sélectionne une zone de manière incrémentale. mot, phrase, paragraphe, etc de manière intelligente.
(use-package expand-region
:ensure t
:config
(global-set-key (kbd "C-=") 'er/expand-region))
Meilleure gestion du kill-ring
(setq save-interprogram-paste-before-kill t)
Gestion de la restauration des buffers
(global-auto-revert-mode 1)
(setq auto-revert-verbose nil)
(global-set-key (kbd "<f5>") 'revert-buffer)
iedit
Modifie les copies d’une zone séléctionnée simultanément
Racourci | Description |
---|---|
C-h C-; |
démarrer les modifications |
M-ESC ESC |
sortir du mode |
(use-package iedit
:ensure t)
Narrow/widen dwim
Réduit/agrandit une zone d’édition de manière intelligente
(defun narrow-or-widen-dwim (p)
"If the buffer is narrowed, it widens. Otherwise, it narrows intelligently.
Intelligently means: region, org-src-block, org-subtree, or defun,
whichever applies first.
Narrowing to org-src-block actually calls `org-edit-src-code'.
With prefix P, don't widen, just narrow even if buffer is already
narrowed."
(interactive "P")
(declare (interactive-only))
(cond ((and (buffer-narrowed-p) (not p)) (widen))
((region-active-p)
(narrow-to-region (region-beginning) (region-end)))
((derived-mode-p 'org-mode)
;; `org-edit-src-code' is not a real narrowing command.
;; Remove this first conditional if you don't want it.
(cond ((ignore-errors (org-edit-src-code))
(delete-other-windows))
((org-at-block-p)
(org-narrow-to-block))
(t (org-narrow-to-subtree))))
(t (narrow-to-defun))))
Remplace la fonction Emacs standard par dwim
(define-key ctl-x-map "n" #'narrow-or-widen-dwim)
Web Mode
Mode avancé pour l’édition de pages html
, CSS
,…
(use-package web-mode
:ensure t
:config
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.vue?\\'" . web-mode))
(setq web-mode-engines-alist
'(("django" . "\\.html\\'")))
(setq web-mode-ac-sources-alist
'(("css" . (ac-source-css-property))
("vue" . (ac-source-words-in-buffer ac-source-abbrev))
("html" . (ac-source-words-in-buffer ac-source-abbrev))))
(setq web-mode-enable-auto-closing t))
(setq web-mode-enable-auto-quoting t) ; this fixes the quote problem I mentioned
Emmet mode
Ensemble de fonctions permettant l’édition rapide de markup languages (html,sgml,…)
(use-package emmet-mode
:ensure t
:config
;; Auto-start on any markup modes
(add-hook 'sgml-mode-hook 'emmet-mode)
;; Auto-start on any markup modes
(add-hook 'web-mode-hook 'emmet-mode)
;; enable Emmet's css abbreviation
(add-hook 'css-mode-hook 'emmet-mode))
DIRED
Permet d’utiliser reduire/agrandir les affichages de répertoires
(setq dired-dwim-target t)
(use-package dired-narrow
:ensure t
:config
(bind-key "C-c C-n" #'dired-narrow)
(bind-key "C-c C-f" #'dired-narrow-fuzzy)
(bind-key "C-x C-N" #'dired-narrow-regexp))
(use-package dired-subtree :ensure t
:after dired
:config
(bind-key "<tab>" #'dired-subtree-toggle dired-mode-map)
(bind-key "<backtab>" #'dired-subtree-cycle dired-mode-map))
LaTeX
Configuration LaTeX basique.
(use-package tex
:ensure auctex)
(defun tex-view ()
(interactive)
(tex-send-command "evince" (tex-append tex-print-file ".pdf")))
Gestion de projets
(use-package projectile
:ensure t
:bind ("C-c p" . projectile-command-map)
:config
(projectile-mode)
(setq projectile-completion-system 'ivy))
Org mode (langages suportés)
Charge les langages disponnibles pour org-mode
(org-babel-do-load-languages
'org-babel-load-languages
'((python . t)
(emacs-lisp . t)
(shell . t)
(C . t)
(js . t)
(ditaa . t)
(dot . t)
(org . t)
(latex . t )))
Parenthèses
(use-package smartparens
:ensure t
:hook (prog-mode . smartparens-mode)
:custom
(sp-escape-quotes-after-insert nil)
:config
(require 'smartparens-config))
(show-paren-mode t)
(setq show-paren-style 'mixed)
Taille de la police
Change la police dynamiquement
(use-package default-text-scale
:ensure t
:config
(global-set-key (kbd "C-M-=") 'default-text-scale-increase)
(global-set-key (kbd "C-M--") 'default-text-scale-decrease))
Hydra
Outil de simplification des raccourcis
(use-package hydra
:ensure hydra
:init
(global-set-key
(kbd "C-x t")
(defhydra toggle (:color blue)
"toggle"
("a" abbrev-mode "abbrev")
("s" flyspell-mode "flyspell")
("d" toggle-debug-on-error "debug")
("c" fci-mode "fCi")
("f" auto-fill-mode "fill")
("t" toggle-truncate-lines "truncate")
("w" whitespace-mode "whitespace")
("q" nil "cancel")))
(global-set-key
(kbd "C-x j")
(defhydra gotoline
( :pre (linum-mode 1)
:post (linum-mode -1))
"goto"
("t" (lambda () (interactive)(move-to-window-line-top-bottom 0)) "top")
("b" (lambda () (interactive)(move-to-window-line-top-bottom -1)) "bottom")
("m" (lambda () (interactive)(move-to-window-line-top-bottom)) "middle")
("e" (lambda () (interactive)(goto-char (point-max))) "end")
("c" recenter-top-bottom "recenter")
("n" next-line "down")
("p" (lambda () (interactive) (forward-line -1)) "up")
("g" goto-line "goto-line")
))
(global-set-key
(kbd "C-c t")
(defhydra hydra-global-org (:color blue)
"Org"
("t" org-timer-start "Start Timer")
("s" org-timer-stop "Stop Timer")
("r" org-timer-set-timer "Set Timer") ; This one requires you be in an orgmode doc, as it sets the timer for the header
("p" org-timer "Print Timer") ; output timer value to buffer
("w" (org-clock-in '(4)) "Clock-In") ; used with (org-clock-persistence-insinuate) (setq org-clock-persist t)
("o" org-clock-out "Clock-Out") ; you might also want (setq org-log-note-clock-out t)
("j" org-clock-goto "Clock Goto") ; global visit the clocked task
("c" org-capture "Capture") ; Don't forget to define the captures you want http://orgmode.org/manual/Capture.html
("l" (or )rg-capture-goto-last-stored "Last Capture"))
))
(defhydra hydra-multiple-cursors (:hint nil)
"
Up^^ Down^^ Miscellaneous % 2(mc/num-cursors) cursor%s(if (> (mc/num-cursors) 1) \"s\" \"\")
------------------------------------------------------------------
[_p_] Next [_n_] Next [_l_] Edit lines [_0_] Insert numbers
[_P_] Skip [_N_] Skip [_a_] Mark all [_A_] Insert letters
[_M-p_] Unmark [_M-n_] Unmark [_s_] Search
[Click] Cursor at point [_q_] Quit"
("l" mc/edit-lines :exit t)
("a" mc/mark-all-like-this :exit t)
("n" mc/mark-next-like-this)
("N" mc/skip-to-next-like-this)
("M-n" mc/unmark-next-like-this)
("p" mc/mark-previous-like-this)
("P" mc/skip-to-previous-like-this)
("M-p" mc/unmark-previous-like-this)
("s" mc/mark-all-in-region-regexp :exit t)
("0" mc/insert-numbers :exit t)
("A" mc/insert-letters :exit t)
("<mouse-1>" mc/add-cursor-on-click)
;; Help with click recognition in this hydra
("<down-mouse-1>" ignore)
("<drag-mouse-1>" ignore)
("q" nil)
("<mouse-1>" mc/add-cursor-on-click)
("<down-mouse-1>" ignore)
("<drag-mouse-1>" ignore))
Modes git
Le sublime Magit
(use-package magit
:ensure t
:init
(progn (bind-key "C-x g" 'magit-status)))
Affiche l’état git dans la marge
(setq magit-status-margin
'(nil "%Y-%m-%d %H:%M " magit-log-margin-width t 18))
Utilise git-gutter avec hydra
(use-package git-gutter
:ensure t
:init
(global-git-gutter-mode +1))
(global-set-key (kbd "M-g M-g") 'hydra-git-gutter/body)
(use-package git-timemachine
:ensure t)
(defhydra hydra-git-gutter (:body-pre (git-gutter-mode 1)
:hint nil)
"
Git gutter:
_j_: next hunk _s_tage hunk _q_uit
_k_: previous hunk _r_evert hunk _Q_uit and deactivate git-gutter
^ ^ _p_opup hunk
_h_: first hunk
_l_: last hunk set start _R_evision
"
("j" git-gutter:next-hunk)
("k" git-gutter:previous-hunk)
("h" (progn (goto-char (point-min))
(git-gutter:next-hunk 1)))
("l" (progn (goto-char (point-min))
(git-gutter:previous-hunk 1)))
("s" git-gutter:stage-hunk)
("r" git-gutter:revert-hunk)
("p" git-gutter:popup-hunk)
("R" git-gutter:set-start-revision)
("q" nil :color blue)
("Q" (progn (git-gutter-mode -1)
;; git-gutter-fringe doesn't seem to
;; clear the markup right away
(sit-for 0.1)
(git-gutter-mode))
:color blue))
Flyspell
(add-hook 'org-mode-hook 'turn-on-flyspell)
(add-hook 'org-mode-hook 'turn-on-auto-fill)
(add-hook 'mu4e-compose-mode-hook 'turn-on-flyspell)
(add-hook 'mu4e-compose-mode-hook 'turn-on-auto-fill)
C++
Activation des ggtags
(use-package ggtags
:ensure t
:config
(add-hook 'c-mode-common-hook
(lambda ()
(when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
(ggtags-mode 1)))))
Cmake
(use-package cmake-mode
:ensure t
:mode ("CMakeLists.txt" ".cmake")
:hook (cmake-mode . (lambda ()
(add-to-list 'company-backends 'company-cmake)))
:config
(use-package cmake-font-lock
:ensure t
:defer t
:commands (cmake-font-lock-activate)
:hook (cmake-mode . (lambda ()
(cmake-font-lock-activate)
(font-lock-add-keywords
nil '(("\\<\\(FIXME\\|TODO\\|BUG\\|DONE\\)"
1 font-lock-warning-face t)))
))
))
Markdown
(use-package markdown-mode
:ensure t
:mode (".md" ".markdown"))
Dumb jump
Permet de se déplacer très rapidement dans un texte
(use-package dumb-jump
:bind (("M-g o" . dumb-jump-go-other-window)
("M-g j" . dumb-jump-go)
("M-g x" . dumb-jump-go-prefer-external)
("M-g z" . dumb-jump-go-prefer-external-other-window))
:init
(dumb-jump-mode)
:ensure t)
Origami
Mode permettant le pliage (folding) de regions
(use-package origami
:ensure t)
IBuffer
Un meilleur gestionnaire de buffers.
(global-set-key (kbd "C-x C-b") 'ibuffer)
(setq ibuffer-saved-filter-groups
(quote (("default"
("dired" (mode . dired-mode))
("org" (name . "^.*org$"))
("magit" (mode . magit-mode))
("IRC" (or (mode . circe-channel-mode)
(mode . circe-server-mode)))
("web" (or (mode . web-mode) (mode . js2-mode)))
("shell" (or (mode . eshell-mode) (mode . shell-mode)))
("mu4e" (or (mode . mu4e-compose-mode)
(name . "\\*mu4e\\*")))
("programming" (or (mode . clojure-mode)
(mode . clojurescript-mode)
(mode . python-mode)
(mode . c++-mode)))
("emacs" (or (name . "^\\*scratch\\*$")
(name . "^\\*Messages\\*$")))
))))
(add-hook 'ibuffer-mode-hook
(lambda ()
(ibuffer-auto-mode 1)
(ibuffer-switch-to-saved-filter-groups "default")))
;; Don't show filter groups if there are no buffers in that group
(setq ibuffer-show-empty-filter-groups nil)
;; Don't ask for confirmation to delete marked buffers
(setq ibuffer-expert t)
Wgrep
Permet de modifier le résultat d’un grep (donc simultanément dans plusieurs fichiers par exemple).
Commandes de base
Racourci | Description |
---|---|
C-c C-p |
passe en mode écriture dans le buffer résultat de grep |
C-c C-e |
sauve les modifications |
C-x C-q |
quitte le mode |
voir wgrep pour plus d’infos.
(use-package wgrep
:ensure t)
(use-package wgrep-ag
:ensure t)
(require 'wgrep-ag)
PDF tools
Outils d’édition de PDF dans Emacs
(use-package pdf-tools
:ensure t)
(use-package org-pdfview
:ensure t)
AutoYASnippet
Outil de création rapide de snipets. Voir la documentation en ligne https://github.com/abo-abo/auto-yasnippet
(use-package auto-yasnippet
:ensure t)
Divers
Quelques réglages utilitaires
(setq browse-url-browser-function 'browse-url-generic
browse-url-generic-program "firefox")
(setq auto-window-vscroll nil)
(blink-cursor-mode t)
(setq default-frame-alist
'((cursor-color . "DarkGrey")))
Keyfreq
Enregistre la fréquence d’utilisation de commandes. Pour obtenir les statistiques, utiliser la commande M-x keyfreq-show
(use-package keyfreq
:ensure t
:config
(require 'keyfreq)
(keyfreq-mode 1)
(keyfreq-autosave-mode 1))
Dictionnaire et césures
(use-package dictionary
:ensure t)
(use-package synosaurus
:ensure t)
COMMENT Local Variables: COMMENT ispell-local-dictionary: “francais” COMMENT End: