Xavier Lamorlette

Configuration de XEmacs (Lisp)

Voici mes différents fichiers de configuration pour XEmacs que j'ai écrits au fur et à mesure des années.

J'utilise actuellement XEmacs 21.5.29 sous Windows. J'ai placé mes fichiers de configuration dans d:\.xemacs, en ayant configuré mon raccourci vers XEmacs pour démarrer dans le répertoire d:\.

init.el

Le premier fichier est init.el :

; fichier .xemacs/init.el
; Xavier Lamorlette 2001 - 2013
; ce fichier permet de personnaliser le comportement d'XEmacs
; les changements ne sont pris en compte qu'au démarrage suivant
; a moins d'utiliser la commande :
; M-x load-file RET d:\.xemacs\init.el RET
; ou :
; M-x eval-buffer

; pour afficher les caractères accentués
(standard-display-european 1)

; pour faire fonctionner la touche Suppr comme Suppr et non Backspace !
(setq delete-key-deletes-forward t)

; configurations communes entre Emacs et XEmacs
(load-options-file "d:/.xemacs/custom.el")

; chargement du fichier de conf de xemacs
(cond
 ((string-match "XEmacs" emacs-version)
  (load-options-file "d:/.xemacs/xemacs-options")))

; chargement du fichier de configuration perso de xemacs
(cond
 ((string-match "XEmacs" emacs-version)
  (load-options-file "d:/.xemacs/xemacs-perso")))

(setq minibuffer-max-depth nil)

custom.el

On voit que le fichier init.el va charger d'autres fichiers. Le premier d'entre eux est custom.el qui contient juste quelques variables :

; fichier .xemacs/custom.el
(custom-set-variables
 '(column-number-mode t)
 '(truncate-lines nil)
 '(line-number-mode t)
 '(c-basic-offset 2)
 '(frame-background-mode (quote dark))
 '(query-user-mail-address nil)
 '(indent-tabs-mode nil))
(custom-set-faces
 '(font-lock-string-face ((t (:foreground "#e000e0"))))
 '(font-lock-reference-face ((t (:foreground "#e06080"))))
 '(font-lock-doc-string-face ((t (:foreground "#d040d0"))))
 '(font-lock-preprocessor-face ((t (:foreground "#e06080"))))
 '(font-lock-variable-name-face ((t (:foreground "#00b000"))))
 '(font-lock-keyword-face ((t (:foreground "#707000"))))
 '(font-lock-type-face ((t (:foreground "#00a0c0"))))
 '(font-lock-comment-face ((t (:foreground "#0000d0"))))
 '(font-lock-function-name-face ((t (:underline t :foreground "#e00000")))))

xemacs-options

On a ensuite le fichier xemacs-options qui contient, comme son nom l'indique, des options :

; -*- Mode: Emacs-Lisp -*-
; fichier .xemacs/xemacs-options
(setq options-file-xemacs-version '(20 4))
  (setq-default case-fold-search t)
  (setq-default overwrite-mode nil)
    (setq-default case-fold-search t)
  (setq-default case-replace t)
    (setq-default zmacs-regions t)
  (setq-default mouse-yank-at-point t)
  (setq-default require-final-newline t)
  (setq-default next-line-add-newlines nil)
  (setq-default teach-extended-commands-p t)
  (setq-default teach-extended-commands-timeout 4)
  (setq-default debug-on-error nil)
  (setq-default debug-on-quit nil)
  (setq-default lpr-switches nil)
  (setq-default ps-print-color-p nil)
  (setq-default ps-paper-type 'letter)
  (setq-default get-frame-for-buffer-default-instance-limit nil)
  (setq-default temp-buffer-show-function 'show-temp-buffer-in-current-frame)
    (setq-default font-lock-auto-fontify t)
  (setq-default font-lock-use-fonts '(or (mono) (grayscale)))
  (setq-default font-lock-use-colors '(color))
  (setq-default font-lock-maximum-decoration t)
  (setq-default font-lock-maximum-size 256000)
  (setq-default font-lock-mode-enable-list nil)
  (setq-default font-lock-mode-disable-list nil)
  (require 'font-lock)
  (remove-hook 'font-lock-mode-hook 'turn-on-fast-lock)
  (remove-hook 'font-lock-mode-hook 'turn-on-lazy-shot)
    (if (featurep 'scrollbar) (progn (add-spec-list-to-specifier scrollbar-width 'nil) (add-spec-list-to-specifier scrollbar-height 'nil)))
  (add-spec-list-to-specifier modeline-shadow-thickness '((global (nil . 2))))
  (setq-default truncate-lines nil)
  (setq-default bar-cursor nil)
    (setq-default buffers-menu-max-size 25)
  (setq-default complex-buffers-menu-p nil)
  (setq-default buffers-menu-sort-function 'sort-buffers-menu-by-mode-then-alphabetically)
  (setq-default buffers-menu-grouping-function 'group-buffers-menu-by-mode-then-alphabetically)
  (setq-default buffers-menu-submenus-for-groups-p nil)
  (setq-default font-menu-ignore-scaled-fonts t)
  (setq-default font-menu-this-frame-only-p nil)
  (if (featurep 'toolbar) (progn (set-default-toolbar-position 'top) (add-spec-list-to-specifier default-toolbar-visible-p '((global (nil)))) (add-spec-list-to-specifier toolbar-buttons-captioned-p '((global (nil . t))))))
  (setq-default mouse-avoidance-mode nil)
  (setq-default browse-url-browser-function 'browse-url-w3)

xemacs-perso

Enfin, on a le fichier xemacs-perso où l'on trouve de très nombreuses personnalisations, notamment quelques fonctions, des raccourcis claviers, et quelques hooks pour différents modes :

; -*- Mode: Emacs-Lisp -*-
; fichier .xemacs/xemacs-perso
; Xavier Lamorlette 2001-2013
; ce fichier contient les personnalisations de xemacs
; il est charge depuis le fichier .xemacs/init.el


; ---------------------------------
;    fonctions utilitaires
; ---------------------------------

; Effacer tous les espaces en fin de ligne
(defun delete-trailing-spaces ()
  "Effacer les espaces et tabulations en fin de chaque ligne du tampon"
  (interactive)
  (progn
    (save-excursion
      (goto-line 1)
      (replace-regexp "[ \t]+$" "")
    )
  )
)

; Conversion des fins de lignes du format MS-DOS au format Unix
(defun dos2unix ()
  (interactive)
  (goto-char (point-min))
  (while (search-forward "\r" nil t)
    (replace-match "")
  )
)

; va a l'accolade correspondante
(defun go-matching-paren (arg)
    "Go to the matching paren if on a paren; otherwise insert %."
    (interactive "p")
    (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
      ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
      (t (self-insert-command (or arg 1)))))


; -------------------------
;    raccourcis claviers
; -------------------------

; --- creation des fenetres ---
(global-set-key '(control \1) 'delete-other-windows)        ; supprime toutes les autres fenetres
(global-set-key '(control \2) 'split-window-vertically)     ; divise la fenetre en deux verticalement
(global-set-key '(control \3) 'split-window-horizontally)   ; divise la fenetre en deux horizontalement
(global-set-key '(control \4) 'delete-window)               ; supprime la fenetre courante

; idem pour clavier azerty
(global-set-key '(control &) 'delete-other-windows)         ; supprime toutes les autres fenetres
(global-set-key '(control é) 'split-window-vertically)      ; divise la fenetre en deux verticalement
(global-set-key '(control \") 'split-window-horizontally)   ; divise la fenetre en deux horizontalement "
(global-set-key '(control \') 'delete-window)               ; supprime la fenetre courante

; --- controle de la taille des fenetres ---
(global-set-key '(control prior) 'shrink-window)                 ; diminue la hauteur de la fenetre
(global-set-key '(control next) 'enlarge-window)                 ; augmente la hauteur de la fenetre
(global-set-key '(control insert) 'shrink-window-horizontally)   ; diminue la largeur de la fenetre
(global-set-key '(control delete) 'enlarge-window-horizontally)  ; augmente la largeur de la fenetre

; --- navigation ---
(global-set-key '(control o) 'other-window)           ; passe d'une fenetre à l'autre
(global-set-key '(control b) 'switch-to-buffer)       ; change de buffer
(global-set-key '(control z) 'electric-buffer-list)   ; list des buffers
(global-set-key '(control f) 'goto-line)              ; va a la ligne n
(global-set-key '(control j) 'go-matching-paren)      ; va a l'accolade correspondante

; --- mise en page ---
(global-set-key '(control p) 'mark-whole-buffer)        ; selectionne tout le buffer
(global-set-key '(control m) 'indent-region)            ; indente la region selectionnee
(global-set-key '(control i) 'delete-trailing-spaces)   ; efface les caracteres en fin de ligne
(global-set-key '(alt q) 'fille-paragraph-or-region)    ; reformatte le paragraphe
(global-set-key '(control \,) 'delete-indentation)      ; rassemble la ligne courrante avec la precedente
(global-set-key '(control \.) 'just-one-space)          ; efface les caracteres en fin de ligne

; --- divers ---
(global-set-key '(control \5) 'repeat-complex-command)  ; repete la dernière commande
(global-set-key '(control n) 'kill-ring-save)           ; copie la region
(global-set-key '(control -) 'undo)                     ; annulation
(global-set-key (kbd "C-x C-r") 'revert-buffer)         ; annule tout le buffer

; --- deplacement lignes ---
(global-set-key '(meta up) 'transpose-line-up)        ; monte la ligne d'une ligne
(global-set-key '(meta down) 'transpose-line-down)    ; descend la ligne d'une ligne


; ------------------
;    associations
; ------------------

; mode html pour les fichiers .php (suivant l'exemple donne p. 264)
;(setq auto-mode-alist
;      (cons '("\.php$" . html-mode) auto-mode-alist))
(setq auto-mode-alist
      (cons '("\.html$" . html-mode) auto-mode-alist))
(setq auto-mode-alist
      (cons '("\.phtml$" . html-mode) auto-mode-alist))

; mode c++ pour les fichiers .h
(setq auto-mode-alist
      (cons '("\.h$" . c++-mode) auto-mode-alist))

; mode java pour les fichiers .java
(setq auto-mode-alist
      (cons '("\.java$" . java-mode) auto-mode-alist))

; mode latex pour les fichier .tex
(setq auto-mode-alist
      (cons '("\.tex$" . latex-mode) auto-mode-alist))

; mode fondamental pour les fichier .mup
(setq auto-mode-alist
      (cons '("\.mup$" . fundamental-mode) auto-mode-alist))

; mode makefile pour les fichier .inc
(setq auto-mode-alist
      (cons '("\.inc$" . makefile-mode) auto-mode-alist))

; mode sh pour les fichier .sh
(setq auto-mode-alist
      (cons '("\.sh$" . sh-mode) auto-mode-alist))


; ------------------------
;    variables diverses
; ------------------------

; pour changer la valeur d'une variable : (setq nom_variable valeur) (p. 262)
; si ne fonctionne pas, essayer : (setq-default ...)

; --- affichage ---
(setq-default visible-bell nil)           ; l'ecran clignote plutot que de generer un son lorsque cela sera necessaire
(setq-default truncate-lines nil)         ; ne tronque pas les lignes
(setq-default truncate-partial-width-windows nil)  ; meme lorsque la fenetre ne fait pas toute la largeur
(setq-default paren-mode 'sexp)           ; colorie tout le block lorsque l'on est sur une parenthese
(setq default-major-mode 'text-mode)      ; par defaut mode text (au lieu du mode fundamental)
(setq suggest-key-bindings t)             ; suggerer des raccourcis claviers
(setq inhibit-startup-message t)          ; supprimer l'affichage du message d'accueil
(setq scroll-preserve-screen-position t)  ; laisser le curseur en place lors d'un defilement par pages (par defaut, Emacs place le curseur en debut ou fin d'ecran selon le sens du defilement)
(setq-default save-place t)               ; se rappeler de la position dans le fichier entre les sessions
(setq-default ctl-arrow 'latin-9)         ; afficher les caractères de contrôle sous la forme d'un caractère « ^ » suivi de la lettre correspondante au lieu de la forme octale.

(setq default-buffer-file-coding-system nil)  ; par defaut utilise le format Unix pour les fins de ligne
;(setq make-backup-files nil)                 ; supprimer les fichiers de sauvegarde (dont le nom se termine par ~) en quittant.

;(require 'iso-acc)  ; gestion et affichage corrects des accents

; Si cette variable est differente de 'nil', lorsque l'on est à la fin d'une ligne, le deplacement vertical du curseur s'accompagne d'un deplacement horizontal pour atteindre la fin de la ligne courante.
; Si cette variable vaut 'nil', le deplacement est strictement vertical.
(setq track-eol nil)

(setq sentence-end-double-space nil)   ; un seul espace (et non deux) marque la fin d'une phrase

; saisie universelle des caractères accentues par c-' c-` c-" + lettre (pratique pour les majuscules) "
;(define-key key-translation-map [(control ?^)] 'iso-transl-ctl-8-x-map)
(define-key key-translation-map [(control ?')] (lookup-key key-translation-map [(control ?x) ?8 ?']))
(define-key key-translation-map [(control ?`)] (lookup-key key-translation-map [(control ?x) ?8 ?`]))
(define-key key-translation-map [(control ?")] (lookup-key key-translation-map [(control ?x) ?8 ?"]))
(global-set-key [(control ?6)] (lookup-key key-translation-map [(control ?x) ?8 ?^]))
(if (eq system-type 'gnu/linux)
    (define-key key-translation-map [(control 2226)] (lookup-key key-translation-map [(control ?x) ?8]))
  (define-key key-translation-map [(control 178)] (lookup-key key-translation-map [(control ?x) ?8]))
)

(setq calendar-week-start-day 1)   ; la semaine commence le lundi
(setq display-time-24hr-format t)  ; format 24h pour l'heure
;(display-time)                     ; afficher l'heure dans la barre d'etat (format 24 heures)

; noms en clair des jours et mois apparaissant dans le calendrier
(defvar calendar-day-abbrev-array
  ["dim" "lun" "mar" "mer" "jeu" "ven" "sam"])
(defvar calendar-day-name-array
  ["dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi"])
(defvar calendar-month-abbrev-array
  ["jan" "fév" "mar" "avr" "mai" "jun"
   "jul" "aoû" "sep" "oct" "nov" "déc"])
(defvar calendar-month-name-array
  ["janvier" "février" "mars" "avril" "mai" "juin"
   "juillet" "août" "septembre" "octobre" "novembre" "décembre"])

; format de date français
(setq calendar-date-display-form '(dayname " " day " " monthname " " year))

; montrer la correspondance des parenthèses (systematiquement et non seulement après la frappe)
(require 'paren)
(setq show-paren-mode t)
(setq blink-matching-paren t)
(setq blink-matching-paren-on-screen t)
(setq show-paren-style 'parenthesis)
;(setq show-paren-style 'expression)
;(setq blink-matching-paren-dont-ignore-comments t)

; limite l'affichage de la charge système au dessus d'un certain seuil
(setq display-time-load-average-threshold 10)


; --- mise en valeur automatique ---
; les lignes suivantes activent le mode font-lock dès qu'emacs lit un fichier reconnu (note : il faut le faire pour tous les modes)
(add-hook 'c-mode-hook 'turn-on-font-lock)
(add-hook 'c++-mode-hook 'turn-on-font-lock)
(add-hook 'html-mode-hook 'turn-on-font-lock)
(add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
(add-hook 'lisp-mode-hook 'turn-on-font-lock)

; colorisation syntaxique maximale dans tous les modes
(setq global-font-lock-mode t)
(setq font-lock-maximum-decoration t)


; --- correction de la taille des indentations pour le mode java ---
(add-hook 'java-mode-hook
          '(lambda ()
             (setq c-basic-offset 2)))


; --- correction de la fonction tab pour le mode html ---
(defun tabulation ()
  (interactive)
  (insert-char ?  2))
(add-hook 'html-mode-hook
           '(lambda ()
              (local-set-key '(tab) 'tabulation)))
(add-hook 'latex-mode-hook
           '(lambda ()
              (local-set-key '(tab) 'tabulation)))


; ---------------------------------
;    chargement de bibliothèques
; ---------------------------------
; chargement des modes
(load-library "cc-mode")
(load-library "make-mode")
(load-library "psgml")
(load-library "psgml-html")
;(load-library "latex")


; ---------------------------------
;    indentation pour le C
; ---------------------------------
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
(defun my-c-mode-common-hook ()
  (c-set-offset 'substatement-open '0)
  (c-set-offset 'statement-case-open '0)
  (setq comment-start "// ")
  (setq comment-end "")
  (setq c-basic-offset 2)
  (setq c++-basic-offset 2)
  )


; ----------------------------------
;    probleme directory protected
; ----------------------------------
; http://tracker.xemacs.org/XEmacs/its/issue209
; Samba and XEmacs and read-only
(fset #'file-writable-p #'(lambda (filename)
			    (let ((filemodes (file-modes filename)))
			      (if (not filemodes)
                                  t
				(/= 0 (logand filemodes #o200))))))

La dernière mise à jour de cet article date de novembre 2013.

Le contenu de ce site est, en tant qu'œuvre originale de l'esprit, protégé par le droit d'auteur.
Pour tout commentaire, vous pouvez m'écrire à xavier.lamorlette@gmail.com.