dot Emacs

, par MiKaël Navarro

Cet article est dédié à Emacs et notamment sur les choses à mettre dans le fichier d’init.

Tout d’abord rappelons que le fichier init (~/.emacs ou ~/_emacs ou encore ~/.emacs.d/init.el) contient du code Emacs LISP exécuté au démarrage d’Emacs.

Emacs screenshot

Nous allons ici décortiquer les parties principales de mon fichier .emacs.d/init.el :

Paramétrage

On commence par s’identifier :

(setq user-full-name "MiKael NAVARRO")
(setq user-mail-address "mickey@klnavarro.fr")

Raccourcis pour répondre aux questions par ’y’ ou ’n’ :

(fset 'yes-or-no-p 'y-or-n-p)
(define-key query-replace-map [return] 'act)
(define-key query-replace-map [?\C-m] 'act)

Désactivation du split des lignes :
(setq fill-column nil)

Gestion des fichiers compressés :
(auto-compression-mode t)

Affichage des images :
(auto-image-file-mode t)

Ne pas insérer des tabulations mais des espaces :
(setq-default indent-tabs-mode nil)

Parenthese matching, permet de verifier au fur et à mesure de la frappe que l’on ferme bien ce que l’on ouvre, aussi bien pour les parenthèses que les crochets ou les accolades :

(show-paren-mode 1)
(setq-default hilight-paren-expression t)

Internationnalisation

Aussi connu sous l’accronyme i18n, permet de gérer les accents :

(setq selection-coding-system 'compound-text-with-extensions)
(set-terminal-coding-system 'latin-1)
(set-keyboard-coding-system 'latin-1)
(set-language-environment 'latin-1)

On est en europe, config du charset par defaut proprement :

(standard-display-8bit 128 255)
(standard-display-european 1)

Le calendrier

Calendrier au format ISO 8601 :

(require 'calendar)
(calendar-set-date-style 'iso)
(setq calendar-week-start-day 1)

Rajout des numéros de semaines :

(setq calendar-intermonth-header
     (propertize "WK" 'font-lock-face 'font-lock-function-name-face))
(setq calendar-intermonth-text
     '(propertize
       (format "%2d" (car (calendar-iso-from-absolute (calendar-absolute-from-gregorian (list month day year)))))
       'font-lock-face 'font-lock-function-name-face))

Personnalisation de l’interface

Titre de la fenêtre :
(setq frame-title-format '(buffer-file-name "Emacs: %b (%f)" "Emacs : %b"))

Désactivation des nuisances sonores :
(setq visible-bell t)

Economie d’espace (on désactive la bare de menu, d’outils et l’ascenseur) :

(menu-bar-mode t)
(tool-bar-mode -1)
(scroll-bar-mode -1)

On désactive les infobules (dans le cas contraire on demande un affichage rapide) :

(tooltip-mode -1)
(setq tooltip-delay 0.1)

Affichage du numéro de ligne et de la colonne dans la bare de status :

(column-number-mode t)
(line-number-mode t)

Affichage de l’heure (au format 24h) :

(setq display-time-24hr-format t)
(display-time)

Désactivation du clignotement du curseur sous Emacs 21 :

(if (string-equal "21" (substring (emacs-version) 10 12))
   (progn
     (blink-cursor-mode 0)
     ))

Fontes et couleurs

Police par défaut :

;(set-default-font "-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-80-ISO8859-1")
(set-frame-font "-*-Courier New-normal-r-*-*-13-*-*-*-c-*-iso8859-1")

Activation de la coloration syntaxique :

(global-font-lock-mode t)
(setq font-lock-maximum-decoration t)
(setq font-lock-maximum-size nil)
(transient-mark-mode t)

Et par défaut on active la colorisation :

(if (fboundp 'global-font-lock-mode)
   (global-font-lock-mode t)
 )

Thème (avant emacs-24) :

(defun color-theme-kln ()
 (interactive)
 (color-theme-install
  '(color-theme-kln
    ((foreground-color . "Wheat")
     (background-color . "DarkSlateGray")
     (background-mode . dark)
     (border-color . "Black")
     (cursor-color . "Orchid")
     (mouse-color . "White"))
    (fringe ((t (:background "DarkSlateGray"))))
    (mode-line ((t (:foreground "Black" :background "LemonChiffon"))))
    (region ((t (:background "SteelBlue"))))
    (font-lock-builtin-face ((t (:foreground "#8cd0d3"))))
    (font-lock-comment-face ((t (:foreground "OrangeRed"))))
    (font-lock-function-name-face ((t (:foreground "Cyan"))))
    (font-lock-keyword-face ((t (:foreground "SkyBlue" :weight bold))))
    (font-lock-string-face ((t (:foreground "Coral"))))
    (font-lock-type-face ((t (:foreground "LimeGreen"))))
    (font-lock-variable-name-face ((t (:foreground "#dfaf8f"))))
    (minibuffer-prompt ((t (:foreground "#f0dfaf" :bold t))))
    (font-lock-warning-face ((t (:foreground "Red" :weight bold :underline t))))
    )))
(provide 'color-theme-kln)

On détermine quel thème utiliser suivant que l’on est en console ou en mode x (ou en mode client/serveur) :

(require 'color-theme)
(color-theme-initialize)

;; Select theme:
;; test win sys to rerun ctheme
(defun test-win-sys(frame)
 (select-frame frame)  ;; must be current for local ctheme
 (if (window-system frame)  ;; test winsystem
     (color-theme-kln)
   (color-theme-tty-dark)
   )
 )
;; hook on after-make-frame-functions
(add-hook 'after-make-frame-functions 'test-win-sys)

;; Default start - if non daemon
(let ((color-theme-is-global nil))
 (if (window-system)
     (color-theme-kln)
   (color-theme-tty-dark)
   )
 )

Raccourcis clavier et souris

Les raccourcis claviers :

(global-set-key [up] 'previous-line)
(global-set-key [down] 'next-line)
(global-set-key [left] 'backward-char)
(global-set-key [right] 'forward-char)
(global-set-key [home] 'beginning-of-line)
(global-set-key [end] 'end-of-line)
(global-set-key [delete] 'delete-char)
(global-set-key [prior] 'scroll-down)
(global-set-key [next] 'scroll-up)
(global-set-key [C-up] 'backward-sexp)
(global-set-key [C-down] 'forward-sexp)
(global-set-key [C-left] 'backward-word)
(global-set-key [C-right] 'forward-word)
(global-set-key [C-home] 'beginning-of-buffer)
(global-set-key [C-end] 'end-of-buffer)
;(global-set-key [C-prior] "\M-<")
;(global-set-key [C-next] "\M->")
(global-set-key [M-next]  'scroll-other-window)
(global-set-key [M-prior] 'scroll-other-window-down)
(global-set-key "\M- " 'set-mark-command)
(global-set-key [C-backspace] 'backward-kill-word)
;(global-set-key "\M-%" 'query-replace)
(global-set-key [(meta g)] 'goto-line)
;(global-set-key [f1] 'view-order-manuals)
(global-set-key [f2] 'info)
;(global-set-key [f3] 'compile)
;(global-set-key [f4] 'repeat-complex-command)
;(global-set-key [f5] 'eval-current-buffer)

Pour GNU Emacs sous X :
(define-key global-map [(delete)] "\C-d")

Activation de la roulette de la souris :

(mouse-wheel-mode t)
(global-set-key   [mouse-4] '(lambda () (interactive) (scroll-down 5)))
(global-set-key   [mouse-5] '(lambda () (interactive) (scroll-up   5)))
(global-set-key [S-mouse-4] '(lambda () (interactive) (scroll-down 1)))
(global-set-key [S-mouse-5] '(lambda () (interactive) (scroll-up   1)))
(global-set-key [C-mouse-5] '(lambda () (interactive) (scroll-up   (/ (window-height) 2))))
(global-set-key [C-mouse-4] '(lambda () (interactive) (scroll-down (/ (window-height) 2))))

Circuler entre les vues par shift-arrow_keys :
(windmove-default-keybindings)

Rajout d’un menu contextuel (liste des variables, fonctions et méthodes) sur le bouton droit :
(global-set-key [mouse-3] 'imenu)

Gestion des séléctions X :

(defun x-own-selection (s) (x-set-selection `PRIMARY s))
(global-set-key [(shift insert)] '(lambda () (interactive) (insert (x-get-selection))))
(global-set-key [(control insert)] '(lambda () (interactive) (x-own-selection (buffer-substring (point) (mark)))))

Modes

Mode C

Style d’indentation pour le langage C :

(custom-set-variables
'(c-basic-offset 2)
'(c-default-style "K&R")
'(c-tab-always-indent t)
'(compilation-ask-about-save nil)
'(compilation-window-height 6))

Hide/Show

Monter ou cacher des parties du code grâce au paquet HideShow. Quelques raccourcis clavier pour se simplifier la vie :

(add-hook 'c-mode-common-hook
 (lambda()
   (local-set-key (kbd "C-c <right>") 'hs-show-block)
   (local-set-key (kbd "C-c <left>")  'hs-hide-block)
   (local-set-key (kbd "C-c <up>")    'hs-hide-all)
   (local-set-key (kbd "C-c <down>")  'hs-show-all)
   (hs-minor-mode t)))

CScope

L’intégration de CScope pour Emacs est disponible via le package xcscope dans MELPA. Une fois installé il suffit d’activer le cscope-minor-mode.

(require 'xcscope)
(cscope-setup)
;(add-hook 'c-mode-hook #'cscope-minor-mode)

Par défaut il indexera le répertoire courant, pour changer cela utiliser la fonction cscope-set-initial-directory de concert avec le script cscope-indexer.

Quelques extensions

Tout d’abord on rajoute son propre répertoire de librairies :

(add-to-list 'load-path (expand-file-name "~/site-lisp/"))

Auto-complétion

AutoComplete avec menu popup :

(require 'auto-complete)
(global-auto-complete-mode t)
(setq ac-auto-start 3)

Complétion sur l’Emacs LISP, les symboles ETAGS et pour le Python :

(require 'auto-complete-emacs-lisp)
(require 'auto-complete-etags)
(require 'auto-complete-python)

reStructuredText

Rajout du support du reStructuredText (avant emacs-24) :

(autoload 'rst-mode "~/site-lisp/rst.el"
 "mode for editing reStructuredText documents" t)
(setq auto-mode-alist
     (append '(("\\.rst$" . rst-mode)
               ("\\.rest$" . rst-mode)) auto-mode-alist))

P.-S.

Mis-à-jour pour Emacs 23 (et compatibilité Window$).

MàJ 2 : version Emacs 24.

MàJ 3 : version Emacs 26 (retro-compatible Emacs 24.3+)